2017-02-05 35 views
0

根據我的知識,鎖定互斥鎖的過程是必須解鎖互斥鎖的過程。我的疑問是,處理器如何知道要解鎖哪個進程?是否有任何數據結構可以保存pid(或)某個特別的進程(內部)在waitque中?所以,處理器只能解鎖特定的進程。在互斥鎖中,處理器(CPU)如何知道要解鎖哪個進程?

請給答覆。這是我的一個採訪中提出的問題。

+0

你問的線程/進程等待互斥量得到內核調度運行自主的「測試和設置」CPU命令試圖獲得互斥量?我不相信哪個線程會首先獲得互斥體,因此可能會有多個功能實現。 –

回答

0

得到互斥量的線程/進程是唯一一個在代碼中向前移動的線程。後來在該線程的代碼中應該有一個互斥體的版本。沒有互斥鎖的其他線程/進程將等待它,以便它們不會將其釋放或釋放,直到1運行進程進入互斥鎖釋放。

0

處理器如何知道哪個進程解鎖?

處理器什麼都不知道;它只是盲目地執行已經提供給它的機器指令鏈。

另一方面,線程庫經過精心設計以處理這類事情。另外,每個現代/多任務操作系統都包含一個在啓動時加載到內存中的線程調度程序,它管理哪些線程可以運行,以及何時運行。它與線程庫一起工作來正確處理鎖定/解鎖問題。

所以問題就變成了:操作系統軟件如何知道當互斥鎖被解鎖時下一個線程會被喚醒?

當然,實際的實現會隨着操作系統的不同而變化,但從概念上講,您可以想象每個互斥對象包含鏈接列表,並且當線程試圖鎖定已鎖定的互斥鎖時,線程將其自身添加到尾部的鏈接列表,然後告訴調度程序把它(線程)休眠。

後來,當解鎖互斥鎖時,解鎖例程將第一個睡眠線程(如果有)從鏈接列表中彈出,重新將該互斥鎖的所有權分配給該線程,然後要求調度程序喚醒該線程儘快。 (注意:真實世界的實現可能會比這更復雜一點,因爲它需要小心以避免競爭條件並最大限度地提高性能,但我認爲這可以讓你瞭解它是如何完成的請注意,在這個示例實現中,線程會以先到先得的方式獲取互斥鎖,即按照與lock()相同的順序獲取互斥鎖,但在許多現實世界的實現中,不能保證排序,所以你不應該依賴它)

+0

thanku你的答覆...我明白你說什麼..當你提到「重新分配互斥體的所有權到該線程」時,你的意思是什麼? @Jeremy Friesner – sravanthi

+0

@sravanthi只有一個線程一次擁有互斥鎖;擁有互斥體的線程被認爲是互斥體的擁有者。當lock()在線程中返回時,保證該線程是互斥量的所有者。因此,如果線程B在lock()內部等待,因爲線程A是互斥體的所有者,線程A調用互斥體上的unlock(),那麼線程B將成爲互斥體的所有者,線程B的鎖()調用將返回,以便線程B可以恢復執行。 –

+0

非常感謝你的答覆... @傑里米弗里斯納 – sravanthi