multithreading - 事件/信号/等待句柄的操作系统实现

标签 multithreading events concurrency operating-system signals

出于好奇,我想知道操作系统如何实现等待事件/句柄等的唤醒线程。

例如,一个操作系统线程不断扫描等待句柄列表,并在必要时执行相应的线程。并不是说我相信它以这种方式实现,因为它看起来效率低下。

我认为操作系统更有可能在包含与公开的等待句柄/事件相关联的同步原语的内存区域上设置硬件中断,然后当它们被触发时,它可以小心地调度线程,不要多次调度它?

编辑

实际上,我想更具体地说,我想考虑的是什么,但还没有完全了解唤醒 sleep 核心以运行阻塞线程会发生什么?

最佳答案

为了详细理解它,您必须参加操作系统类(class)(或至少购买一本关于该主题的好书),因为它实际上涉及相当多的系统。

然而,基本上,它与线程状态的管理方式有关。线程在任何时候都是几种不同的状态之一: sleep 、就绪或运行(通常还有更多,但这就是本次讨论的目的所需要的全部)。处于运行状态的线程实际上正在运行,并且线程中的代码正在执行。处于“ sleep ”状态的线程未运行,调度程序将在决定下一个运行时跳过它。处于“就绪”状态的线程当前未运行,但是一旦另一个线程进入休眠状态或它的时间片用完,调度程序可以自由选择调度该线程进入运行状态。

所以基本上,当你对互斥对象调用“wait”时,操作系统会检查该对象是否已经被另一个线程拥有,如果是,则将当前线程的状态设置为“sleeping”,并将该线程标记为“waiting on”特定的互斥锁。

当拥有互斥锁的线程完成时,操作系统循环遍历所有等待它的线程并将它们设置为“就绪”。下次调度程序出现时,它会看到一个“就绪”线程并将其置于“运行”状态。线程开始运行并检查它是否可以再次获得互斥锁。这一次没有人拥有它,所以它可以继续它的快乐方式。

实际上,它比这要复杂得多,并且需要付出很多努力才能使系统尽可能高效(例如,为了避免唤醒线程只是为了让它立即返回 sleep 状态,以避免线程饿死在有许多其他线程等待的互斥锁上,等等)

关于multithreading - 事件/信号/等待句柄的操作系统实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3278653/

相关文章:

java - Kotlin 有多平台锁吗?

c++ - 为什么C++线程/future开销这么大

javascript - JavaScript 中的事件处理程序是否以 FIFO、LIFO 或并行方式触发一个事件?

c# - 如何找到转发器内的每个项目信息(在 ItemCommand 事件中) - 转发器数据源是一个 List<> 集合

java - 处理线程最大执行时间的最佳方法(在 Java 中)

java - 2个线程同时访问同步函数

c++ - 优化 VS2010 c++ 中的方法调用(多线程)

c#如何获取添加的事件?

javascript - 如何并发运行mongo脚本

concurrency - Go 的 range time.Tick 相当于什么?