进程执行时, PCB (内核存储空间?)的内容被加载到CPU寄存器和状态寄存器,< em>内核堆栈指针,用户堆栈指针等。
当有上下文切换到另一个进程时,当前的“上下文”被存储回PCB并切换到新PCB。
现在,当内核想要将这块PCB带回“上下文”时,它如何找到这块PCB,它现在在内存中?什么信息可以帮助内核找到内存中的PCB?
答案 0 :(得分:5)
查找处理器可用性的调度程序的工作,然后只发生上下文切换。只要核心可用,就会将存储的PCB的程序计数器值作为内核并提供给CPU寄存器。我想告诉PCBs是由核心以堆栈方式存储的。
答案 1 :(得分:1)
scheduler
&#34;可以访问所有内核数据结构,因此它定义了进程序列(它可以是抢先式或合作调度程序)。始终牢记:内核就像一个服务员,服务于什么,谁什么都不知道,像驴工作一样做(尽管最重要的)按照说明。
答案 2 :(得分:1)
我想提供位详细信息(并且为了使其易于理解,考虑每个进程有一个内核线程)。
现在每个内核线程(kthread)都有线程上下文(eip,ebp,esp,pagedir,kstack,kstacksize)。因此,正如我们都知道线程/进程生命周期一样,它会通过诸如 - &#34; Running,Runnable,wait,exit&#34; 之类的状态。当线程处于运行状态时,其上下文位于内核数据结构中&#34; context_t&#34;存储在内核地址空间的某个地方。内核堆栈包含指向该数据结构的指针 当线程切换(更技术性地说我们应该说context_switch)发生时(理由可能是 - 调度程序cpu超时,I / O操作完成等),线程被排入runnable队列内核数据结构(等待它的机会得到CPU)。
当状态变为&#39; Running&#39;时,上下文切换再次发生,现在context_t被加载。它具有访问先前存储的数据成员的所有必要指针,现在将用于继续形成先前停止的状态。
所有内核数据结构都存储在内核地址空间(&gt; 0xc0000000)中,并且线程具有指向这些上下文块的指针。 (当线程切换时,新线程指向其上下文 - 再次上下文切换,下一个线程指向其自己的数据结构。
答案 3 :(得分:0)
操作系统使用进程表查找内存中的PCB。
进程表由PID和内存中对应PCB的引用组成。
因此,每当操作系统执行上下文切换时,它都会在相应的 PID 的帮助下查看进程表以找到对 PCB 的引用。