在本文所在专栏的上一篇文章里,我们已经介绍过了什么叫做pcb,那么接下来我们需要对pcb一些的相关信息进行逐一介绍。
1.pcb中的描述信息
pcb中常见的描述信息:
- pid--标识符
- 内存指针:程序数据在内存中的地址;
- 上下文数据:程序计数器…
- 进程状态
- IO信息
- ……
我们便是根据如上:pcb中的描述信息来对操作系统中的进程来进行管理和调度。
2.进程状态
在了解进程状态之前,我们首先需要明白什么叫做状态。
状态其实就是当前进程的一种模式,状态会标记当前的进程该如何被操作系统进行调度处理,通俗来讲便是,状态标识了一个进程什么模式该做什么事情。
进程状态便是标记了一个程序运行的状态,让系统进行程序调度更加合理。
在Linux中的进程状态分为这五种:
- 运行态-R:正在被执行,以及拿到时间片后即可就能执行的进程;
- 前台进程-R+:占据一个终端的进程;
- 后台进程:就是没有关联的进程;
- 可中断休眠态-S:一种阻塞态,因为某种运行条件不满足,而暂时不能被调度运行的进程状态,比如sleep(3);
- 不可中断休眠态-D:无法被中断打断阻塞,只能等待阻塞的唤醒条件满足后才能被调度执行;
- 停止态-T:什么都不能做,不会被中断,不会被唤醒;
- 僵尸态:进程退出运行,但是资源没有完全被释放,等待处理的一种状态。
对于僵尸态,我们做进行一步讨论,我们需要明报明白什么叫做僵尸进程。
僵尸进程:即是出处于僵尸态的进程,是一种退出了,但是资源没有完全被释放的进程。
当一个程序运行结束之后,我们需要了解程序功能完成的效果,这便是进程返回值的作用,即让我们清楚程序功能实现程度。
所以当一个进程结束之后,它也会存在结束原因,即一定的返回值。我们需要了解这个返回值的大小,因此这便需要在我们对程序结束原因处理之前,我们并不希望它的资源立马被释放。
这便是僵尸进程出现的原因,即我们需要了解进程的结束原因。所以进程退出之后,在它的家属进程处理之前,该进程所占据的资源并不能被释放。
只有被该进程的父进程处理之后,获取了退出返回值,它才能够释放资源。
这里我们介绍一个接口:pid_t fork(void) -- 通过复制调用进程(父进程),来创建一个新的进程(子进程)。返回值:在父进程中返回了子进程的pid(大于0);在子进程中年返回0;失败则返回-1。
来对上述内容进行一个展示。
对于上述代码,“shi jie”的打印是2次,“ni hao”的打印只有1次,父子进程对应返回值的打印都各有1次。
这是有因为对于子进程而言,第一条打印语句虽然也存有,但是其赋值了程序计数器,所以只有下面创建子进程成功之后才会开始运行。
“shi jie”的打印为两次,是因为第二条打印语句被执行了两次,即两个进程都运行了这一句代码。
小结:
僵尸进程:是子进程先于父进程退出,为了保存退出原因,因此退出后资源没有完全释放成为了僵尸进程;
孤儿进程:是父进程先于子进程退出,子进程成为孤儿进程。
在了解僵尸进程之后,我们需要明白僵尸进程所存在的危害:资源泄露(资源没有完全被释放)。
该如何来避免这样的问题,做出的回答是“进程等待。”
进程等待:等待子进程退出,获取退出子进程的返回值,释放子进程资源,避免僵尸进程的产生。
因为僵尸进程存在的原因就是为了保存退出原因交给父进程,只有父进程获取了退出原因,资源才会被释放。