【问题标题】:How does os kernel keep track of the locks that user threads are waiting on?操作系统内核如何跟踪用户线程正在等待的锁?
【发布时间】:2018-05-03 11:47:58
【问题描述】:

我知道当用户线程获取锁(如事件、信号量等)时,内核会将线程的状态更改为等待,因此线程不会被调度运行,直到内核发现锁是可用的。 我的问题是内核如何捕获这些锁的状态?通过投票或通知?

【问题讨论】:

    标签: linux-kernel operating-system kernel


    【解决方案1】:

    通过通知。在线程进入睡眠状态之前,它会将自己添加到唤醒列表中,以查找与其等待的对象相对应的任何内核对象。

    这与所有其他等待的工作方式完全相同。例如,进程对文件进行阻塞读取,并且进程必须休眠直到读取完成。或者说该进程访问了一些尚未从磁盘读取的代码。在所有这些情况下,当进程将自己置于睡眠状态时,都会将其添加到适当的唤醒通知方案中。

    【讨论】:

    • 感谢您的回复!我知道该进程是由内核通知的。但是我想知道的是内核而不是用户进程如何知道锁可用的时间。您给出的示例是磁盘读取,我认为这是由硬件中断。但是os提供的锁,比如semaphone、event、mutex呢?和硬件有关系吗?
    • @burning 同样的事情。没有区别。无论内核代码解锁了什么线程被阻塞的东西,它还会检查解锁该事物时要唤醒的事物列表——线程进入睡眠时添加自己的列表。
    【解决方案2】:

    您要问的是高度系统特定和锁定特定。例如,高质量的操作系统具有可以检测死锁的锁管理工具。

    有些锁可能被实现为自旋锁,没有进程休眠,也没有操作系统通知。

    在等待挂起进程的情况下,操作系统需要跟踪的只是锁本身。如果一个进程释放了锁,操作系统可以向所有等待的进程发送一个通知——不需要轮询。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-19
      • 2014-03-20
      • 2014-10-15
      • 1970-01-01
      • 1970-01-01
      • 2016-05-18
      • 2014-04-23
      • 2014-02-01
      相关资源
      最近更新 更多