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

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

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

  • 僵尸进程

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

#include 
#include 


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 强制杀死该进程:

Linux中进程创建、僵尸进程、孤儿进程_第1张图片
我们可以看到,直接强杀它是杀不死的,这就是“僵尸进程”这个名字由来。

  • 孤儿进程

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

你可能感兴趣的:(Linux,操作系统)