文章目录
进程状态
传统教材里面的进程状态:
进程最核心的是task_struct,里面就有个状态的属性status,用来标识当前进程属于什么状态,状态就是一个数字。
运行状态(r)
我们的进程在全局的双链表中,但是没有在CPU的运行队列中,我们把这些进程叫做新建状态(就绪状态)。运行状态和就绪状态是在一个队列中的。
操作系统中,task_struct是如何用双链表管理起来的?
但是这样的话,只知道他的内部变量的地址,无法访问变量其他属性?
阻塞状态
先描述,再组织!!!操作系统要对软硬件资源进行管理 -> 包括硬件,对于硬件也是需要先描述,再组织!!!
进程需要哪个外设,就要到对应的外设里面进行等待。
挂起状态(阻塞挂起)

Linux进程状态

-
S(1):浅度睡眠状态,也叫可中断睡眠。也就是上面的阻塞状态。浅度的意思是因为我们可以ctrl+c直接杀掉这个进程。 -》等键盘
看一下下面两段代码:
①while(1) {printf("hello world\n") 阻塞状态S,频繁的打印,会不断访问外设。
②while(1) {} 运行状态R
-
D(2):深度睡眠状态(磁盘睡眠状态),也叫不可中断睡眠。不对外部任何事件进行相应,OS也杀不掉,除非进程自己醒来,重启都没有!!!磁盘级访问。 -》等磁盘
浅度睡眠和深度睡眠状态统称为阻塞状态。 -
T(4):暂停状态。可以通过发送 SIGSTOP 信号给进程来停⽌(T)进程。这个被暂停的进程可以通过发送 SIGCONT 信号让进程继续运⾏。
-
t(8):因为被追踪,进程因为断点而停下来,gdb调试代码时,r会执行代码,就是gdb会创建一个进程,来跑这个代码,这个进程跑完了就会成为t状态。
-
X(16):死亡状态,即进程结束了,是进程创建的反过程。进程被创建出来是为了完成任务的,在进程结束的时候,不能立即释放该进程的所有资源,而是要让进程现处于一种"僵尸进程",代码数据释放掉,但是会把task_struct保留(会记录进程退出时的退出信息),这样会方便父进程读取退出码!!!
-
Z(32):僵尸状态,当进程退出并且⽗进程(使⽤wait()系统调⽤,后⾯讲)没有读取到⼦进程退出的返回代码时就会产⽣僵尸进程。 如果父进程将来不处理,这个僵尸进程会一直存在!!!
僵尸进程的危害:内存泄漏!!!
- 进程的退出状态必须被维持下去,因为他要告诉它的⽗进程,你交给我的任务,我办的怎么样了。可⽗进程如果⼀直不读取,那子进程就⼀直处于Z状态。
- 维护退出状态本⾝就是要⽤数据维护,也属于进程基本信息,所以保存在task_struct(PCB)中,换句话说,Z状态⼀直不退出,PCB⼀直都要维护。
- 那⼀个父进程创建了很多⼦进程,就是不回收,就会造成内存资源的浪费!因为数据结构对象本⾝就要占⽤内存,想想C中定义⼀个结构体变量(对象),是要在内存的某个位置进⾏开辟空间。
进程=内核数据结构(task_struct)+ 代码和数据,当我们创建进程时,首先创建内核数据结构。
Q:那如果父进程先退出了,怎么办呢?
A:==父进程先退出,子进程就被称为"孤儿进程"。==子进程还在运行的话,会被PPID进程领养