2017-07-30 80 views
2

假設線程S稱爲semaphore.signal(),而線程W1,W2正在等待該信號量。信號量和上下文開關之間的相互作用

我知道信號量語義沒有提供關於三個線程將被調度的順序的保證。但是,爲了理解性能影響,我想弄清典型實現的行爲。

具體(常用信號量的實現):

  1. 都將W1和W2 獲得CPU 被喚醒,其中一人立即發現,它必須再次阻止,因此要回睡覺?

  2. S會從semaphore.signal()呼叫返回睡眠之前?或者只要它沒有撥打signal(),它會保持在CPU上?

回答

0

您的問題未指定。從W1

一個線程,W2將通過旗語信號設定準備好了,叫它「W」

會怎麼樣這是不清楚,因爲你不夠指定的調度器/調度程序配置和狀態。

如果有空閒的內核可用,S可能會繼續運行,並且W可能會被分派到備用內核中。

如果沒有可用的內核可用,W可以搶佔S:W被分派到正在運行S的核心,並且S設置就緒,等待內核運行。

如果沒有可用的內核,內核可能會搶佔另一個內核上運行的另一個線程,從而支持W.因此,S和W都將運行。

具體做法是:

都將W1和W2獲得CPU被喚醒,其中一人 立即發現,它必須再次阻止,因此要回 睡覺?

爲什麼任何操作系統會這樣做?這是一堆無益的額外工作。信號量接收到一個信號,所以一個線程出列並設置就緒。另一個仍然被阻塞,並在信號量線程隊列中等待另一個信號。沒有必要「喚醒」。

在S從信號燈返回之前將會睡眠() 調用?或者只要在沒有signal()調用的情況下保持 ,它會一直保持在CPU上?

信號線程S不需要離開運行狀態。如果OS內核調度算法和狀態可以在另一個內核上運行W,則S可以繼續運行。如果S被W搶佔,那麼它不再運行,並且卡在內核就緒隊列中,等待內核可用。 W可能已經準備就緒,不會被派遣,S可能會繼續。