2015-06-19 33 views
-1

在有人问我采访的一个...信号灯队列如何保护与多线程

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

以上是信号灯等待执行(从其他线程复制)。 当多个线程尝试入队时(当它们无法获得锁定时),如何保护队列sem.L?更新队列之前我们是否锁定?

回答

1

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

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

只有在此核心或其他核心上运行代码时才会发生冲突。由于只有一个核心,唯一可能的冲突是代码运行在这种关怀之上。这将需要上下文切换。

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

+0

对不起......我的问题是,当我们没有得到锁,我们尝试将调用过程添加到队列中。该队列如何同步。我们是否为该队列加锁? –

+1

大卫已经解释过了。只有一个核心,禁止中断,不需要锁定,因为代码不会被中断,然后重新进入。我不明白David的答案,你需要一些计算机体系结构和操作系统内核功能的进一步知识。 –

+0

@SureshChowta它与来自其他内核的访问同步,因为没有其他内核。它通过禁止中断与其他代码在同一内核上运行同步 - 禁止中断,不可能发生上下文切换,因为只有中断可触发非自愿的上下文切换。了解这一点需要了解如何在低级别管理并发性 - 而不是没有内核编码经验的典型程序员的知识。问一个不需要内核开发知识的人是一个不好的问题。 –