🌈前言
本篇文章进行操作系统中进程状态的学习!!!
🌷1、进程状态
🌸1.1、概念
凡是学进程,都要想到进程控制块(PCB) – task_struct
在学习OS中的进程状态时,书上的描述为了在Linux、Windows、Android中都能说的通,往往加深了理解的难度
我们可以先学习具体的Linux进程状态,然后再介绍然后再介绍OS学科的状态如何理解
操作系统是计算机中的一门“哲学”,要考虑很多情况
贴几张不同的进程状态图
🌹1.2、具体的进程状态
具体的进程状态可以分为四种:
- 运行态:进程只要被加载到运行队列中
如何理解进程被加载到运行队列中?
运行队列也是一个对象,也可以通过描述再组织进行管理
运行队列的属性其中有PCB指针,可以通过队列的性质或复杂的数据结构进行管理
调度器的主要作用是在就绪队列中选择优先级最高的任务运行,如果优先级最高的任务不止一个,则选择队头的任务运行
当运行队列中的进程被调度时,CPU会执行该进程的代码
- 终止态:进程已经终止,但还存在,只是永远不运行了,随时等待被释放
进程都已经终止了,为什么不立刻释放资源,而要维护一个终止态呢?
因为释放进程的资源需要时间
CPU不可能一直盯着这个进程,可能还会在做其他事情,所以要维护一个终止态
例子:比如你去吃饭,吃完后,叫老板结账,老板可能没回应你,他可能在给别人点餐
- 阻塞态:进程在等待某种资源时(非CPU资源),资源没有就绪的时候,该进程会到对应的资源等待队列中进行排队,该进程的代码并没有运行,就叫做"阻塞态"
一个进程在被CPU执行的时候,用的不仅仅是CPU的资源
进程可能申请更多的资源,如:磁盘、网卡、显卡、显示器资源和声卡资源等等…
申请对应的资源无法满足时,是需要排队的,比如:CPU资源在运行队列中排队
申请其他慢设备的资源在对应的队列中进行排队
- 挂起态:当内存不足时,OS会将短期内不会被调度的进程的数据和代码挪动到磁盘中的swap分区,当内存足够时,会重新加载到内存中
🍀1.3、Linux进程状态
Linux内核源代码中的状态
/*
* 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 */
};
R (running)运行状态:进程是在运行中或在运行队列中
S (sleeping)睡眠状态:意味着进程在等待事件完成(这里的睡眠有时候也叫做可中断睡眠)
D磁盘休眠状态(Disk sleep)有时候也叫不可中断睡眠状态(uninterruptible sleep),在这个状态的进程通常会等待IO的结束
T停止状态(stopped): 可以通过发送 SIGSTOP 信号给进程来停止(T)进程。这个被暂停的进程可以通过发送 SIGCONT 信号让进程继续运行
X死亡状态(dead):这个状态只是一个返回状态,你不会在任务列表里看到这个状态