当一个进程在执行时,PCB的内容(在内核内存空间?)被加载到CPU寄存器,状态寄存器,内核堆栈指针,用户堆栈指针等。
当上下文切换到另一个进程时,当前的“上下文”被存储回 PCB 中,并切换到新的 PCB。
现在当内核想把这块PCB带回“上下文”时,它如何找到现在在内存中的这块PCB?哪些信息有助于内核找到内存中的 PCB?
当一个进程在执行时,PCB的内容(在内核内存空间?)被加载到CPU寄存器,状态寄存器,内核堆栈指针,用户堆栈指针等。
当上下文切换到另一个进程时,当前的“上下文”被存储回 PCB 中,并切换到新的 PCB。
现在当内核想把这块PCB带回“上下文”时,它如何找到现在在内存中的这块PCB?哪些信息有助于内核找到内存中的 PCB?
查找处理器可用性是调度的工作,然后只发生上下文切换。一旦内核可用,内核中存储的 PCB 的程序计数器值就会被获取并提供给 CPU 寄存器。我想告诉内核以堆栈方式存储 PCB。
scheduler
”可以访问所有内核数据结构,因此它定义了进程的顺序(它可以是抢占式或协作式调度器)。永远记住:Kernel 就像一个服务员,服务于所要求的东西,他什么都不知道,像驴子工作一样做所有事情(尽管是最重要的)。
我想提供一些详细信息(为了便于理解,请考虑每个进程有一个内核线程)。
现在每个内核线程(kthread)都有线程上下文(eip、ebp、esp、pagedir、kstack、kstacksize)。所以,我们都知道线程/进程的生命周期,它会经历诸如“正在运行、可运行、等待、退出”之类的状态。当线程处于运行状态时,其上下文位于内核数据结构“context_t”中,存储在内核地址空间的某处。并且内核堆栈包含指向该数据结构的指针当线程切换(更专业的术语我们应该说 context_switch)发生时(原因可能是 - 调度程序 cpu 超时,I/O 操作完成等)线程被排队到可运行队列内核数据结构(等待其获得 CPU 的机会)。
当状态变为“运行”时,上下文切换再次发生,现在 context_t 被加载。它具有访问先前存储的数据成员的所有必要指针,现在将使用这些指针从先前停止的状态继续。
所有内核数据结构都存储在内核地址空间(> 0xc0000000)中,并且线程具有指向这些上下文块的指针。(当线程切换时,新线程指向它的上下文 - 再次上下文切换,下一个线程指向它自己的数据结构。
操作系统使用进程表来查找内存中的 PCB。
Process Table 由 PID 和对 Memory 中相应 PCB 的引用组成。
因此,每当操作系统执行上下文切换时,它都会在相应的 PID 的帮助下查看进程表以查找对 PCB 的引用。