代码之家  ›  专栏  ›  技术社区  ›  Lewis Kelsey

调度程序如何知道线程被阻塞等待输入?

  •  4
  • Lewis Kelsey  · 技术社区  · 6 年前

    当执行用户代码的线程等待输入时,调度程序如何知道中断它,或者线程如何知道如何调用调度程序,将简单单线程应用程序的平均程序员视为不可能在任何地方插入sched_yield()。编译器是否在优化时插入sched_yield(),或者线程是否只是旋转锁,直到调度程序设置的常规计时器中断触发,或者用户是否必须显式地状态wait()、sleep()函数才能切换上下文?

    如果调度器不是抢占的,那么这个问题尤其重要,因为 在等待输入以使吞吐量有效时调用调度程序,但我不确定它是如何做到这一点的。

    3 回复  |  直到 6 年前
        1
  •  2
  •   TypeIA    6 年前

    小心不要混淆 优先购买权 具有过程的能力 睡觉 . 即使使用非抢占调度程序,进程也可以休眠。这是进程等待I/O时发生的情况。该进程进行系统调用,例如 read() 设备确定没有可用数据。然后,它通过更新调度程序使用的数据结构,在内部使进程进入休眠状态。然后,调度程序执行其他进程,直到出现一个中断或其他唤醒原始进程的事件。然后,唤醒过程将再次符合调度的条件。

    另一方面 优先购买权 体系结构调度程序停止进程执行的能力 没有它的合作 . 中断可以发生在程序指令流的任何地方。控件返回到调度程序,调度程序随后可以执行其他进程并返回到中断(抢占)进程。大多数调度程序在允许进程运行到预定时间段的情况下分配时间片,如果更高优先级的进程需要时间片,则在该时间段之后它将被抢占。

    除非您正在编写驱动程序或内核代码,否则您不必太担心底层机制。在编写用户空间应用程序时,关键概念是(1)一些系统调用可能 这意味着您的进程将一直处于休眠状态直到事件发生,(2)在可抢占的系统(所有主流的现代操作系统)上,您的程序可能随时被抢占,以便其他进程可以运行。

    *请注意,在某些平台中,例如Linux, 线 实际上是与另一个进程共享其虚拟地址空间的另一个进程。因此,调度程序对进程和线程的处理完全相同。

        2
  •  2
  •   ivissani    6 年前

    我不清楚你的问题是关于理论还是实践。实际上,在每一个现代操作系统中,I/O操作都是特权操作。这意味着,为了让用户进程或线程访问文件、设备等,它必须发出系统调用。 然后内核就有机会做任何它认为合适的事情。例如,它可以检查I/O操作是否会阻塞,从而在发出操作后切换正在运行的(即__调用_调度程序)进程。 注意,即使内核没有处理计时器中断,这个机制也可以工作。总之,一般来说,这取决于您的系统。例如,在没有操作系统存在的嵌入式系统中(或最小的操作系统),在发出阻塞操作之前调用调度程序可能是用户代码的全部责任。

        3
  •  0
  •   Dražen GraÅ¡ovec    6 年前

    内核可以是抢占的,而不是调度程序。

    弗斯特 sched_yield() wait() 是的类型 自愿优先购买权 当进程本身发出CPU时,即使内核是非抢占的。

    如果内核能够在时间量过期或更高优先级的进程可以运行时切换到另一个进程,那么我们将讨论 非自愿优先购买权 即抢占内核,它可以发生在下面解释的不同地方。

    区别在于 谢德屈服() 进程保持在可运行状态 任务运行 状态,但只转到运行队列的末尾,因为它是静态优先级。进程必须等待再次获取CPU。

    另一方面, 等待() 使进程进入睡眠状态 任务不可中断 状态,在等待队列中,调用 schedule() 等待事件发生。当事件发生时,进程将再次移动到运行队列。但这并不意味着他们会立即得到CPU。

    这是什么时候解释的 调度() 可以在唤醒进程后调用:

    唤醒不会真正导致进入schedule()。他们添加了 任务到运行队列,就这样。 如果添加到运行队列的新任务抢占了当前任务 任务,然后wakeup设置tif_need重新扫描并schedule()获取 在最近可能的情况下打电话:

    • 如果内核是可抢占的(config_preempt=y):

      • 在系统调用或异常上下文中,在下一个最外面 抢占启用()。(这可能是在 旋转解锁()!)
      • 在IRQ上下文中,从中断处理程序返回到 可抢占的上下文
    • 如果内核不可抢占(未设置config_preempt) 接下来:

      • cond resched()调用
      • 显式schedule()调用
      • 从系统调用或异常返回到用户空间
      • 从中断处理程序返回到用户空间