我对计算机操作系统中的调度/多任务处理有一些疑问。如果细节是特定于平台的,我指的是在 x86 上运行的 Linux。
我理解调度程序是操作系统的一个组件,它将执行线程分配给物理处理核心(假设没有超线程)。我的问题是,调度程序如何告诉核心停止从内存中当前位置执行代码,并从内存中的不同位置开始执行代码?这似乎是调度程序发送到处理核心的某种中断,但据我所知,中断最终会返回到原始执行线程。(因为它们“打断”了对话,而不是改变主题。)
我会阅读 Linux 调度程序代码,但我对 C 的理解并不那么深入。
答案1
定时器中断由操作系统设置,因此执行将返回操作系统。这是我对该过程的理解,可能缺少更详细的信息。
- 操作系统将要执行的程序的 CPU 状态信息加载到内存中
- 操作系统设置一个中断定时器,说“
this interrupt handler
在 50uS 内戳一下”(或其他时间片) - 操作系统通过以下方式告诉 CPU“切换”到程序
context switch
并保存当前 OS 任务的状态 - CPU 执行程序
- 时间耗尽时触发中断,导致 CPU 将当前程序状态卸载到内存并启动中断处理程序
- 中断处理程序本质上设置并执行另一个上下文切换或简单分支(这次不需要任何中断)到操作系统调度程序。
- 调度程序寻找下一个准备运行的任务并返回步骤 1。