7

当一个进程在执行时,PCB的内容(在内核内存空间?)被加载到CPU寄存器,状态寄存器内核堆栈指针用户堆栈指针等。

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

现在当内核想把这块PCB带回“上下文”时,它如何找到现在在内存中的这块PCB?哪些信息有助于内核找到内存中的 PCB?

4

4 回答 4

8

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

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

永远记住:Kernel 就像一个服务员,服务于所要求的东西,他什么都不知道,像驴子工作一样做所有事情(尽管是最重要的)。

于 2015-04-01T14:10:11.810 回答
1

我想提供一些详细信息(为了便于理解,请考虑每个进程有一个内核线程)。

现在每个内核线程(kthread)都有线程上下文(eip、ebp、esp、pagedir、kstack、kstacksize)。所以,我们都知道线程/进程的生命周期,它会经历诸如“正在运行、可运行、等待、退出”之类的状态。当线程处于运行状态时,其上下文位于内核数据结构“context_t”中,存储在内核地址空间的某处。并且内核堆栈包含指向该数据结构的指针当线程切换(更专业的术语我们应该说 context_switch)发生时(原因可能是 - 调度程序 cpu 超时,I/O 操作完成等)线程被排队到可运行队列内核数据结构(等待其获得 CPU 的机会)。

当状态变为“运行”时,上下文切换再次发生,现在 context_t 被加载。它具有访问先前存储的数据成员的所有必要指针,现在将使用这些指针从先前停止的状态继续。

所有内核数据结构都存储在内核地址空间(> 0xc0000000)中,并且线程具有指向这些上下文块的指针。(当线程切换时,新线程指向它的上下文 - 再次上下文切换,下一个线程指向它自己的数据结构。

于 2015-05-25T15:20:06.863 回答
0

操作系统使用进程表来查找内存中的 PCB。

Process Table 由 PID 和对 Memory 中相应 PCB 的引用组成。

因此,每当操作系统执行上下文切换时,它都会在相应的 PID 的帮助下查看进程表以查找对 PCB 的引用。

检查此图像以可视化此概念

于 2021-08-02T09:36:40.720 回答