【问题标题】:How is semaphore queue protected with multiple threads信号量队列如何被多线程保护
【发布时间】:2015-09-05 03:25:49
【问题描述】:

在一次采访中我被问到...

Wait(semaphore sem) {                           
   DISABLE_INTS
   sem.val--
   if (sem.val < 0){
      add thread to sem.L
      block(thread)
    }
ENABLE_INTS

以上是信号量等待实现(从其他线程复制)。 当多个线程尝试入队时(当它们未能获得锁时),队列 sem.L 如何受到保护?在更新队列之前我们会加锁吗?

【问题讨论】:

    标签: multithreading operating-system binary-semaphore


    【解决方案1】:

    这是一个只有一个核心的系统的实现。通过在关键部分禁用中断来管理并发性。这就是代码中的“DISABLE_INTS”和“ENABLE_INTS”。

    除非您正在面试为单核系统开发多任务操作系统代码的职位,否则这是一个奇怪的问题。也许面试官希望你就代码提出问题,看看你是否能理解在什么情况下这样做才有意义。

    只有在此内核或另一个内核上运行的代码才会发生冲突。由于只有一个核心,唯一可能的冲突是运行在此护理上的代码。这需要上下文切换。

    上下文切换有两种形式,自愿和非自愿。当代码明确要求进行上下文切换时,就会发生自愿上下文切换。此代码不要求上下文切换,因此这不是问题。非自愿上下文切换只能由中断触发,并且此代码在其临界区禁用中断。这是在单核系统的内核代码中实现“锁”的典型方式。

    【讨论】:

    • Sorry...我的问题是,当我们没有获得锁时,我们尝试将调用进程添加到队列中。该队列如何同步。我们是否为该队列加锁?
    • 大卫已经解释过了。只有一个内核,并且中断被禁用,因此不需要锁定,因为代码不能被中断然后重新输入。如果您不明白 David 的回答,您需要进一步了解计算机体系结构和操作系统内核功能。
    • @SureshChowta 它与来自其他核心的访问同步,因为没有其他核心。它通过禁用中断与在同一内核上运行的其他代码同步——禁用中断后,不可能进行上下文切换,因为只有中断才能触发非自愿的上下文切换。理解这一点需要了解如何在低级别管理并发——而不是没有内核编码经验的典型程序员所具备的知识。问一个不应该有内核开发知识的人是个糟糕的问题。
    • @DavidSchwartz 感谢您试图让我理解。为什么我们在这里只讨论单核。我的代码或实现没有提及任何相关内容。不是吗?在多核系统的情况下,运行在不同内核上的其他线程试图排队到同一个 Q 会发生什么情况。
    • @SureshChowta "我的代码或实现没有提及任何关于此的内容。" 它通过将禁用中断视为锁来实现,它只有效在单核系统上。 “在多核系统的情况下,运行在不同内核上的其他线程试图加入同一个 Q 队列时会发生什么情况?”我们使用适合这种情况的不同代码。由于此代码不适合这种情况,因此如果我们处于这种情况,我们不会使用它。
    猜你喜欢
    • 1970-01-01
    • 2022-12-05
    • 2010-10-15
    • 1970-01-01
    • 2010-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多