【发布时间】:2022-10-14 08:05:04
【问题描述】:
我目前正在学习操作系统课程中的进程。我对流程的实际工作方式有点困惑。 根据我的理解
- 当我们双击一个可执行文件(假设是单线程的)时,会为这个新进程创建一个进程控制块,并在主内存中为进程分配一些空间。
- 然后是短期调度程序,将进程分派给 CPU(假设为单处理器系统)。
- CPU 执行进程并在阻塞它之前(以防发生中断或进程请求某些 I/O),将 CPU 的内容保存在进程控制块中。然后进程被发送到就绪队列。
我的第一个问题是,这些 PCB 存放在哪里?形成我从其他网站上阅读的内容,因为PCB中的信息非常重要,操作系统将其保存在内核空间中,但其他一些网站说PCB存储在内核堆栈(在用户模式下无法访问),即位于与进程相同的地址空间(可能一个进程有两个堆栈,一个用户堆栈和一个内核堆栈)。那么实际上PCB存储在哪里?
操作系统如何知道进程与其PCB之间的映射?操作系统如何知道与 PCB 相关的进程的物理位置。我假设因为 PCB 包含内存管理信息(如基址寄存器和堆栈寄存器的值),所以我的假设是否正确?
我的最后一个问题是什么是进程表?信息处理表存储什么。 (我猜他们存储 pid 和指向进程 PCB 的指针)
很抱歉提出这样一个基本问题,但我找不到任何令人满意的资源。 :(
编辑1:进行了更多研究,发现操作系统同时使用内核堆栈(确实与进程位于同一地址空间下)和PCB。但事实证明,内核堆栈不存储 PCB,它只是将寄存器的内容存储在 CPU 内(在这里回答: During a context switch, does the OS use PCB or kernel stack to restore registers? 。所以问题仍然存在,PCB 实际存储在哪里?
编辑 2:在研究了更多并研究了几本书之后,似乎所有的 PCB 实际上都存储在一个叫做调度队列的东西上。这些队列确实保存在系统空间中(不在内核堆栈上)并包含 PCB。有很多调度队列,如就绪队列、等待队列、中间队列(用于存储换出进程的信息)、I/O 队列和最后的作业队列。如果一个进程没有被执行,它的 PCB 将存储在这些队列之一中。事实证明,PCB确实存储了进程的基地址和对进程页表的引用等信息。虽然我仍然不确定进程表的作用是什么。
【问题讨论】:
-
每个操作系统都不一样。没有理由浪费时间在关于每个人应该如何调用某个数据结构的术语细节上。操作系统开发的术语不是那么标准化。无论如何,操作系统不需要将PCB与进程的物理位置相关联,因为PCB就是进程。操作系统不理解什么是进程,因为它不是人类。它是在计算机中运行的代码。它盲目地获取PCB中的数据并根据已经编写的逻辑(其代码)将其放入适当的寄存器中。
-
使用哪个 PCB 取决于调度策略。
标签: process operating-system scheduling