僵尸进程---孤儿进程

进程

基本概念

进程:可执行程序 +管理该进程的数据结构集合
进程控制块(PCB):进程属性的集合

进程创建(fork)
在这里插入图片描述

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
    
    
int ret = fork();
printf("hello proc : %d!, ret: %d\n", getpid(), ret);
sleep(1);
return 0;
}

由于PCB里的程序计数器存储的是即将被执行的下一条指令的地址,故在执行完fork()语句之后,子进程从父进程拷贝过来的代码直接从fork语句的下一条语句执行

相关命令

  • 查看进程
    在这里插入图片描述
  • 获取本进程PID,和父进程PID
    在这里插入图片描述
  • 杀死进程指令
    在这里插入图片描述

僵尸进程

概念:

所谓僵尸进程,是指子进程先于父进程退出,子进程会告知父进程自己退出的消息,但是父进程不予理会,导致该子进程变成了僵尸进程

测试案例与结果:
在这里插入图片描述

S+表示睡眠状态
R+表示运行状态
Z+表示僵死状态

僵尸进程危害

占用了操作系统的资源,内存泄露掉了

解决僵尸进程方法

  • 重启操作系统(代价太大)
  • 杀掉父进程,子进程就会被init进程所领养,init进程回收子进程的资源。(该方法不推荐,因为杀掉父进程会影响到该父进程下的其它子进程的运行)。
  • 进程等待。(被推崇的优雅方式)

孤儿进程

概念:

所谓孤儿进程是指父进程先于子进程退出,子进程被init进程所领养,该子进程便变成了孤儿进程。(进程是没有孤儿状态的

测试案例与结果

在这里插入图片描述

可以看出父进程先于子进程结束后,子进程被一号进程(init进程)所领养,故由一号进程回收喽。

问题引入:

#include <stdio.h>
  2 #include <unistd.h>
  3 int main()
  4 {
    
    
  5     int i=10;
  6     int ret=fork();
  7     if(ret<0)
  8     {
    
    
  9         return 0;
 10     }
 11     else if(ret==0)
 12     {
    
    
 13         printf("child.  i=%d,%p\n", i, &i);
 14     }
 15     else
 16     {
    
    
 17         i += 10;
 18         printf("father.  i=%d,%p\n", i, &i);
 19     }
 20     return 0;
 21 }

在这里插入图片描述
(为什么父进程的 i 和子进程的 i 地址一样,值却不一样呢?

这就是写时拷贝的原理:
https://blog.csdn.net/qq_44768163/article/details/115054802

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_44768163/article/details/115014661