【问题标题】:Operating system software task scheduling操作系统软件任务调度
【发布时间】:2014-04-19 06:49:29
【问题描述】:

我想知道调度程序如何从加载的汇编代码中获得控制权?例如,我们可以编写一个程序体,将控制权从调度程序传递到该程序体。

;Do whatever we need to do before calling main()
;Call main or jump to it
;Do cleanup and stuff

那么如何将程序流从主程序返回到调度程序呢? 我一直认为进程加载器可以注入jmp 指令以将程序流返回给调度程序。有什么想法可行吗?

【问题讨论】:

    标签: assembly process operating-system


    【解决方案1】:

    [短版]

    操作系统加载器不插入任何 jmp 或调用代码。

    在现代抢占式操作系统上,内核代码是从中断输入的:

    来自外围设备(如磁盘、NIC、KB、鼠标、计时器)的“真实”硬件中断会导致驱动程序运行。

    软件中断,即。系统调用。

    任一类型的中断都可能请求调度程序运行并更改在内核上运行的线程集。

    如果没有中断,内核什么也不做,因为它没有进入。

    【讨论】:

      【解决方案2】:

      多任务处理要么是抢占式的,要么是协作式的。

      大多数操作系统使用抢占式策略,这意味着操作系统会为允许运行的线程分配一定的时间。当计时器到期时,会产生一个中断,操作系统会强制切换到一个新任务(如果有的话)。除非提供了机制,否则无法从用户空间中真正避免这种情况。

      在合作的环境中,流程会根据需要运行。它必须显式调用一个允许操作系统切换到新任务的函数。只要进程不这样做,理论上它可以永远运行。

      在这两种情况下,都可能发生任务执行系统调用,这需要任务等待,在这种情况下,也可能发生任务切换,直到等待的资源调用得到满足。

      【讨论】:

      • 在抢占式系统上,内核什么也不做,除非它是从系统调用或通过驱动程序的硬件中断进入的。定时器中断(在大多数系统/操作系统上)只是众多中断之一,并且显式或暗示突出显示它会给大多数此类系统的运行方式留下不好的印象。
      • @MartinJames,感谢您的解释。我认为这是一个实现细节,所以一般概念仍然适用。
      • 目前主流的协同多任务系统只有Windows 3.x和MacOS X之前的MacOS。两者都相当过时了。
      • @SevaAlekseyev,还有其他操作系统,不一定是主流。事实上,我正在为一家拥有自己硬件的公司做类似的事情。
      【解决方案3】:

      操作系统被定时器中断,如果程序时间到了,它会调用调度程序来选择下一个要执行的程序,直到下一个中​​断。 如果您询问“操作系统如何知道程序执行已完成” - 程序的进程在完成时进行系统调用并且操作系统将该进程标记为已死,因此调度程序不会选择它执行。

      【讨论】:

      • 定时器.. 以及所有其他至关重要的 I/O 中断。
      【解决方案4】:

      调度程序不会注入跳转或类似的东西。操作系统将其注册到中断服务程序。 (isr) 你的 CPU 的定时器中断。

      【讨论】:

      • 来自 I/O 外设的所有其他中断呢?
      • 这是实现依赖,一些 isr 启动一个特定的驱动程序,一些提供一个缓冲区,......许多方式都是可能的。您必须查看您的操作系统文档以获取特定信息。
      猜你喜欢
      • 2014-11-21
      • 1970-01-01
      • 2010-10-16
      • 2012-08-07
      • 1970-01-01
      • 2019-09-27
      • 1970-01-01
      • 1970-01-01
      • 2014-03-29
      相关资源
      最近更新 更多