2013-07-19 166 views
-1

这是我在操作系统考试中遇到的一个问题。我无法弄清楚它的正确答案。可有人help.Given采用锁相同步,其中许多线程试图访问一个全局计数器g的代码同步(操作系统)

if(lock==1) 
wait(); //sleep this thread until some other thread wakes up this thread 
else 
lock=1; //enter in protected area     
//access global counter g// 
lock=0; 
//wake up some other thread which is waiting for the lock to be released 

什么是上面同步的问题?选择下面给出的选项中的任何一个

  1. 同步很好,并且可以正常运行。
  2. 只能在单处理器系统上运行,而不能在多处理器系统上运行。
  3. 不会在任何系统上运行
  4. 不能说。需要更多数据
+1

'lock = 1'是什么意思?锁的设置和测试应该是原子的吗?锁定是否与等待队列交互? –

+0

当有人访问变量时,我认为lock = 1。当有人不是时,它是0 – Akshit

回答

0

答案是3.只要线程可以被抢占,此代码在安全性和活跃性方面都会失败。为了安全起见,可以考虑以下的操作交错带两个线程T1T2

  • T1检查lock,跳到else语句
  • OS抢占T1和时间表T2
  • t2检查lock,跳到else语句

而且我们在关键部分有两个线程。这就是为什么您需要某种原子测试和设置操作,或者需要禁用先占功能才能正确执行。

活跃度,可以考虑以下的操作交错带两个线程T1T2

  • T1检查lock,跳到else语句
  • T1套锁定1
  • OS抢占t1和时间表个T2
  • T2检查lock,发现1个
  • OS preemtps T2和时间表T1
  • T1设置lock至0
  • T1发现没有线程等待和不执行任何否则
  • 操作系统时间表t2再次
  • t2开始等待......

因此t2(可能)永久等待。解决方案是让同步原语跟踪唤醒(例如信号量)或要求测试条件和等待是自动完成的(例如,互斥和条件变量)。