《Linux篇》进程状态——浅度、深度睡眠状态、僵尸状态、运行状态

文章目录

进程状态

传统教材里面的进程状态:

进程最核心的是task_struct,里面就有个状态的属性status,用来标识当前进程属于什么状态,状态就是一个数字。

运行状态(r)


我们的进程在全局的双链表中,但是没有在CPU的运行队列中,我们把这些进程叫做新建状态(就绪状态)。运行状态和就绪状态是在一个队列中的。

操作系统中,task_struct是如何用双链表管理起来的?

但是这样的话,只知道他的内部变量的地址,无法访问变量其他属性?

阻塞状态

先描述,再组织!!!操作系统要对软硬件资源进行管理 -> 包括硬件,对于硬件也是需要先描述,再组织!!!

进程需要哪个外设,就要到对应的外设里面进行等待。

挂起状态(阻塞挂起)

Linux进程状态

  1. S(1):浅度睡眠状态,也叫可中断睡眠。也就是上面的阻塞状态。浅度的意思是因为我们可以ctrl+c直接杀掉这个进程。 -》等键盘

    看一下下面两段代码:

    ①while(1) {printf("hello world\n") 阻塞状态S,频繁的打印,会不断访问外设。

    ②while(1) {} 运行状态R

  2. D(2):深度睡眠状态(磁盘睡眠状态),也叫不可中断睡眠。不对外部任何事件进行相应,OS也杀不掉,除非进程自己醒来,重启都没有!!!磁盘级访问。 -》等磁盘

    浅度睡眠和深度睡眠状态统称为阻塞状态。

  3. T(4):暂停状态。可以通过发送 SIGSTOP 信号给进程来停⽌(T)进程。这个被暂停的进程可以通过发送 SIGCONT 信号让进程继续运⾏。

  4. t(8):因为被追踪,进程因为断点而停下来,gdb调试代码时,r会执行代码,就是gdb会创建一个进程,来跑这个代码,这个进程跑完了就会成为t状态。

  5. X(16):死亡状态,即进程结束了,是进程创建的反过程。进程被创建出来是为了完成任务的,在进程结束的时候,不能立即释放该进程的所有资源,而是要让进程现处于一种"僵尸进程",代码数据释放掉,但是会把task_struct保留(会记录进程退出时的退出信息),这样会方便父进程读取退出码!!!

  6. Z(32):僵尸状态,当进程退出并且⽗进程(使⽤wait()系统调⽤,后⾯讲)没有读取到⼦进程退出的返回代码时就会产⽣僵尸进程。 如果父进程将来不处理,这个僵尸进程会一直存在!!!

僵尸进程的危害:内存泄漏!!!

  1. 进程的退出状态必须被维持下去,因为他要告诉它的⽗进程,你交给我的任务,我办的怎么样了。可⽗进程如果⼀直不读取,那子进程就⼀直处于Z状态。
  2. 维护退出状态本⾝就是要⽤数据维护,也属于进程基本信息,所以保存在task_struct(PCB)中,换句话说,Z状态⼀直不退出,PCB⼀直都要维护。
  3. 那⼀个父进程创建了很多⼦进程,就是不回收,就会造成内存资源的浪费!因为数据结构对象本⾝就要占⽤内存,想想C中定义⼀个结构体变量(对象),是要在内存的某个位置进⾏开辟空间。

进程=内核数据结构(task_struct)+ 代码和数据,当我们创建进程时,首先创建内核数据结构。

Q:那如果父进程先退出了,怎么办呢?

A:==父进程先退出,子进程就被称为"孤儿进程"。==子进程还在运行的话,会被PPID进程领养

相关推荐
平行云PVT2 小时前
数字孪生信创云渲染技术解析:从混合信创到全国产化架构
linux·unity·云原生·ue5·图形渲染·webgl·gpu算力
xdscode2 小时前
Linux云服务器安装openclaw,并对接飞书通道
linux·服务器·飞书·openclaw
Percep_gan3 小时前
Linux中安装Redis,很详细
linux·运维·redis
七七powerful3 小时前
运维养龙虾--AI 驱动的架构图革命:draw.io MCP 让运维画图效率提升 10 倍,使用codebuddy实战
运维·人工智能·draw.io
枕书3 小时前
实战记录:如何使用 Docker 一键部署长亭 PandaWiki 智能知识库
运维·docker·容器
2401_877274243 小时前
从匿名管道到 Master-Slave 进程池:Linux 进程间通信深度实践
linux·服务器·c++
feng_you_ying_li4 小时前
linux之用户的权限详解(4)
linux·运维·服务器
二进制person5 小时前
JavaEE初阶 --网络编程
linux·服务器·网络
Cyber4K5 小时前
【妙招系列】Harbor 镜像私有仓库搭建手册
linux·云原生·容器
Irissgwe6 小时前
进程间通信
linux·服务器·网络·c++·进程间通信