我很好奇操作系统如何实现唤醒等待事件/句柄的线程。
例如,假设一个操作系统线程不断扫描等待句柄列表,并在必要时执行相应的线程。我认为这种实现方式不太可能,因为它似乎效率低下。
我认为更可能的是,操作系统会在包含与公开等待句柄/事件关联的同步原语的一段内存上设置硬件中断,然后当它们被触发时,可以谨慎地安排线程调度,以确保不会多次调度。
编辑
实际上,我想更具体地思考的是:是什么唤醒了正在睡眠的核心以运行阻塞的线程?
我很好奇操作系统如何实现唤醒等待事件/句柄的线程。
例如,假设一个操作系统线程不断扫描等待句柄列表,并在必要时执行相应的线程。我认为这种实现方式不太可能,因为它似乎效率低下。
我认为更可能的是,操作系统会在包含与公开等待句柄/事件关联的同步原语的一段内存上设置硬件中断,然后当它们被触发时,可以谨慎地安排线程调度,以确保不会多次调度。
编辑
实际上,我想更具体地思考的是:是什么唤醒了正在睡眠的核心以运行阻塞的线程?
入门教材的答案是,当一个线程等待事件发生而睡眠时,它会被放入等待线程队列中。线程被标记为“等待”,因此操作系统的进程调度程序在寻找要在处理器上运行的内容时跳过该线程。最终(在正确的程序中),另一个线程将唤醒等待事件队列中的一个或所有线程。然后这些线程被标记为“就绪”,操作系统再次开始调度它们。
当然,实际实现起来相当棘手。我想这才是你真正的问题。对于Linux,你寻找的机制称为futex,它们对我来说过于复杂了,我无法在此做出公正评价。如果维基百科中的简介引起了您的兴趣,请深入研究该词条底部的外部链接。
我认为实现更简单,一个线程被放在等待线程列表中(所有正在等待某个事件/句柄/互斥锁的线程)。当同步原语唤醒时,所有线程都将转移到运行状态并清除该列表。