-1

在一次采访中,有人问我...

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

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

4

1 回答 1

1

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

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

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

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

于 2015-06-19T08:14:23.377 回答