存储和检索进程控制块

7
当进程在执行时,PCB(位于内核内存空间中?)的内容会加载到CPU寄存器、状态寄存器、内核堆栈指针、用户堆栈指针等中。当发生上下文切换到另一个进程时,当前的“上下文”被存回到PCB中,并切换到新的PCB。
现在当内核想要恢复这个PCB的“上下文”时,它如何找到这个PCB,在内存中呢?哪些信息可以帮助内核在内存中找到PCB?
4个回答

8

调度程序的工作是查找处理器的可用性,只有这样才会发生上下文切换。一旦核心可用,内核中存储的PCB的程序计数器值就被取出并赋给CPU寄存器。我想告诉你PCB被内核以堆栈方式存储。


我认为 PCB 存储在运行队列中,调度程序遍历该队列并将被调度运行的 PCB 上下文放入硬件寄存器中... - Sharat Chandra
@sharatchandra:你所理解的可能对于特定的操作系统是非常正确的。PCB被存储在由操作系统定义的数据结构中,因此我们可以说它可能是任何堆栈、队列..!! - RKT

1
  1. PCB:它是一种数据结构,可以是操作系统或用户的一部分。但由于它是敏感的数据结构,几乎在任何地方PCB都是内核数据结构的一部分。
  2. PCB大多数情况下被存储为进程内核栈,位于内核空间,内核可以访问它,而该数据结构受到保护以防止任何用户访问。
  3. 进程切换是调度器的一个功能,它是内核模块。有许多调度算法来定义进程切换(长期/短期/中期等)。
  4. 现在调度器定义哪个进程将运行,而不是内核。内核的功能只是在调用时提供服务(系统调用/中断/陷阱)。
  5. 作为内核模块,“scheduler”可以访问所有内核数据结构,因此它定义了进程的顺序(可以是抢占式或协作式调度程序)。
  6. 每个进程都有自己的PCB,因此活动/运行的进程在使用先前存储的PCB(通常在内核栈之前)将其PCB加载到CPU寄存器和其他所需部分。

始终记住:内核就像是一个服务员,为所要求的服务,不知道任何事情,像驴子一样做所有工作(虽然最重要),按照指示执行。


1
我希望提供一些详细信息(为了便于理解,可以考虑每个进程只有一个内核线程)。现在,每个内核线程(kthread)都有线程上下文(eip、ebp、esp、pagedir、kstack、kstacksize)。所以,我们都知道线程/进程的生命周期,它通过“运行、可运行、等待、退出”等状态。当线程处于运行状态时,它的上下文存储在内核数据结构“context_t”中,并在内核地址空间的某个位置存储,而内核堆栈包含指向该数据结构的指针。当线程切换(更准确地说是上下文切换)发生时(原因可能是调度程序CPU超时、I/O操作完成等),线程被排队到可运行队列内核数据结构中(等待获取CPU的机会)。
当状态变为“运行”时,上下文切换再次发生,现在加载了context_t,其中包含所有必要的指针,以访问先前存储的数据成员,这些成员将用于继续从先前停止的状态。
所有内核数据结构都存储在内核地址空间中(> 0xc0000000),线程具有指向这些上下文块的指针。(随着线程的切换,新线程指向其上下文 - 再次上下文切换,下一个线程指向自己的数据结构。)

0
操作系统使用进程表来查找内存中的PCB。
进程表由PID和对应PCB在内存中的引用组成。
因此,每当操作系统执行上下文切换时,它都会查找进程表,通过相应的PID找到PCB的引用。 请查看此图像以可视化此概念

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接