在維基百科中,關於自旋鎖的主題。spinlocked線程如何避免上下文切換的開銷?
因爲它們避免了操作系統進程重新調度或上下文切換的開銷,所以如果線程可能僅在短時間內被阻塞,則自旋鎖效率很高。
我居然無法把握這句話。 我認爲,即使線程有螺旋鎖,它將被重新安排,我錯了嗎?
上下文切換開銷 - 保存寄存器,調度隊列 - 對於所有交換機都是不變的,不是嗎?
在維基百科中,關於自旋鎖的主題。spinlocked線程如何避免上下文切換的開銷?
因爲它們避免了操作系統進程重新調度或上下文切換的開銷,所以如果線程可能僅在短時間內被阻塞,則自旋鎖效率很高。
我居然無法把握這句話。 我認爲,即使線程有螺旋鎖,它將被重新安排,我錯了嗎?
上下文切換開銷 - 保存寄存器,調度隊列 - 對於所有交換機都是不變的,不是嗎?
我居然無法把握這句話。我認爲,即使線程 有一個自旋鎖,它將被重新安排,我錯了嗎?
最終它會是......當它的時間片過期時。
什麼是自旋鎖可以避免的是,只要線程嘗試獲取並且該鎖已被另一個線程鎖定,線程就立即獲取上下文的機會。 (在傳統互斥體的情況下,當互斥體已經被鎖定時,線程立即被置於睡眠狀態,即上下文切換出來,並且直到另一個線程解鎖了互斥鎖之後纔會重新喚醒。在OTOH的情況下,線程會繼續檢查自旋鎖的狀態,直到自旋鎖不再被鎖定,然後線程會自行鎖定自旋鎖。請注意,在此過程中的任何時刻線程都不會詢問內核讓線程進入睡眠狀態,但如果它旋轉很長一段時間,內核可能會這樣做......但是使用自旋鎖的程序無論如何都不會鎖定它們,因爲旋轉效率真的很低)
上下文切換頭 - 這是保存寄存器,調度隊列 - 對於所有交換機是不變的,不是嗎?
是的,我相信是的。
謝謝,但第二個問題呢? –
查看更新的答案。 –
最終,當它的時間片過期時......或者它被許多類中斷中的另一個從運行集中刪除。定時器中斷只是導致線程丟失執行的一個可能原因,並給予它不必要的關注,和/或沒有提及其他可能性,只是增加了FUD :( –
通常一個操作系統只會在中斷服務程序中使用自旋鎖。這些設計的時間很短。
我居然無法把握這句話。我認爲,即使線程有螺旋鎖,它將被重新安排,我錯了嗎?
不是在處理中斷時(這裏簡化爲只有一個IPL)。該中斷可能是發生上下文切換的定時器中斷。但是,在這種情況下,自旋鎖等待將是處理上下文切換所需的資源。
正在旋轉的線程(即繁忙的等待)假定待鎖定的鎖將立即釋放,但保持在其時間片中。因此,通過等待鎖定而不是立即跳入等待狀態,從而導致上下文切換(因爲線程放棄了其餘的時間片),線程將嘗試通過忙於等待有限時間來避免上下文切換時間。 –
通常,他們不。 –
有一組有限的條件使得自旋鎖優於內核鎖。短時間爭用的可能性就是其中之一。 –