《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进程领养

相关推荐
jieyu11194 小时前
Linux Rootkit 详解
linux·运维·系统安全
宁檬精4 小时前
运维面试准备——综合篇(一)
linux·运维·服务器
洛阳纸贵Coco.Leo.YI4 小时前
10分钟在Windows11下Ubuntu内安装docker-Version28.51
linux·ubuntu·docker
阿巴~阿巴~4 小时前
Ubuntu 20.04 安装 Redis
linux·服务器·数据库·redis·ubuntu
aitav05 小时前
⚡ arm 32位嵌入式 Linux 系统移植 NTP 服务
linux·arm开发·ntp
weixin_456904275 小时前
工业自动化通信控制
运维·struts·自动化
爱奥尼欧5 小时前
【Linux笔记】网络部分——socket 编程 TCP实现多台虚拟机使用指令访问云服务器
linux·服务器·网络
yolo_guo5 小时前
sqlite 使用: 03-问题记录:在使用 sqlite3_bind_text 中设置 SQLITE_STATIC 参数时,处理不当造成的字符乱码
linux·c++·sqlite
m0”-“0m5 小时前
MySQL、Nignx和Docker在Linux上的安装详解
linux·数据库·mysql