在多处理器的情况下,了解原子锁操作的问题



在单局部处理器的情况下,我们在执行锁操作之前禁用中断(锁定,锁定释放)以防止上下文切换,然后在操作后我们重新启用它。

但是,在多处理器CPU的情况下,仅禁用中断不足以使锁操作原子。

我从一个来源阅读,"当每个处理器都有一个缓存时,它也会发生,即使被禁用了中断,它们也可以写入相同的内存。"

Q1。为什么在原子锁操作的情况下这甚至很重要?

Q2。在多处理器环境中实施锁定操作时,出现了哪些其他问题?

仅禁用中断是不够的,因为在多处理器上运行的线程仍然可以同时访问同步对象的功能中的数据结构和代码,因此无法通过仅通过仅通过仅实现原子。禁用中断。

例如,让L为锁定对象,L.Status为"免费",A X是一个具有四个线程T1,T2,T3,T4的过程,并且每个过程都在单独的处理器P1,P2,P2,P3,P4。

让我们假设lock :: aceaire()的伪代码如下,

 LOCK::acquire(){
       if(status==BUSY){
           lock.waitList.add(RunningThread);
           TCB t == readyList.remove(); 
           thread_switch(RunningThread,t);
           t.state=running;    
        }
       else{
          status=BUSY; 
       }

}

如果我们仅禁用中断,则T1,T2,T3,T4的代码仍然可以在相应的处理器上运行。让我们假设锁定是免费的。

如果所有线程都试图同时获取锁-L,则可能最终会同时检查锁状态,在这种情况下,每个线程都会找到状态=="免费",每个线程都将获取锁,这将消除当前锁实现的适用性。

这就是为什么在实现多处理器的锁定对象时使用不同的原子操作,例如test_and_set。这些原子操作只能一次从一个多处理器访问锁定的代码中进行一个线程。

最新更新