🌟hello,各位读者大大们你们好呀🌟
🍭🍭系列专栏:【Linux初阶】
✒️✒️本篇内容:进程状态的概念,进程状态在普遍操作系统层面和Linux层面的理解,Linux常见进程状态,进程状态的两种查看方法,ls>makefile指令,makefile$@^特殊符号的应用方法展示,僵尸进程和孤儿进程的讲解
🚢🚢作者简介:计算机海洋的新进船长一枚,请多多指教( •̀֊•́ ) ̖́-
目录
一、进程状态
进程状态有很多,运行、挂起、阻塞、死亡等都属于进程状态。进程那么多状态,实际上都是为了满足不同的运行场景。我们可以从普遍的操作系统层面和Linux层面两个层面去理解。在深入学习进程状态的知识前,我们先要了解几个重要的概念。
- 一个CPU有一个运行队列
- 让进程进入队列,本质:将该进程的task_struct结构体对象(PCB)放到运行队列中,而不是将进程对应的代码放到运行队列中
- 进程在runqueue(运行队列)中,就是R,而不是说这个程序在运行,才是运行状态;进程状态是对PCB属性的描述,因此状态的数据也储存在内存中
- 不要以为你的进程只占用CPU资源,也有可能它需要占用外设资源,更进一步可能造成资源浪费(当大量进程需要和外设交互,而外设只能执行一个进程的时候)
- 所谓进程的不同状态,本质是进程在不同队列中等待某种资源!
1.普遍操作系统层面理解
(1)运行状态
一个CPU有一个运行队列,让进程进入队列,进程在runqueue(运行队列)中,就是R(运行状态),而不是说这个程序在运行,才是运行状态。
注意:进程在运行队列中,本质上是PCB在运行队列中,CPU可以根据PCB找到对应的进程。
(2)阻塞状态
将某个进程从运行队列中剥离下来,放到硬件的等待队列中,进程的状态就变为阻塞状态了。待进程完成与硬件的交互任务或者有需要时,先将进程状态重新变为运行状态,再将进程控制块(PCB)返回运行队列。
(3)挂起状态
为了更好的利用计算机资源,当内存中存在大量进程的时候,操作系统会将部分不需要立即调度的代码和数据暂时保存在磁盘上。这样,就可以实现内存空间资源的充分利用。
将进程的相关数据,加载或保存到磁盘,此时的进程状态被称为挂起状态。待有需要时,会先将进程状态重新改为运行状态,再将进程控制块(PCB)返回运行队列。
阻塞 vs 挂起 :阻塞不一定挂起,挂起一定阻塞!因为阻塞不一定会将PCB加载到磁盘,它也可以放到其它硬件的等待队列中,但是加载到磁盘后PCB一定在磁盘的等待队列中。
(4)状态合作
操作系统通过调整进程状态,充分调度计算机软硬件资源,实现计算机的高效运转。例如,当下我们的计算机可以同时运行多个程序,就是CPU配合操作系统在1s内将多个进程运行多次(CPU计算速度非常快),随时间对不同进程进行重复运行,才得以实现的。
2.Linux层面理解
下面的状态在kernel源代码里定义:
/*
* The task state array is a strange "bitmap" of
* reasons to sleep. Thus "running" is zero, and
* you can test for combinations of others with
* simple bit tests.
*/
static const char * const task_state_array[] = {
"R (running)", /* 0 */
"S (sleeping)", /* 1 */
"D (disk sleep)", /* 2 */
"T (stopped)", /* 4 */
"t (tracing stop)", /* 8 */
"X (dead)", /* 16 */
"Z (zombie)", /* 32 */
};
(1)R运行状态(running)
- 并不意味着进程一定在运行中,它表明进程要