一、同步和互斥的概念
1.1、同步
????????訪問(wèn)資源在安全的前提下,具有一定的順序性,就叫做同步。在多道程序系統(tǒng)中,由于資源有限,進(jìn)程或線程之間可能產(chǎn)生沖突。同步機(jī)制就是為了解決這些沖突,保證進(jìn)程或線程之間能夠按照既定的順序訪問(wèn)共享資源。同步機(jī)制有助于避免競(jìng)態(tài)條件和死鎖(deadlock)等問(wèn)題,確保系統(tǒng)的穩(wěn)定性和可靠性。
1.2、互斥
????????在訪問(wèn)一部分共享資源的時(shí)候,任何時(shí)刻只有我一個(gè)人訪問(wèn),就叫做互斥。當(dāng)某一進(jìn)程或線程正在訪問(wèn)某臨界區(qū)(即共享資源)時(shí),就不允許其他進(jìn)程或線程進(jìn)入,這樣可以避免數(shù)據(jù)沖突和不一致?;コ鈾C(jī)制有助于保證同一時(shí)間只有一個(gè)線程或進(jìn)程能夠訪問(wèn)被保護(hù)的臨界區(qū),從而確保數(shù)據(jù)的一致性和完整性。
二、臨界資源和臨界區(qū)的概念
2.1、臨界資源
????????被保護(hù)起來(lái)的,任何時(shí)刻只允許一個(gè)執(zhí)行訪問(wèn)的公共資源就叫做臨界資源。這類資源在某一時(shí)刻只能有一個(gè)進(jìn)程或線程占用,如果多個(gè)進(jìn)程或線程試圖同時(shí)訪問(wèn)臨界資源,可能會(huì)引發(fā)數(shù)據(jù)沖突或不一致。物理設(shè)備如打印機(jī)、輸入機(jī)等都屬于臨界資源。
2.2、臨界區(qū)
訪問(wèn)臨界資源的代碼,我們叫做臨界區(qū)。臨界區(qū)的訪問(wèn)需要遵循一定的調(diào)度原則,如空閑讓進(jìn)、忙則等待等,以確保資源的正確和高效利用。所謂的保護(hù)公共資源(臨界資源)的本質(zhì)就是程序員保護(hù)臨界區(qū)。
三、認(rèn)識(shí)信號(hào)量
3.1、信號(hào)量的本質(zhì)
????????信號(hào)量本質(zhì)是一個(gè)計(jì)數(shù)器,是一個(gè)描述臨界資源數(shù)量的計(jì)數(shù)器。進(jìn)程要訪問(wèn)臨界資源的時(shí)候,必須先申請(qǐng)信號(hào)量,申請(qǐng)信號(hào)量成功了才能繼續(xù)往下走,否則就要進(jìn)行阻塞或掛起等待。信號(hào)量的值表示了可用資源的數(shù)量或等待訪問(wèn)該資源的進(jìn)程/線程數(shù)。當(dāng)進(jìn)程或線程需要訪問(wèn)共享資源時(shí),會(huì)先檢查信號(hào)量的值。如果信號(hào)量的值大于0,表示還有可用的資源,進(jìn)程或線程可以繼續(xù)執(zhí)行并訪問(wèn)資源,同時(shí)信號(hào)量的值會(huì)減1。如果信號(hào)量的值為0,表示所有資源都已被占用,進(jìn)程或線程需要等待,直到有其他進(jìn)程或線程釋放資源并將信號(hào)量的值增加。訪問(wèn)完臨界資源進(jìn)程要釋放信號(hào)量,即信號(hào)量加1。當(dāng)信號(hào)量的初始值為1時(shí),就實(shí)現(xiàn)了互斥的功能。
3.2、普通的整形變量無(wú)法實(shí)現(xiàn)信號(hào)量的效果
原因有兩個(gè):
- 信號(hào)量本身就是共享資源,本身就是要被多個(gè)進(jìn)程或線程共同可以看到的,但是一個(gè)普通整形變量無(wú)法同時(shí)被多個(gè)進(jìn)程看到,就算是父子進(jìn)程,當(dāng)要改變進(jìn)程數(shù)據(jù)時(shí)都要發(fā)生寫時(shí)拷貝,因此無(wú)法讓多個(gè)進(jìn)程看到同一個(gè)變量。
- 對(duì)整形變量做++和--操作,這個(gè)操作不是原子的。
這里又設(shè)計(jì)一個(gè)概念叫原子性。
3.3、原子性的概念
????????在操作系統(tǒng)中,原子性是指一個(gè)操作或一系列操作是不可中斷的,要么全部執(zhí)行成功,要么全部不執(zhí)行,中間不能被其他進(jìn)程或線程干擾。換句話說(shuō),原子操作是不可分割的,具有“同生共死”的特性,即要么完全執(zhí)行,要么完全不執(zhí)行,沒(méi)有中間狀態(tài)。上面的對(duì)一個(gè)整形做++或--操作實(shí)際上是先將內(nèi)存中的一個(gè)整形變量的值先拷貝到CPU的寄存器中,在寄存器中對(duì)該變量做++操作然后再將該變量拷貝會(huì)內(nèi)存當(dāng)中,我們也可以看到,這中間其實(shí)經(jīng)歷了三個(gè)過(guò)程,換句話說(shuō),++或--操作不具備原子性。原子性在并發(fā)編程中尤為重要,特別是在共享資源的讀寫操作中。當(dāng)多個(gè)線程或進(jìn)程同時(shí)訪問(wèn)和修改共享資源時(shí),如果操作不是原子的,就可能導(dǎo)致數(shù)據(jù)不一致的問(wèn)題。原子性確保了即使在多線程環(huán)境下,一個(gè)操作一旦開始就不會(huì)被其他線程干擾,從而保證了數(shù)據(jù)的一致性。
3.4、信號(hào)量操作的接口
3.4.1、獲取信號(hào)量
????????key就類似于共享內(nèi)存中使用ftok函數(shù)產(chǎn)生的key,nsems表示要產(chǎn)生幾個(gè)信號(hào)量,semflg表示如何創(chuàng)建,與共享內(nèi)存的第三個(gè)參數(shù)同理,可參考本人上一篇博客,返回值為該信號(hào)量集標(biāo)識(shí)符,這是通過(guò)semget函數(shù)創(chuàng)建或獲取信號(hào)量集時(shí)返回的IPC標(biāo)識(shí)符。
3.4.2、控制/刪除信號(hào)量
?
????????semid表示該信號(hào)量集標(biāo)識(shí)符。semnum表示信號(hào)量的編號(hào),用于指定信號(hào)量集中的某個(gè)特定的信號(hào)量,第一個(gè)信號(hào)量的編號(hào)是0。cmd表示需要執(zhí)行的命令,IPC_RMID為刪除命令。
3.4.3、對(duì)信號(hào)量進(jìn)行PV操作
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-857825.html
????????sops指向存儲(chǔ)信號(hào)操作結(jié)構(gòu)的數(shù)組指針。在這個(gè)數(shù)組中的每個(gè)sembuf結(jié)構(gòu)體對(duì)應(yīng)一個(gè)特定信號(hào)的操作。?這是sops數(shù)組中sembuf結(jié)構(gòu)的數(shù)量。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-857825.html
到了這里,關(guān)于【Linux】詳解進(jìn)程通信中信號(hào)量的本質(zhì)&&同步和互斥的概念&&臨界資源和臨界區(qū)的概念的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!