Linux中进程创建、僵尸进程、孤儿进程

操作系统的主要功能是对系统中的所有进程实施有效的管理,它具有创建新进程、撤销已有进程、实现进程状态转换等等功能。
在操作系统中,一般把进程控制用的程序段称为原语,原语的特点是执行期间不允许中断,它是一个不可分割的基本单位。

  • 进程的创建
  1. 程序从硬盘中加载到内存中,操作系统为新进程分配一个唯一的进程标识号,并申请一个空白的PCB,若申请失败,则创建失败。失败原因:(1)大于用户可以创建的进程最大数;(2)系统内存不足
  2. 操作系统为进程分配资源,为新进程的程序和数据、以及用户栈分配必要的内存空间(PCB中均有体现)。如果资源分配不足(例如:仅有内存空间分配不足),并不会创建失败,而是出于“等待状态”或者是称为“阻塞状态”,并等待这个资源。
  3. 初始化PCB,主要包括初始化标志信息、初始化处理机状态信息和初始化处理机控制信息,以及设置进程的优先级等。
  4. 如果进程就绪队列可以容纳新的进程,就将新进程插入到就绪队列,等待被CPU调度运行。

父进程创建子进程之后,子进程先于父进程退出,操作系统检测到进程退出,通知父进程,但是父进程没有对子进程进行处理,也没有关注这个通知,这个时候操作系统为了封锁现场(封锁子进程运行的情况),不会释放子进程资源,因为子进程的PCB中包含退出的原因,这个时候因为子进程既没有运行,也没有完全退出,因此处于将死状态,这种进程就是—僵尸进程。

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


int main()
{
    pid_t pid = fork();
    if(pid < 0){
        printf("进程创建失败!");
    }
    else if(pid == 0){
        printf("我是子进程!!!pid:%d\n", getpid());
    }
    else{
        printf("我是父进程!!!我的进程id:%d 我的儿子进程id: %d\n", getpid(), pid);
        sleep(1000);    //保证子进程运行完后先于父进程退出
    }
    printf("hello world\n");
    return 0;
}

在这里插入图片描述
我们尝试使用kill -9 强制杀死该进程:

在这里插入图片描述
我们可以看到,直接强杀它是杀不死的,这就是“僵尸进程”这个名字由来。

  • 孤儿进程

父进程创建子进程后,先于子进程退出,这时候子进程没有了父进程,这个进程就成为了孤儿进程,但是子进程必须把自己的运行终止结果的状态告诉
自己的父进程,那这个时候父进程已经退出了怎么办呢?这个时候对于所有的父进程已经终止的所有进程,这时候会由 init 进程“收养”它们。这时候
这些进程的父进程就变为了 init 进程。其中的操作大致为:一个进程终止时,内核逐个检查所有活动进程,以判断它是否是正要终止进程的子进程,如果是,
该进程的父进程ID就变为1(init的进程ID)。init 进程是一个负责任的“养父”,会将每一个收养的子进程都养老送终!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值