2011-08-15 42 views
6

我知道在Linux的互斥作爲futexes的樓下和futex的使用比較並交換機制來實現。通常,爲了獲取鎖,用戶空間線程不需要進行系統調用,因爲鎖在用戶空間中得到了解決。互斥訪問和系統調用

現在我的問題是什麼時候發生高爭用和許多線程試圖鎖定互斥鎖在同一時間。是否發生系統調用,然後內核決定哪個線程授予互斥量?特別是當線程優先級不同時?我自己也這麼認爲。

回答

7

只要沒有爭用,就沒有系統調用。如果存在爭用,則進行系統調用以將線程置於睡眠隊列中,然後該睡眠隊列將用於在互斥體變爲空閒時查找第一個線程以喚醒。此外,在系統調用中對futex的值進行調整,以便當前擁有的線程不會經過用戶登陸「快速路徑」解鎖例程(它只是將futex重置爲零或「解鎖」值),但是會進行另一個系統調用來檢查睡眠隊列中的等待線程是否將鎖擁有權交給了鎖。隨着更多的線程爭奪鎖定,當然會發現爭用的可能性更高,但是如果沒有爭用,那麼就不會有系統調用。

3

在退回到系統調用之前,互斥鎖只會執行少量循環,因此在高鎖定情況下,線程回退到系統調用的可能性很高。