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

相关推荐
用户03284722207020 小时前
如何搭建本地yum源(上)
运维
A小辣椒2 天前
TShark:Wireshark CLI 功能
linux
A小辣椒2 天前
TShark:基础知识
linux
AlfredZhao2 天前
OCI 明明分配了 200G 系统盘,为什么 df 只看到 30G?
linux·oci
AlfredZhao3 天前
vi 删除指定范围的行,不用再反复按 dd
linux·vi
用户9718356334663 天前
银河麒麟 KY10 申威(SW64) 安装 nginx-1.16.1-2.p01.ky10.sw_64.rpm 详细步骤
linux
猪脚踏浪3 天前
linux 拷贝文件或目录到指定的位置
linux
大树884 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠4 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质4 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务