【问题标题】:How is multitasking implemented at the elementary level?多任务是如何在初级阶段实现的?
【发布时间】:2012-02-06 10:46:39
【问题描述】:

多任务在基础层面是如何实现的?为了澄清我的问题,假设我们有一个 C 运行时来创建一个实现多任务处理的应用程序,该应用程序一次只能在单个核心处理器上运行一个任务,例如,通过调用这个“多任务”应用程序的 main() 函数. 标准操作系统内核如何实现这一点?多核处理器如何改变这种情况

【问题讨论】:

    标签: operating-system kernel multitasking


    【解决方案1】:

    操作系统设置一个中断定时器,让程序运行。一旦定时器超时,控制流跳转到操作系统代码进行上下文切换。

    在上下文切换时,操作系统保存当前进程的寄存器和支持数据,并在 CPU 中将其替换为队列中下一个进程的数据。然后它设置另一个中断计时器,让下一个程序从它被中断的地方运行。

    来自当前进程的系统调用也将控制权交给操作系统来决定是否是时候进行上下文切换(例如进程正在等待 IO 操作)

    机制对程序是透明的。

    运行。转变。重复。 :)

    【讨论】:

      【解决方案2】:

      我没有对多核处理器做过很多工作,因此我将避免尝试回答这部分问题。然而,对于单处理器,当涉及到多任务处理时,会想到两种策略。

      1. 如果我没记错的话,x86 支持硬件任务切换。 (我对这种类型的多任务处理的经验很少。)据我回忆,当处理器检测到任务切换的条件时,它会自动将传出任务的所有寄存器保存到其任务状态段(x86) ,并从传入任务的任务状态段加载所有寄存器。这种方法有各种注意事项和限制,例如设置了“忙碌位”,并且只能在特殊条件下切换回“忙碌任务”。就个人而言,我不觉得这种方法对我特别有用。

      2. 我见过的更常见的解决方案是通过软件进行任务切换。这可以分为协作任务切换和抢先任务切换。如果您正在编写协作任务切换策略,则任务切换仅在任务自愿放弃处理器时发生。在此策略中,您只需要保存和加载非易失性寄存器。如果选择了先发制人的策略,那么任务切换可以是自愿发生的,也可以是非自愿发生的。在这种情况下,必须保存和加载所有寄存器。在对任一场景进行编码时,您必须格外小心,不要破坏寄存器内容并正确设置堆栈,以便从任务切换代码返回时,您位于传入任务堆栈的正确位置.

      希望这会有所帮助。

      【讨论】:

      • 这当然有帮助,谢谢,但这个话题绝对值得进一步描述。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-25
      • 1970-01-01
      • 2016-09-28
      • 2011-03-24
      • 1970-01-01
      • 2018-03-23
      相关资源
      最近更新 更多