tips:system V 是一套標(biāo)準(zhǔn),共享內(nèi)存,信號量,消息隊列屬于system V。
一、共享內(nèi)存的弊端
進(jìn)程A和進(jìn)程B進(jìn)行通信時,假如進(jìn)程A向物理內(nèi)存的共享區(qū)寫入"Hello World",但是當(dāng)進(jìn)程A寫入了"Hello"時,進(jìn)程B就向內(nèi)存讀取了,所以只讀取到了"Hello",這就導(dǎo)致進(jìn)程A想向進(jìn)程B發(fā)送的信息,進(jìn)程B讀取不完整,導(dǎo)致了數(shù)據(jù)的不完整!
因?yàn)楣蚕韮?nèi)存是沒有任何保護(hù)機(jī)制的??!
不同于管道,管道擁有同步和互斥問題,可以解決數(shù)據(jù)不一致問題。
為了解決上述問題,先引入幾個概念。
新概念引入
- 1.當(dāng)A和B看到的同一份資源,這份資源叫做共享資源,如果不加保護(hù),可能會導(dǎo)致數(shù)據(jù)不一致問題。
- 2.只允許一個執(zhí)行流訪問共享資源,那么這份資源就具有互斥功能。
- 3.如果一份資源,任何時刻只允許一個執(zhí)行流訪問,這份資源叫做臨界資源。而臨界資源,一般是內(nèi)存。比如管道也是臨界資源。
- 4.假如有100行的代碼,我們此時在實(shí)現(xiàn)通過管道進(jìn)行進(jìn)程間通信,而我們訪問管道的方式就是通過代碼訪問的,管道又是臨界資源,所以訪問管道的那幾行代碼,5~10行代碼,才是在訪問臨界資源,而訪問臨界資源的這部分代碼,叫做臨界區(qū)。
為什么在多進(jìn)程,多線程并發(fā)打印時,打印的內(nèi)容是錯亂的??
多個進(jìn)程要向同一塊顯示器上打印信息,就先保證所有進(jìn)程都看到同一份資源。而顯示器也是文件,也屬于一份共享資源,由于沒有加以任何保護(hù),在進(jìn)程1打印的同時,進(jìn)程2也向顯示器文件打印,就造成了混亂問題。
二、理解信號量
信號量的本質(zhì)是一把計數(shù)器,類似但不等于 int count = n;
是描述臨界資源數(shù)量的多少?。?!
當(dāng)我們?nèi)タ措娪暗臅r候,我們還沒看,要先買票。買票的本質(zhì)是對資源的預(yù)定機(jī)制。
那么票數(shù)的計數(shù)器,每賣一張票,就要對計數(shù)器-1,也就意味著電影院里面的資源就少一個!
當(dāng)票數(shù)計數(shù)器為0的時候,電影院的資源就被申請完畢了。
與臨界資源(只能有一個執(zhí)行流訪問資源)相對應(yīng):
最擔(dān)心的情況就是:
- 一份臨界資源,有多個執(zhí)行流訪問。
- n份臨界資源,有 > n的執(zhí)行流訪問,就會出現(xiàn)第一種情況。
所以為了解決這個問題,就有了計數(shù)器的概念。
在操作系統(tǒng)的管理中,臨界資源是有限的,當(dāng)執(zhí)行流申請訪問資源時,操作系統(tǒng)就會通過分配算法給執(zhí)行流分配臨界資源,從而保證不同的執(zhí)行流訪問不同的臨界資源。并且當(dāng)臨界資源計數(shù)器 = 0時,臨界資源被申請完畢,還有執(zhí)行流想要申請臨界資源時,操作系統(tǒng)就會禁止該執(zhí)行流申請資源。
所以,管道的互斥就可以解釋成:只有一個執(zhí)行流在訪問臨界資源,就叫做互斥!
結(jié)論:
- 1.申請計數(shù)器成功,表示我當(dāng)前具有訪問資源的權(quán)限。
- 2.申請了計數(shù)器資源,我當(dāng)前可以不訪問我要的資源,因?yàn)榇藭r我申請計數(shù)器資源是對資源的預(yù)定機(jī)制。
- 3.計數(shù)器可以有效保證進(jìn)入臨界資源的執(zhí)行流的數(shù)量。
- 4.每一個執(zhí)行流想要訪問臨界資源,就先申請計數(shù)器資源。程序員把這個計數(shù)器資源,叫做信號量。
- 5.我們把值為只有0,1兩態(tài)的計數(shù)器,叫做二元計數(shù)器;本質(zhì)上就是鎖。
那為什么要讓計數(shù)器的值為1呢?
當(dāng)我們把臨界資源看成一個整體,此時就只有一個執(zhí)行流能申請到該臨界資源。整體申請,整體釋放!這就是互斥!??!
但是,要訪問臨界資源,就先申請計數(shù)器資源。
計數(shù)器資源的存在就是為了保護(hù)臨界資源只能有一個執(zhí)行流訪問的。
計數(shù)器資源也是共享資源,因?yàn)樗鼙欢鄠€執(zhí)行流看到,能被多個執(zhí)行流申請資源它要保護(hù)別人,就得先保護(hù)自己!?。?/strong>
然而, 計數(shù)器本身并不是安全的。
int count = 1;
count--;
其中count--
這條語句,在c語言上就是一條代碼,但是在匯編層面上,就會被翻譯成3條語句:
1.count變量的內(nèi)容,從內(nèi)存拷貝到CPU的寄存器中
2.CPU內(nèi)對count進(jìn)行–
3.將計算結(jié)果拷貝回count變量的內(nèi)存位置。
具體怎么不安全后面會講。
原子性
我們在申請信號量資源時,本質(zhì)是對計數(shù)器–,這個操作叫做P操作。
在釋放信號量資源時,本質(zhì)是對計數(shù)器++,這個操作叫做V操作。
所以,在信號量的申請和釋放的操作,就叫做PV操作。這個操作叫做原子的?。?!
而原子性的概念簡單理解為:要么不做,要做就做完,沒有正在做的概念?。?!
為什么把PV操作叫做原子的呢?
PV操作本質(zhì)是對計數(shù)器–,++的操作。
翻譯成匯編語句后,每一條匯編語句就是原子的?。?!文章來源:http://www.zghlxwxcb.cn/news/detail-755524.html
因?yàn)橐粭l匯編語句,只能是要么沒有執(zhí)行,要么已經(jīng)執(zhí)行,沒有正在執(zhí)行的說法!文章來源地址http://www.zghlxwxcb.cn/news/detail-755524.html
到了這里,關(guān)于【Linux】淺談信號量的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!