如何在基本级别实施多任务处理?为了澄清我的问题,我们假设我们有一个C运行时来创建一个实现多任务的应用程序,它可以在单个核心处理器上一次只运行一个任务,比如通过调用这个“mutlitasking”的main()
函数“申请。
标准操作系统内核如何实现这一点?这对多核处理器有何影响
答案 0 :(得分:1)
OS设置中断计时器,让程序运行。一旦计时器到期,控制流就会跳转到OS的代码以进行上下文切换。
在上下文切换操作系统中,OS保存当前进程的寄存器和支持数据,并将其替换为CPU中的下一个进程的数据。然后它设置另一个中断计时器,让下一个程序从它被中断的地方运行。
此外,来自当前进程的系统调用可以控制操作系统,以确定是否需要进行上下文切换(例如,进程正在等待IO操作)
机制对程序是透明的。
运行。开关。重复。 :)
答案 1 :(得分:0)
我在多核处理器方面做得不多,所以我不会试图回答那部分查询。但是,对于单处理器,在多任务处理时会想到两种策略。
如果我没记错的话,x86支持硬件任务切换。 (我对这种多任务处理的经验很少。)从我记得,当处理器检测到任务切换的条件时,它会自动将传出任务的所有寄存器保存到其任务状态段(x86) ,并从传入任务的任务状态段加载所有寄存器。这种方法有各种警告和限制,例如设置“忙位”并且只能在特殊条件下切换回“忙碌任务”。我个人认为这种方法对我来说特别有用。
我见过的更常见的解决方案是通过软件进行任务切换。这可以分解为协同任务切换和抢先任务切换。如果您正在编写协作任务切换策略,则只有在任务自愿放弃处理器时才会发生任务切换。在此策略中,您只需要保存并加载非易失性寄存器。如果选择了先发制人的策略,那么任务切换可以是自愿的,也可以是非自愿的。在这种情况下,必须保存和加载所有寄存器。在对任一场景进行编码时,您必须特别小心,不要损坏您的寄存器内容,并正确设置堆栈,这样当您从任务切换代码返回时,您处于传入任务堆栈的正确位置
希望这有帮助。