【发布时间】:2018-05-03 11:47:58
【问题描述】:
我知道当用户线程获取锁(如事件、信号量等)时,内核会将线程的状态更改为等待,因此线程不会被调度运行,直到内核发现锁是可用的。 我的问题是内核如何捕获这些锁的状态?通过投票或通知?
【问题讨论】:
标签: linux-kernel operating-system kernel
我知道当用户线程获取锁(如事件、信号量等)时,内核会将线程的状态更改为等待,因此线程不会被调度运行,直到内核发现锁是可用的。 我的问题是内核如何捕获这些锁的状态?通过投票或通知?
【问题讨论】:
标签: linux-kernel operating-system kernel
通过通知。在线程进入睡眠状态之前,它会将自己添加到唤醒列表中,以查找与其等待的对象相对应的任何内核对象。
这与所有其他等待的工作方式完全相同。例如,进程对文件进行阻塞读取,并且进程必须休眠直到读取完成。或者说该进程访问了一些尚未从磁盘读取的代码。在所有这些情况下,当进程将自己置于睡眠状态时,都会将其添加到适当的唤醒通知方案中。
【讨论】:
您要问的是高度系统特定和锁定特定。例如,高质量的操作系统具有可以检测死锁的锁管理工具。
有些锁可能被实现为自旋锁,没有进程休眠,也没有操作系统通知。
在等待挂起进程的情况下,操作系统需要跟踪的只是锁本身。如果一个进程释放了锁,操作系统可以向所有等待的进程发送一个通知——不需要轮询。
【讨论】: