2017-02-16 235 views
1

在閱讀操作系統三個簡單的小品我發現下面的句子:爲什麼自旋鎖對單個CPU沒有意義?

「要在一個處理器上正常工作,它需要一個搶佔式調度(即,一個將通過一個定時器中斷線程,在 爲了運行一個不同的線程,時不時),沒有 搶佔,旋轉鎖在單個CPU上沒有多少意義,因爲在CPU上旋轉的線程永遠不會放棄它。

爲什麼在單個CPU上運行的線程永遠不會放棄它,即使單個CPU支持多線程?是否因爲在這種情況下自旋鎖只會浪費太多的CPU資源? CPU內核數量如何影響不同鎖的性能,例如互斥鎖和自旋鎖?

+3

請注意它所說的部分:*「沒有搶佔,...」* –

+1

哦......明白了!謝謝!! –

回答

2

在單個CPU上,單核CPU仍然可以擁有多線程,但由於缺少多個執行單元,一次只能執行一個線程。沒有多個執行單元(硬件多線程),硬件依賴內核定義的「software multi-threading」策略 - 低級操作系統軟件來確定要執行什麼以及何時執行。

Preemption是一種涉及更加活躍的牧羊人(可以這麼說)的策略,沿着單個路徑的這些多個執行流通常部分地通過使用基於定時器的中斷來實現。與搶佔相反 - cooperative scheduling - 採用更加自由放任的方式,將其留給活動線程以表示完成。

結果的協同調度方案允許一個線程進程的線程持有的唯一計算資源(在這種情況下)更長:

enter image description here

但是,如果活動線程在這樣的計劃是否試圖永遠保持活躍?實質上,這就是發生在這裏的事情。

自旋鎖是主動等待鎖定請求的資源。線程只會坐在那裏等待其他線程鎖定要放棄它的資源。正如文本指出硬件情況一次只允許一個活動線程,如果請求的資源被鎖定,這意味着它被一個不活動的線程鎖定。

如果不搶佔,則由線程決定何時停止執行。因此,當活動線程自旋鎖定時,它將永遠坐在那裏 - 所謂的掛起。爲了阻止這種情況,用戶可能會被迫關閉清理緩存/動態內存的系統。

先佔調度線程實現爲time slices。在線程完成進一步的工作之前,需要訪問特定的資源時,忙碌的等待是有道理的。

隨着搶佔,內核將在指定的時間後自動force context switch,所以即使使用單個CPU也不會有掛起。最終,資源爲lock的線程將獲得一些時間並釋放其資源。當自旋鎖線程獲得下一個計劃時間時,它將能夠鎖定資源並繼續。

總體而言,這意味着更少的掛起。

然而,自旋鎖仍可能遭受與搶佔式調度更復雜的問題,如死鎖......當兩個線程分別按住對方的資源spinlocked:

enter image description here

然而,這樣的情況是通常可以通過資源鎖定請求上的內核保護來避免。

在完美的世界裏,仔細設計線程的合作計劃可能會導致關鍵進程的執行速度加快。因此,它是像Mac OS和Windows 3.x這樣的瘦老式操作系統的常用方法。但隨着計算需求的增加,避免協作調度的缺點變得越來越難,因此幾乎所有現代操作系統內核都使用搶先式調度程序。

+1

謝謝您提供一些見解 – LWimsey

+0

很高興爲您提供幫助!花了我一段時間尋找令人滿意的照片,但我認爲這些特定的照片提供了一些良好的視覺關係的討論。 –