同步(操作系统)

时间:2013-07-19 11:32:42

标签: operating-system semaphore

这是我在操作系统考试中遇到的问题。我无法找到合适的答案。有人可以帮忙.Given是一个同步代码,许多线程试图使用锁访问全局计数器 -

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 个答案:

答案 0 :(得分:0)

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

  • t1 检查lock,跳至else语句
  • 操作系统抢占 t1 并安排 t2
  • t2 检查lock,跳至else语句

我们在关键部分有两个主题。这就是为什么你需要某种原子测试和设置操作,或禁用抢占的能力,以正确地执行它。

对于活跃性,请考虑以下交错操作与两个线程 t1 t2

  • t1 检查lock,跳至else语句
  • t1 将锁定设为1
  • 操作系统抢占 t1 并安排 t2
  • t2 检查lock,找到1
  • 操作系统preemtps t2 并安排 t1
  • t1 lock设为0
  • t1 找不到线程等待,不做任何其他事情
  • 操作系统再次安排 t2
  • t2 开始等待......

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