根據我的知識,鎖定互斥鎖的過程是必須解鎖互斥鎖的過程。我的疑問是,處理器如何知道要解鎖哪個進程?是否有任何數據結構可以保存pid(或)某個特別的進程(內部)在waitque中?所以,處理器只能解鎖特定的進程。在互斥鎖中,處理器(CPU)如何知道要解鎖哪個進程?
請給答覆。這是我的一個採訪中提出的問題。
根據我的知識,鎖定互斥鎖的過程是必須解鎖互斥鎖的過程。我的疑問是,處理器如何知道要解鎖哪個進程?是否有任何數據結構可以保存pid(或)某個特別的進程(內部)在waitque中?所以,處理器只能解鎖特定的進程。在互斥鎖中,處理器(CPU)如何知道要解鎖哪個進程?
請給答覆。這是我的一個採訪中提出的問題。
得到互斥量的線程/進程是唯一一個在代碼中向前移動的線程。後來在該線程的代碼中應該有一個互斥體的版本。沒有互斥鎖的其他線程/進程將等待它,以便它們不會將其釋放或釋放,直到1運行進程進入互斥鎖釋放。
處理器如何知道哪個進程解鎖?
該處理器什麼都不知道;它只是盲目地執行已經提供給它的機器指令鏈。
另一方面,線程庫經過精心設計以處理這類事情。另外,每個現代/多任務操作系統都包含一個在啓動時加載到內存中的線程調度程序,它管理哪些線程可以運行,以及何時運行。它與線程庫一起工作來正確處理鎖定/解鎖問題。
所以問題就變成了:操作系統軟件如何知道當互斥鎖被解鎖時下一個線程會被喚醒?
當然,實際的實現會隨着操作系統的不同而變化,但從概念上講,您可以想象每個互斥對象包含鏈接列表,並且當線程試圖鎖定已鎖定的互斥鎖時,線程將其自身添加到尾部的鏈接列表,然後告訴調度程序把它(線程)休眠。
後來,當解鎖互斥鎖時,解鎖例程將第一個睡眠線程(如果有)從鏈接列表中彈出,重新將該互斥鎖的所有權分配給該線程,然後要求調度程序喚醒該線程儘快。 (注意:真實世界的實現可能會比這更復雜一點,因爲它需要小心以避免競爭條件並最大限度地提高性能,但我認爲這可以讓你瞭解它是如何完成的請注意,在這個示例實現中,線程會以先到先得的方式獲取互斥鎖,即按照與lock()相同的順序獲取互斥鎖,但在許多現實世界的實現中,不能保證排序,所以你不應該依賴它)
你問的線程/進程等待互斥量得到內核調度運行自主的「測試和設置」CPU命令試圖獲得互斥量?我不相信哪個線程會首先獲得互斥體,因此可能會有多個功能實現。 –