Linux:进程状态总结

进程状态总结

什么是进程状态?

在操作心态中,进程状态是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)仍然保留在系统中。 如果父进程没有正确处理僵尸进程,可能会导致僵尸进程积累。

对于僵尸进程的理解可以理解为,一个人死了,但一直没有法医来收尸,那么那个人就一直躺在那边,占用公共资源。所以如果造成僵尸进程就会造成内存泄露。

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

相关推荐
武汉格发Gofartlic1 小时前
如何跟踪FEMFAT许可使用情况
运维·python·算法·信息可视化·数据分析
两个人的幸福online3 小时前
宝塔安装nginx-rtmp,音视频直播
运维·nginx·音视频
卓豪终端管理5 小时前
如何实现补丁管理自动化?
运维·人工智能·安全·网络安全·自动化·补丁管理·补丁自动化
weixin_442643427 小时前
IP Guard vs Ping32:2025 年企业防泄密系统深度横评
服务器·网络·安全·数据安全
CZIDC7 小时前
关闭不必要的系统服务-服务器更流畅、更安全
服务器·git·安全
宿辞1928 小时前
LINUX中MYSQL的使用
android·linux·mysql
没有口袋啦9 小时前
《k8s 部署》常见报错类型1
linux·容器·kubernetes
爱上妖精的尾巴9 小时前
3-19 WPS JS宏调用工作表函数(JS 宏与工作表函数双剑合壁)学习笔记
服务器·前端·javascript·wps·js宏·jsa
CLOUD ACE9 小时前
谷歌云代理 | 金融合规上云:谷歌云PCI DSS认证环境搭建指南
服务器·网络·金融
巨龙之路9 小时前
什么是Ubuntu的Multipass
linux·运维·ubuntu