当执行用户代码的线程正在等待输入时,调度程序如何知道要中断输入或线程如何知道如何调用调度程序,因此,看到一个简单的单线程应用程序的普通程序员不太可能在各处插入sched_yield()。编译器是在优化时插入sched_yield()还是线程只是自旋锁定,直到调度程序设置的通用计时器中断触发,或者用户是否必须显式声明wait(),sleep()函数以使上下文切换?
这个问题是,如果调度不抢先因为那特别相关有来电时,它在等待输入吞吐量是有效的调度,但我不知道它是如何做到这一点。
注意不要将抢先与进程的睡眠能力混为一谈。即使使用非抢占式调度程序,进程也可以进入睡眠状态。当进程正在等待I / O时,就会发生这种情况。该过程进行系统调用,例如,read()
设备确定没有可用数据。然后,它通过更新调度程序使用的数据结构在内部使进程进入休眠状态。然后,调度程序将执行其他进程,直到发生唤醒原始进程的中断或其他事件。然后,唤醒的过程将再次具有进行计划的资格。
另一方面,抢占是体系结构的调度程序在没有协作的情况下停止进程执行的能力。中断可能发生在程序指令流中的任何位置。控制权返回到调度程序,然后调度程序可以执行其他进程,并稍后返回中断(抢占)进程。大多数调度程序会分配时间片,在该时间片中,进程可以运行预定的时间,如果优先级更高的进程需要时间片,则可以在此之后抢占。
除非您正在编写驱动程序或内核代码,否则您无需过多担心底层机制。在编写用户空间应用程序时,关键概念是:(1)一些系统调用可能会阻塞,这意味着您的进程将一直处于睡眠状态,直到事件发生为止;(2)在可抢占的系统(所有主流现代操作系统)上,程序可能是随时抢占,以便其他进程可以运行。
*请注意,在某些平台(例如Linux)上,线程实际上只是与另一个进程共享其虚拟地址空间的另一个进程。因此,调度程序将进程和线程完全相同地对待。