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:没有孤儿状态这一说法!!

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值