Linux——进程基本概念僵尸进程与孤儿进程

Posted 一棵灬胡杨树

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux——进程基本概念僵尸进程与孤儿进程相关的知识,希望对你有一定的参考价值。

文章目录


前言

此文章初步探究一下进程的基本概念,以及僵尸进程与孤儿进程,后续还会对进程有更加深入的学习。

一、进程基本概念

PCB:进程控制块(struct task_struct),初步包含了一下几个模块:

  1. PID
  2. 进程状态
  3. 程序计数器:保存程序即将要运行的下一条指令
  4. 上下文信息:保存的是寄存器当中的数据
  5. 内存指针:指向进程地址空间的指针
  6. 记账信息:CPU使用时长,IO的使用以及内存的占用情况。
  7. I/O状态信息:包含显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表。

1.1 程序计数器在Linux下的样子:


首先写一个非常easy的程序,我们开始gdb,在程序的第4行打下断点,让程序run起来,然后输入disassemble,我们可看到下面这张图:

我们可以看到有一个箭头指向了"0x00000000004004f1 <+4>: movl $0xa,-0x4(%rbp)"这就是程序即将要执行的下一条指令(我们先不关心这个程序到底干了什么,这里面有寄存器和它的偏移量以及汇编指令)。在gdb时候我们一般用n来逐过程,但是要调试汇编指令时候,我们需要用"ni"来调试,如图:

Q:为什么程序计数器里面要保存下一条指令呢?
答:因为当我们只有1核(也就是只有一个CPU时)多个进程时,某些时候,我们的进程可能拿不到CPU资源,当进程再次拿到CPU资源的时候,操作系统必须得知道该从哪继续执行指令,所以程序计数器里必须保存下一条指令。

1.2 上下文信息

当程序执行到绿色箭头所指向的那一行时,当此进程被其他进程站区资源而再次获取到CPU资源的时候,我们已经知道即将要执行"=>“命令,但是系统是如何知道”%edx和%eax"这两个寄存器里面的值呢?这就引出了PCB另一个模块,上下文信息。

通过以上例子我们就不难得出,上下文信息里面保存的是寄存器里面的数据。

1.3 内存指针

对于内存指针,学习过c/c++的过程中时常提到"程序地址空间"这个词,和PCB里的内存指针基本相同,只不过命名为进程地址空间。

二、进程创建

所谓的进程创建就是让进程再去创建出来一个子进程:

  1. getpid():获取进程的PID,是谁调用的就获取谁的。
  2. getppid():获取进程的父进程的PID,谁调用获取谁的父进程ID
  3. pid_t fork(void):(1)没有参数,有返回值,属于系统调用函数。
    (2)返回值有两个:一个返回给父进程,一个返回给子进程。

当进程创建失败的时候返回-1
当进程创建成功的时候才有2种返回值:
4. ==0时,返回给子进程
5. >0时,返回给父进程

下面我们来看看基本的例子:

上述程序执行的结果为:

回答2个问题:

  1. 子进程到底是从fork这行代码开始运行,还是从fork之后的代码开始运行?为什么?
    答:当父进程在执行完fork指令的时候,程序计数器保存的是fork之后下一条即将执行的指令。当子进程拷贝父进程的PCB时,自然也就将程序计数器的信息拷贝走了,所以子进程是从fork这行代码之后开始运行的。

2.到底是子进程先运行还是父进程先运行?
答:不确定,因为只有一个CPU多个进程的时候,是抢占式运行的。

三、僵尸状态和僵尸进程

3.1 🧟‍♂️进程的模拟

所谓的僵尸进程就是让父进程死循环并且子进程退出。在这时候父进程如果不调用wait()或者waitpid()接口的,对子进程的状态不关心,这样导致了子进程的资源没有被释放,形成一种🧟‍♂️(僵尸进程)。

下面我们来模拟一下:

测试结果为:

3.2 🧟‍♀️的危害(僵尸进程的危害)

僵尸进程不工作,但是会浪费掉系统资源(除了1号进程):由于父进程没有尽职尽责,对子进程的状态视而不管,导致子进程没有被及时回收,成为僵死状态,浪费资源。

3.3 如何处理

  1. 重启操作系统(ps:老实说,这种方法很简单,but多多少少有点脑残)
  2. 使用kill命名干掉父进程:不推荐这么搞,因为子进程会被1号进程领养,1号进程回收子进程的资源。我们所举的例子父进程只有一个子进程,如果子进程有好几个,把父进程kill了,有可能其他的子进程就出问题了。
  3. 进程控制——进程等待。

四、孤儿进程

所谓的孤儿进程就是父进程先于子进程退出,子进程就没了爹,成了孤儿进程,被1号进程所领养了(1号进程会回收子进程的资源)

下面我们测试一下:

Notes:没有孤儿状态这一说法!!

以上是关于Linux——进程基本概念僵尸进程与孤儿进程的主要内容,如果未能解决你的问题,请参考以下文章

020_Linux的孤儿进程与僵尸进程(Unix系统编程)

孤儿进程与僵尸进程

Linux——进程概念进程创建僵尸进程孤儿进程环境变量程序地址空间详解

Linux——进程概念进程创建僵尸进程孤儿进程环境变量程序地址空间详解

Linux——进程概念进程创建僵尸进程孤儿进程环境变量程序地址空间详解

Python Web学习笔记之并发编程的孤儿进程与僵尸进程