2013-07-19 223 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(可能)永久等待。解決方案是讓同步原語跟蹤喚醒(例如信號量)或要求測試條件和等待是自動完成的(例如,互斥和條件變量)。