-1

这是我在操作系统考试中遇到的问题。我想不出它的正确答案。有人可以帮忙吗。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. 不能说。需要更多数据
4

1 回答 1

0

答案是 3。只要线程可以被抢占,这段代码在安全性和活跃性上都会失败。为安全起见,请考虑以下两个线程t1t2的交错操作:

  • t1检查lock,跳到 else 语句
  • 操作系统抢占t1并调度t2
  • t2检查lock,跳到 else 语句

我们在临界区有两个线程。这就是为什么您需要某种原子测试和设置操作或禁用抢占的能力才能正确执行此操作的原因。

对于活跃度,请考虑以下两个线程t1t2的交错操作:

  • t1检查lock,跳到 else 语句
  • t1将锁定设置为 1
  • 操作系统抢占t1并调度t2
  • t2检查lock,找到 1
  • 操作系统 preemtps t2和调度t1
  • t1设置lock为 0
  • t1发现没有线程等待并且什么也不做
  • 操作系统再次安排t2
  • t2开始等待...

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

于 2013-07-19T14:09:33.783 回答