内容基础:方框中的就是调度队列,是一个 双向队列
,每一个元素是PCB+其对应的代码数据
只要进程 在调度队列中
,进程的状态就是运行(running).
阻塞:等待某种硬件资源就绪(例如网卡,键盘…)
如果某一个进程在调度队列中,而调度其需要从键盘上读取数据,但键盘上没响应,所以cpu会把这个进程从调度队列中拿下来,并把其链接到对应硬件的等待队列中。这就是一个阻塞的过程
挂起的本质是--------将数据唤入或唤出到磁盘中的交换区(内存资源不足时)
内存资源不足时,如果进程处于阻塞状态,那么会将进程的数据交换到硬盘的swap分区,PCB依然保留,内存资源充足时,数据会从swap分区唤出和PCB重新组合为进程--------------------阻塞挂起
运行挂起同理。
这是普通的双端队列,可以看到next指针是指向下一个元素的头,prev也是指向上一个元素的头。
一个PCB可以隶属于多个数据结构,可以属于调度队列,可以属于等待队列,也可以属于设备队列。所以有多个next,prev。
那如果一直存在,那么子进程的PCB就一直不会消失,那么就会一直占用内存,可能会导致内存泄漏。