gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 11:33:21 25 4
gpt4 key购买 nike

当执行用户代码的线程正在等待输入时,调度程序如何知道中断它或线程如何知道调用调度程序,因为简单的单线程应用程序的普通程序员不太可能在任何地方插入 sched_yield()。编译器是在优化时插入 sched_yield() 还是线程只是自旋锁定直到调度程序设置的通用定时器中断触发,或者用户是否必须显式声明 wait()、sleep() 函数以便上下文切换?

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

最佳答案

注意不要将抢占与进程休眠的能力混淆。即使使用非抢占式调度程序,进程也可以休眠。这就是进程等待 I/O 时发生的情况。进程进行系统调用,如 read()并且设备确定没有数据可用。然后它通过更新调度程序使用的数据结构在内部使进程进入休眠状态。调度程序然后执行其他进程,直到发生唤醒原始进程的中断或其他事件。然后被唤醒的进程再次有资格进行调度。

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

除非您正在编写驱动程序或内核代码,否则您无需过多担心底层机制。在编写用户空间应用程序时,关键概念是 (1) 某些系统调用可能会阻塞,这意味着您的进程会在事件发生之前进入休眠状态,以及 (2) 在可抢占系统(所有主流现代操作系统)上,您的程序可能随时抢占,以便其他进程可以运行。

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

关于multithreading - 调度器如何知道线程被阻塞等待输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53351944/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com