进程状态总结
什么是进程状态?
在操作心态中,进程状态是PCB(tast_struct)上的一个整数,用来表示当前进程是运行,阻塞还是挂起状态。

进程状态分类:
进程状态通常分为 运行、阻塞 和 挂起 三种主要状态。
1. 进程的运行状态
运行状态 表示进程正在CPU上执行指令。
对于一个进程而言,如果它的PCB(进程控制块)被放入操作系统的调度队列 中,并且被CPU调度执行,那么此时该进程就处于运行状态。

2. 进程的阻塞状态
阻塞状态 表示进程因为等待某些资源或事件而暂时无法继续执行。
例如,在C/C++中,当程序执行到scanf或cin时,如果用户没有输入数据,进程就会进入阻塞状态,等待键盘输入完成。

3. 进程的挂起状态
挂起状态 是一种极端情况,通常发生在内存资源严重不足时。
当内存不足时,操作系统会将某些不常用的进程(通常是阻塞状态的进程)的代码和数据 从内存移动到磁盘的Swap分区 (交换空间),仅保留PCB在内存中。这个过程称为唤出(Swap Out) 。

当挂起的进程需要重新执行时,操作系统会将其代码和数据从Swap分区重新加载到内存中。这个过程称为唤入(Swap In) 。

所以通过上图的理解,对进程状态的管理,其实就可以转化为对链表的管理,进程的状态变化,本质是在不同的队列中进行流动,本质都是对数据结构的增删查改。
理解内核数据结构
在我们以前写的list这些双链表中,我们的prev以及next指针都指向一个列表的首地址。而在PCB中不是,PCB的prev和next其实是被封装了,
在PCB中有一个struct结构体,我们先暂称为list_head,这个结构体里就存放着prev和next,然后next就指向下个PCB的next,prev就指向上个PCB的prev,而不是指向首字节,对于为什么要这么操作,是因为在操作系统在,task_struct里存放着许多list_head。这样就使得,一个PCB就可以同属于多种数据结构.
struct list_head
{
struct list_head *prev;
struct list_head *next;
};
为什么使用list_head?
灵活性:
一个task_struct可以包含多个list_head结构体,每个list_head可以用于不同的链表(如运行队列、阻塞队列等)。 这样,一个PCB可以同时属于多个数据结构,而不需要为每种数据结构单独定义链表指针。
高效性:
当需要将一个PCB从一个队列移动到另一个队列时(如从运行队列移动到阻塞队列),只需要操作list_head的prev和next指针,而不需要修改PCB的其他部分。
通用性:
list_head的设计是通用的,可以用于任何需要链表结构的场景,而不仅限于PCB。
比如此时有一个PCB需要从运行状态变成阻塞状态,那么我们只需要断开运行队列的列表,将此PCB链入阻塞队列的链表。

所以在操作系统中,一个进程的结构体,可以同时属于多种类型的数据结构。
Linux中的进程状态
在Linux操作系统中,进程的状态通常用一些字母来表示,例如 R、S、D、T、t、X、Z 等。这些状态反映了进程在系统中的当前行为。
R状态:
进程正在CPU上执行指令(Running)。 或者进程已经准备好运行,正在等待CPU调度(Runnable)。 在多任务操作系统中,由于CPU时间片的分配,进程可能会在运行和就绪状态之间频繁切换。
S状态:
含义:进程处于睡眠状态(可中断睡眠)。 详细说明: 进程正在等待某个事件或资源(如I/O操作完成、信号量释放等)。 这种睡眠状态是可中断的,即进程可以被信号(signal)唤醒


t状态:
含义:进程被调试器跟踪并暂停。
详细说明: 进程被调试器(如gdb)跟踪,并因调试事件(如断点)而暂停。 这种状态是T (Stopped)的一种特殊情况。

T状态:
含义:进程被暂停(停止)。
详细说明: 进程被信号(如SIGSTOP、SIGTSTP)暂停,或者被调试器(如gdb)暂停。 进程可以通过信号(如SIGCONT)恢复运行。
示例: 使用Ctrl+Z暂停一个前台进程。

X状态:
进程已经终止(死亡)。 详细说明: 进程已经完成执行,或者被强制终止。 这种状态通常不会在ps或top命令的输出中看到,因为进程终止后会被立即清理
Z 状态:
进程处于僵尸状态。 详细说明: 进程已经终止,但其父进程尚未通过wait()或waitpid()系统调用回收其退出状态。 僵尸进程不再占用系统资源(如内存),但其进程描述符(PCB)仍然保留在系统中。 如果父进程没有正确处理僵尸进程,可能会导致僵尸进程积累。
对于僵尸进程的理解可以理解为,一个人死了,但一直没有法医来收尸,那么那个人就一直躺在那边,占用公共资源。所以如果造成僵尸进程就会造成内存泄露。


-----------那么本片文章就到这里感谢各位观看