【问题标题】:Synchronization (Operating Systems)同步(操作系统)
【发布时间】:2013-07-19 11:32:41
【问题描述】:

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

【问题讨论】:

  • lock=1 是什么意思? lock 的设置和测试应该是原子的吗?锁定是否与等待队列交互?
  • 当有人访问变量时,我认为 lock=1。有人不在时为0

标签: operating-system semaphore


【解决方案1】:

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

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

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

为了活跃度,考虑以下两个线程t1t2的交错操作:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-05
    • 1970-01-01
    • 1970-01-01
    • 2017-03-26
    • 2014-10-22
    • 2019-04-09
    • 1970-01-01
    • 2014-05-27
    相关资源
    最近更新 更多