存储和检索过程控制块

时间:2012-03-26 16:52:27

标签: operating-system scheduling context-switch process-control

进程执行时, PCB (内核存储空间?)的内容被加载到CPU寄存器和状态寄存器,< em>内核堆栈指针,用户堆栈指针等。

当有上下文切换到另一个进程时,当前的“上下文”被存储回PCB并切换到新PCB。

现在,当内核想要将这块PCB带回“上下文”时,它如何找到这块PCB,它现在在内存中?什么信息可以帮助内核找到内存中的PCB?

4 个答案:

答案 0 :(得分:5)

查找处理器可用性的调度程序的工作,然后只发生上下文切换。只要核心可用,就会将存储的PCB的程序计数器值作为内核并提供给CPU寄存器。我想告诉PCBs是由核心以堆栈方式存储的。

答案 1 :(得分:1)

  1. PCB:它是一种数据结构,可以是操作系统或用户的一部分。但由于它的敏感数据结构几乎所有PCB都是内核数据结构的一部分
  2. PCB主要存储在内核空间中的每进程内核堆栈中,内核可以访问它,并保护其免受任何用户的攻击。<​​/ li>
  3. 进程切换是调度程序的一个功能,它是内核模块。有许多调度算法来定义过程切换(长/短/中期等)。
  4. 现在,调度程序定义了下一个运行的进程,而不是内核。内核的功能只是在调用时提供服务(系统调用/中断/陷阱)。
  5. 作为内核模块&#34; scheduler&#34;可以访问所有内核数据结构,因此它定义了进程序列(它可以是抢先式或合作调度程序)。
  6. 每个进程都有自己的PCB,因此主动/运行过程将其PCB加载到CPU寄存器和其他所需的部分,使用它之前存储的PCB(主要是)在内核堆栈之前。
  7. 始终牢记:内核就像一个服务员,服务于什么,谁什么都不知道,像驴工作一样做(尽管最重要的)按照说明。

答案 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 的引用。

check this image to visualize this concept