【Linux从入门到放弃】进程概念、查看进程、创建进程

这篇具有很好参考价值的文章主要介绍了【Linux从入门到放弃】进程概念、查看进程、创建进程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

🧑‍💻作者: @情话0.0
📝专栏:《Linux从入门到放弃》
👦个人简介:一名双非编程菜鸟,在这里分享自己的编程学习笔记,欢迎大家的指正与点赞,谢谢!

【Linux从入门到放弃】进程概念、查看进程、创建进程,LINUX从入门到放弃,linux,服务器,数据库


前言

  那在还没有学习进程之前,就问大家,操作系统是怎么管理进行进程管理的呢?很简单,先把进程描述起来,再把进程组织起来!


一、什么是进程?

  我们之前任何启动并运行程序的行为,都是操作系统帮助我们将程序转化为进程,完成特定的功能。

1.1 进程初探索

【Linux从入门到放弃】进程概念、查看进程、创建进程,LINUX从入门到放弃,linux,服务器,数据库
  比如说咱们写了一段代码,并生成了一段可执行程序存放在磁盘中,可执行程序的本质就是一个普通的二进制文件,包括文件内容和文件属性

文件内容: 自己写的代码以及相应的数据
文件属性:文件的创建时间、权限、类型等等

【Linux从入门到放弃】进程概念、查看进程、创建进程,LINUX从入门到放弃,linux,服务器,数据库

  在Linux中,当我们生成一段可执行程序(a.out)并通过 ./ 的方式将其加载到内存当中,之后CPU便可从内存中拿到该文件的代码和数据执行。那么把代码和数据放到内存中就是进程了吗?

  举个例子:我们把磁盘比作社会,内存比作学校,那么怎么一个人就可以称为一个学校的学生呢?难道就从社会上找一个人把他放到学校里面就成为了该学校的学生了吗?当然不是,学校里面还有食堂阿姨和保安大叔呢,难道他们也是学生?所以说,你是不是学生最关键的是你的基本信息在不在学校的学籍管理系统中,也就意味着学校能不能管理你。

1.2 进程管理的建模

  当然,在磁盘当中肯定有多个执行程序,它们对应的数据和代码也都被加载到内存当中,那么操作系统就一定要想办法将这些数据和代码管理起来,也就是操作系统要将进程管理起来。那如何管理呢?先描述,再组织。
  因此每当一个可执行程序加载到内存中时,在操作系统内核里都要为每一个进程在加载到内存之时操作系统都要在内核里创建一个数据结构对象。操作系统里叫 PCB,在 Linux 中叫 task_struct,task_struct 是 PCB的一种。在这个结构体里包含着关于这个进程的所有属性,当然肯定包含一个指针,指向内存中的数据和代码,每当加载一个可执行程序到内存中,操作系统都会为其创建一个task_struct结构体。这样的过程就像当时先描述。
【Linux从入门到放弃】进程概念、查看进程、创建进程,LINUX从入门到放弃,linux,服务器,数据库

  再组织就是理解为在task_struct的属性里面再有一个结构体指针将每个结构体连接起来。当一个进程时间片走完就通过遍历的方式找下一个优先级高的进程交给CPU执行。

1.3 task_ struct 的内容

标识符: 描述本进程的唯一标示符,用来区别其他进程。
状态: 任务状态,退出代码,退出信号等。
优先级: 相对于其他进程的优先级。
程序计数器: 程序中即将被执行的下一条指令的地址。
内存指针: 包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针
上下文数据: 进程执行时处理器的寄存器中的数据[休学例子,要加图CPU,寄存器]。
I/O状态信息: 包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表。
记账信息: 可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。
其他信息

1.4 概念

  进程:内核关于进程的相关数据结构+当前进程的数据和代码。

二、进程属性

2.1 查看进程

#include <stdio.h>
#include <unistd.h>

int main()
{
    while(1)
    {
        printf("process running!\n");
        sleep(1);
    }
    return 0;
}
  1. 当我们写了这样的程序并运行,我可通过这样的方式查看进程的相关信息:ps axj | head -1 && ps axj | grep myprocess
    【Linux从入门到放弃】进程概念、查看进程、创建进程,LINUX从入门到放弃,linux,服务器,数据库
      主要我们现在就是可以看到这个进程的PID为15560,当将这个代码执行两次(看下图)发现就会出现两个不同的进程,PID分别为16187和161198,这就是把这段代码和数据从磁盘中拿了两次到内存中,各自有各自的task_struct。
    【Linux从入门到放弃】进程概念、查看进程、创建进程,LINUX从入门到放弃,linux,服务器,数据库

  2. 除了用ps这样的指令查看已经启动起来的进程之外,还可以通过这种方式来查看:ls /proc—查看根目录下的proc目录。
    【Linux从入门到放弃】进程概念、查看进程、创建进程,LINUX从入门到放弃,linux,服务器,数据库
      通过上图可以看到当前两个进程PID分别为19645和19650,而它们对应地出现在了proc的目录下,也就是说,每当创建好了一个进程之后,系统就会自动的在proc的目录下创建一个文件夹,以新增进程的PID命名。
      可以就进入到对应的目录下cd /proc/19645,此时就能查看到相关的属性信息,大多数其实我们都不太认识,有两个还是知道的,我已经框出来了,分别是指定文件的路径(exe)和可执行程序对应的路径(cwd)
    【Linux从入门到放弃】进程概念、查看进程、创建进程,LINUX从入门到放弃,linux,服务器,数据库
    若此时将这个进程终止掉,那么系统中就不会存在进程ID值。
    【Linux从入门到放弃】进程概念、查看进程、创建进程,LINUX从入门到放弃,linux,服务器,数据库
    而在这进程目录下也是无法查看任何信息的。
    【Linux从入门到放弃】进程概念、查看进程、创建进程,LINUX从入门到放弃,linux,服务器,数据库

2.2 通过系统调用获取进程标识符

  我们区分不同的进程主要是看它们的进程标识符(PID),因为进程标识符可以唯一的标识一个进程

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
int main()
{
    while(1)
    {
        printf("process running!, pid:%d\n",getpid());
        sleep(1);
    }
    return 0;
}

  可以通过geipid()的方式获取某个进程的PID,并且每当ctrl+c结束进程并重新执行该程序,它的PID都是不同的,这就相当于你考上了一个大学,有自己的学号,但是你不满意退学重新考了一年,结果又来到了这个学校,那当然你的学号是新的,不会因为你曾经来过就会将这个学号一直留给你。

【Linux从入门到放弃】进程概念、查看进程、创建进程,LINUX从入门到放弃,linux,服务器,数据库

getpid()是获取当前进程的PID,而getppid()是获取当前进程的父进程的PID。

printf("process running!, pid:%d, ppid:%d\n",getpid(),getppid());

【Linux从入门到放弃】进程概念、查看进程、创建进程,LINUX从入门到放弃,linux,服务器,数据库
  但是发现了一个问题,为什么每次叉掉进程重新执行PID是变化的,但是PPID不变,这是为什么,而这个进程的父进程是什么呢?

【Linux从入门到放弃】进程概念、查看进程、创建进程,LINUX从入门到放弃,linux,服务器,数据库
结论:

  1. 我们发现它的父进程的名字叫bash,它是一个命令行解释器,本质是一个进程。
  2. 命令行启动的所有程序,最终都会变成进程,而该进程对应的父进程都是bash

2.3 创建进程

  我们写的代码在运行时就变成了一个进程,但是系统担心代码有错误于是让bash将你的代码创建为自己的子进程,哪怕你的代码有错误只会影响bash而不会影响系统,可是bash是通过怎样的方式创建的进程呢?
  在Windows环境下,我们点击.exe文件或双击快捷方式,系统都会创建相应的进程;在LInux环境下,我们 ./ 可执行程序就是将程序变为进程去运行。
  那么可以在代码层面创建子进程呢?当然有的:fork()

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
int main()
{
	printf("1111111111111111111111111\n");
	fork();                                           
	printf("2222222222222222222222222\n");
	return 0;
}

【Linux从入门到放弃】进程概念、查看进程、创建进程,LINUX从入门到放弃,linux,服务器,数据库
  运行这段代码发现 “222222…” 被打印了两次,这也就说明了这行代码被执行了两次。

printf("2222222222222222222222222 pid:%d, ppid:%d\n",getpid(),getppid()); 

  通过这行代码发现这两行代码是被不同(两个)的进程执行的,下面进程的PID为16433,PPID为16432;上面进程的PID是16432,说明了上面对应的进程是下面对应进程的父进程。

【Linux从入门到放弃】进程概念、查看进程、创建进程,LINUX从入门到放弃,linux,服务器,数据库
  当我们在 “111111…” 也打印出对应的PID和PPID,发现这一行代码是父进程执行的。在这里面就出现了父子进程,而这个里面父进程的父进程是谁呢?bash。这也就相当于出现了爷孙三代!同时也证明了在fork之后出现了两个执行流,一个是父进程的,一个是子进程的。至于父进程先执行还是子进程先执行完全取决于操作系统,并没有固定的先后顺序。

【Linux从入门到放弃】进程概念、查看进程、创建进程,LINUX从入门到放弃,linux,服务器,数据库
【Linux从入门到放弃】进程概念、查看进程、创建进程,LINUX从入门到放弃,linux,服务器,数据库
  这是关于fork函数返回值的介绍:如果成功,则在父进程中返回子进程的PID,子进程中返回0。如果失败,在父进程中返回-1,没有创建子进程,并且errno被适当地设置。

pid_t ret = fork();
printf("2222222222222222222222222 pid:%d, ppid:%d,ret:%d,&ret:%p\n",getpid(),getppid(),ret,&ret);

【Linux从入门到放弃】进程概念、查看进程、创建进程,LINUX从入门到放弃,linux,服务器,数据库
在这里有两点疑惑:

  1. 一个函数为什么会有两个返回值呢?
  2. 相同的地址里存放的数据为什么不一样呢?

现在可针对于第一个问题作出回答:就是因为在fork之后出现了两个执行流,而这两个执行流是同时进行的,互不干扰的。frok 之后的代码是共享的,通常是通过 if 和 else if (fork函数的返回值)来进行分流的。

总结:

  1. fork做了什么?
    每一个进程都有自己的内核数据结构(PCB)和进程的代码、数据。当fork了之后,操作系统会为子进程创建一份PCB,但是代码和数据父子进程是共享的,两个PCB会指向同一份代码数据。
  2. fork如何看待代码和数据呢?
    进程在运行的时候,是具有独立性的,就相当于你电脑关掉了网易云音乐,但是并不会影响你的QQ。而父子进程在运行的时候也是一样的,当它两同时运行时你杀掉其中一个进程不会影响另一个进程。你可以做这样的实验,定义一个全局变量,在父进程里对这个变量重新赋值。根据打印的结果可以发现会打印出两个不同的数值。
    对于进程的数据和代码来说,代码是只读的;数据是当一个执行流尝试修改数据的时候,操作系统会自动给当前进程触发写时拷贝,当要对数据修改时重新在内存申请一块空间存放修改后的数据而不去影响原来的数据。
  3. 如何理解两个返回值问题?
    每当一个函数准备执行 return 的时候,这个函数的主体功能已经完成。所以在执行 fork 函数时,操作系统会先给子进程创建PCB,然后将其放在某个队列或链式结构中让操作系统进行管理。当主体功能完成时就要执行 return 语句,此时就会走向两个执行流并返回两个值。

总结

以上算是对进程相关知识的初步认识,后续还有更多内容继续学习,感谢大家支持并希望大家也可以根据这篇博客提出一些宝贵的意见或者讨论看法。文章来源地址https://www.toymoban.com/news/detail-530062.html

到了这里,关于【Linux从入门到放弃】进程概念、查看进程、创建进程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Linux】进程概念,轻松入门【上篇】

    目录 一, 冯* 诺依曼体系结构 1,存储结构 ​编辑 二, 操作系统  1,概念 2,设计OS的目的 3,定位 4,如何理解 \\\"管理\\\" 5, 总结  三,进程 1. 概念  那么如何区分进程  程序? 2. PCB —— 描述进程 3. 组织进程 补充: cwd  4.  task_struct ——PCB  (1) PID——标识符 5.父子进程

    2024年02月13日
    浏览(39)
  • 【Linux从入门到精通】进程的基本概念

        我们通过对上篇文章冯诺依曼体系结构对硬件进行讲解后, 本篇文章会对进程进行深入讲解。同时会讲解PCB(进程控制块)。希望本篇文章内容会对你有所帮助。 文章目录 一、再次理解操作系统 1、1 操作系统的作用 1、2 操作系统的管理 二、进程基本的概念 2、1 什么是

    2024年02月05日
    浏览(33)
  • linux入门之进程控制(上)进程创建,进程等待

    目录 一、进程创建 1.fork函数 2.fork函数返回值 3.写时拷贝 4.fork常规用法 5.fork调用失败原因 二、进程终止 1.进程退出场景 2.进程常见退出方法 2.1_exit函数(直接调用内核) 2.2 exit函数 2.3return退出 三、进程等待 1.进程等待必要性 2.进程等待方法 2.1 wait方法 2.2 waitpid方法 2.3获取

    2024年02月12日
    浏览(39)
  • 【Linux从入门到精通】一文带你理解进程概念

        我们通过对上篇文章冯诺依曼体系结构对硬件进行讲解后, 本篇文章会对进程进行深入讲解。同时会讲解PCB(进程控制块)。希望本篇文章内容会对你有所帮助。 文章目录 一、再次理解操作系统 1、1 操作系统的作用 1、2 操作系统的管理 二、进程基本的概念 2、1 什么是

    2024年02月04日
    浏览(33)
  • 【看表情包学Linux】进程优先级 | 查看系统进程 | 优先级修改 | 进程的切换 | 竞争性与独立性 | 并行并发的概念 | 环境变量

       🤣  爆笑 教程  👉 《看表情包学Linux》👈   猛戳订阅     🔥 ​ 💭 写在前面: 我们先讲解进程的优先级,探讨为什么会存在优先级,以及如何查看系统进程、进程优先级的修改。然后讲解进程的切换,首次介绍进程的竞争性、独立性,以及并行和并发的概念,在通

    2024年01月19日
    浏览(32)
  • [入门篇]Linux操作系统fork子进程的创建以及进程的状态 超超超详解!!!我不允许有人错过!!!

    目录 0.前言 1.fork()创建子进程讲解 1.1fork()的简单介绍 1.2 创建子进程详解 1.2.1 如何理解fork创建子进程 1.2.2 子进程的PCB以及子进程的代码和数据 1.2.3为什么要共享写时拷贝 1.2.4 什么时候发生写时拷贝 1.3 fork函数返回值详解 1.3.1引入fork返回值的作用 1.3.2 fork返回执行逻辑剖析

    2024年03月21日
    浏览(44)
  • 【Linux从入门到放弃】Linux操作系统环境变量一文详解

    🧑‍💻作者: @情话0.0 📝专栏:《Linux从入门到放弃》 👦个人简介:一名双非编程菜鸟,在这里分享自己的编程学习笔记,欢迎大家的指正与点赞,谢谢!   提到环境变量,大家应该都不会陌生,不管学习Java还是Phython都需要去安装环境变量,尤其是我自己在做深度学习

    2024年02月05日
    浏览(42)
  • 大数据入门到放弃第一天:linux的入门

            虚拟机(Virtual Machine,简称VM)是一种在物理计算机上模拟运行的软件实体。它通过虚拟化技术,将一台物理计算机划分为多个虚拟的逻辑计算环境,每个环境都可以独立运行操作系统和应用程序。         虚拟机使得一台物理计算机可以同时运行多个操作系

    2024年02月05日
    浏览(30)
  • 【Linux笔记】Linux进程概念与进程状态

    进程的概念: 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序

    2024年02月06日
    浏览(29)
  • 【Linux进程篇】进程概念(1)

    作者:爱写代码的刚子 时间:2023.7.30 前言:操作系统和软硬件的关系就相当于管理者和被管理者的关系,管理者并不需要见到被管理者,通过执行者拿到对应数据,通过对数据的管理来达到管理的目的。==对软硬件的管理最后一定会变成对某种数据结构的增删查改。==本篇博

    2024年02月14日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包