
我了解到,当中断发生时,进程会进入就绪队列,而不是经过阻塞的队列。但是,在这张图片中,被中断的进程已经移动到阻塞的队列(这是一个粉红色的圆圈)。我搞不懂哪种情况属于就绪队列,哪种情况属于阻塞队列。
发布于 2022-07-14 03:27:05
一般来说,流程管理要比这复杂得多。一个任务通常被绑定到一个特定的处理器核心。多个任务被绑定到同一个处理器核心上,这些任务中的每一个都可能被阻止,等待IO。这意味着,任何任务都可以被设备控制器触发的中断在任何时候中断,即使当前运行在核心上的任务与该特定中断无关。
因此,图表是不完整的。它没有考虑到完整的过程生命周期。在您的关系图中,如果进程正在等待IO (在syscall (如read()之后,进程就会进入阻塞队列。如果它被内核抢占,那么它就会进入就绪队列,以便让另一个进程在该核心上有一些时间。
我认为人们经常误解,每一个过程都会一直运行到完成。不可能是这样,否则大多数进程都无法在任何核心上获得时间。相反,如果进程的数量高于内核的数量,内核使用每个核心本地APIC的定时器(本地APIC在x86-64上,但在每个体系结构上都有类似的机制)来给与该核心相关联的每个进程一个时间段。当某个进程被调度到某个内核时,内核用它的时间片启动定时器。当时间片过去时,本地APIC触发一个中断,让内核知道应该在该核心上调度另一个进程。这就是进程在执行过程中可以被抢占的原因。该进程仍被认为已准备好运行。只是它的时间片已经耗尽了,所以内核决定给另一个进程一些时间。先发制人的进程将在稍后得到更多的定时器。由于从人的角度来看,每个进程的时间片段非常短,它给人的印象是,每个进程在没有中断的情况下都持续运行,而实际上并非如此。(顺便说一下,这个关系图是非常特定于Linux内核的)
https://stackoverflow.com/questions/72961999
复制相似问题