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

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

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

相关推荐
Christal_pyy21 分钟前
树莓派4基于Debian GNU/Linux 12 (Bookworm)添加多个静态ipv4网络
linux·网络·debian
csbDD1 小时前
2025年网络安全(黑客技术)三个月自学手册
linux·网络·python·安全·web安全
李狗蛋儿啊1 小时前
zero自动化框架搭建---Git安装详解
运维·git·自动化
小金的学习笔记2 小时前
如何在本地和服务器新建mysql用户和密码
运维·服务器·mysql
s_fox_2 小时前
nginx ngx_http_module(7) 指令详解
运维·nginx·http
EasyNVR2 小时前
EasyRTC智能硬件:实时畅联、沉浸互动、消音护航
运维·服务器·网络·安全·音视频·webrtc·p2p
CarryBest3 小时前
Jenkins 环境搭建---基于 Docker
运维·jenkins
若云止水3 小时前
Ubuntu 下 nginx-1.24.0 源码分析 - ngx_process_options
运维·nginx
s_fox_3 小时前
nginx ngx_http_module(9) 指令详解
运维·nginx·http
风口上的猪20153 小时前
thingboard告警信息格式美化
java·服务器·前端