目录
1.进程状态
1)直接谈论Linux的进程状态
R :进程运行的状态
S :休眠状态 (进程在等待“资源”就绪;可中断睡眠)
T / t :让进程暂停,等待被进一步唤醒
D :不可被杀,深度睡眠,不可中断睡眠
2)僵尸进程和孤儿进程
1.僵尸进程
2.孤儿进程
3.进程的阻塞、挂起和运行
I.阻塞态
II.挂起态
1.进程状态
1)直接谈论Linux的进程状态
比如:#define RUN 1
#define SLEEP 2
#define STOP 3
.....
实际上其进程状态就是进程内部的一个属性
R :进程运行的状态
S :休眠状态 (进程在等待“资源”就绪;可中断睡眠)
T / t :让进程暂停,等待被进一步唤醒
暂停:
唤醒:
在调试的过程中,运行到断点处会暂停运行 ---> t
D :不可被杀,深度睡眠,不可中断睡眠
消除D状态的方法:1.进程自己醒来 2.重启 -- 断点
2)僵尸进程和孤儿进程
1.僵尸进程
子进程运行五秒,父进程无限循环
在子进程运行结束之后,父进程仍在运行,子进程变为僵尸进程
如果没有父进程读取,僵尸进程会一直存在!
已经运行完毕,但是需要维持自己的退出信息,在自己的进程task_struct 会记录自己的退出信息,未来让父进程来进行读取
若一直为读取,则会导致内存泄漏问题!
Z 状态通过 waitpid变为 X 状态然后由OS进行释放
2.孤儿进程
父进程如果先退出,子进程就会变成孤儿进程,孤儿进程一般都是会被1号进程(OS本身)进行领养的
孤儿进程为什么要被OS领养?依旧要保证子进程正常被回收
我们已经启动的所有的进程,我们怎么从来没有关心过僵尸呢?内存泄漏??
直接在命令行中启动的进程,他的父进程是bash,bash会自动回收新进程的Z
3.进程的阻塞、挂起和运行
Linux不是这样调度的,这只是OS教程调度算法的一种(简洁)
进程在运行队列中,该进程的状态就是R状态
表示已经准备好了,可以随时被调度了
那么一个进程一旦持有CPU,会一直运行到这个进程结束吗?
不会
是基于时间片进行轮转的方式进行调度,在一个时间段内同时得以推进代码,就叫做并发
任何时刻,都同时有多个进程在真的同时进行,我们叫做并行
I.阻塞态
这时,./teatStatus 还并没有被调度
而是正在等待键盘资源是否就绪,键盘上面有没有被用户按下的按键,按键数据交给进程
阻塞和运行的状态变化,往往伴随着pcb被连入不同的队列中!
入队列的不是进程的什么代码和数据 而是进程的task_struct
各种设备也有自己的wait_queue 不是只有cpu才有运行队列
当比如像scanf这种需要等待键盘输入的情况,就要将其task_struct加入到键盘设备的等待队列中等待
操作系统是软硬件资源的管理者 -- 而进程本身就是软件
操作系统如何对软硬件进行管理?
先描述,再组织!
II.挂起态
关于进程切换的话题
上下文数据:CPU内部的所有的寄存器中的临时数据
进程在切换时,最重要的事情就是:上下文数据的保护和恢复
CPU内的寄存器:
寄存器本身是硬件,具有数据的存储能力,CPU的寄存器硬件只有一套!!CPU内部的数据,可以有多套,有几个进程,就有几套和该进程对应的上下文数据
寄存器 != 寄存器