這篇文章主要講解了“php進程通信之信號量的用途是什么”,文中的講解內(nèi)容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“php進程通信之信號量的用途是什么”吧!
創(chuàng)新互聯(lián)建站是專業(yè)的通許網(wǎng)站建設公司,通許接單;提供成都網(wǎng)站設計、網(wǎng)站制作、外貿(mào)營銷網(wǎng)站建設,網(wǎng)頁設計,網(wǎng)站設計,建網(wǎng)站,PHP網(wǎng)站建設等專業(yè)做網(wǎng)站服務;采用PHP框架,可快速的進行通許網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團隊,希望更多企業(yè)前來合作!
臨界資源:每次僅允許一個進程訪問的資源。
臨界區(qū):每個進程中訪問臨界資源的那段代碼叫臨界區(qū)
所謂臨界區(qū)(也稱為臨界段)就是訪問和操作共享數(shù)據(jù)的代碼段。
進程互斥:兩個或以上的進程不能同時進入關于同一組共享變量的臨界區(qū)域,即一個進程正在訪問臨界資源,另一個進程要想訪問必須等待。
進程同步:主要研究如何確定數(shù)個進程之間的執(zhí)行順序和避免數(shù)據(jù)競爭的問題 即,如何讓多個進程能一塊很好的協(xié)作運行
所謂同步,就是并發(fā)進程/線程在一些關鍵點上可能需要互相等待與互通消息,這種相互制約的等待與互通信息稱為進程/線程同步。
舉個生活的同步例子,你肚子餓了想要吃飯,你叫媽媽早點做菜,媽媽聽到后就開始做菜,但是在媽媽沒有做完飯之前,你必須阻塞等待,等媽媽做完飯后,自然會通知你,接著你吃飯的事情就可以進行了。
注意,同步與互斥是兩種不同的概念:
同步就好比:「操作 A 應在操作 B 之前執(zhí)行」,「操作 C 必須在操作 A 和操作 B 都完成之后才能執(zhí)行」等;
互斥就好比:「操作 A 和操作 B 不能在同一時刻執(zhí)行」;
信號量用途:主要用于多進程或多線程對公共資源對象的訪問控制。 用來解決多進程(多線程同步的問題),類似于一把鎖,訪問前獲取鎖(獲取不到則等待),訪問后釋放鎖。
多進程/多線程一般是并發(fā)執(zhí)行,如果對公共資源訪問沒有做同步處理,很容易造成數(shù)據(jù)破壞
信號量其實是一個整型的計數(shù)器,主要用于實現(xiàn)進程間的互斥與同步,而不是用于緩存進程間通信的數(shù)據(jù)。
信號量表示資源的數(shù)量,控制信號量的方式有兩種原子操作:
一個是 P 操作,這個操作會把信號量減去 -1,相減后如果信號量 < 0,則表明資源已被占用,進程需阻塞等待;相減后如果信號量 >= 0,則表明還有資源可使用,進程可正常繼續(xù)執(zhí)行。
另一個是 V 操作,這個操作會把信號量加上 1,相加后如果信號量 <= 0,則表明當前有阻塞中的進程,于是會將該進程喚醒運行;相加后如果信號量 > 0,則表明當前沒有阻塞中的進程;
P 操作是用在進入共享資源之前,V 操作是用在離開共享資源之后,這兩個操作是必須成對出現(xiàn)的。
舉個類比,2 個資源的信號量,相當于 2 條火車軌道,PV 操作如下圖過程:
一輛火車進入軌道,相當于信號量的P操作,資源-1,這樣就剩下一條軌道
接著又一輛火車占用另一條軌道,也就是P操作,資源-1
此時交通信號燈變?yōu)榧t色,因為沒有軌道可用,第三輛火車必須等待
第一輛火車離開軌道,相當于V操作,此時軌道資源為1,交通燈變?yōu)榫G燈
第三輛火車發(fā)現(xiàn)交通信號燈變綠,于是進入火車軌道,軌道資源耗盡為0,于是交通信號燈變?yōu)榧t燈
在這個火車軌道系統(tǒng)中,軌道是公共資源,每輛火車好比一個線程,交通信號燈起的就是信號量的作用。信號量可以實現(xiàn)鎖的互斥操作,也可以實現(xiàn)進程/線程同步
1)二進制信號量(也叫二值信號量)
此時信號量的初值只能是0和1。(二進制信號量可以實現(xiàn)互斥鎖操作)
2)一般/計數(shù)信號量
此時信號量的初值可以是任意非負數(shù)。顯然,其包含二進制信號量。上面舉的火車軌道例子就可以使用計數(shù)信號量來實現(xiàn),一般計數(shù)信號量與鎖的區(qū)別是它可以允許多個線程/進程(線程的數(shù)量由計數(shù)信號量初值定義) 同時操作公共資源
一般只有在開發(fā)多進程的時候才可能遇到需要使用信號量的場景,phper 幾乎很少有使用信號量的場景,就算有多進程對公共資源操作,大多也是使用 flock 文件鎖做互斥操作
<?php $file = "num.txt";//定一個空文件 $count =0; file_put_contents($file,$count); $pid = pcntl_fork();//fork 一個進程 if($pid == 0){//子進程執(zhí)行邏輯 $x = (int)file_get_contents($file);//讀取文件內(nèi)容 //i 循環(huán)累加 for($i=0; $i<1000; $i++){ $x = $x + 1; } //寫入文件 file_put_contents($file,$x); //子進程退出 exit(0); } //父進程執(zhí)行邏輯 $x = (int)file_get_contents($file); for($i=0; $i<1000; $i++){ $x = $x+1; } //累加寫入 file_put_contents($file,$x);
在編寫一個shell 腳本輔助
#!/bin/bash for a in {1..1000} do (php demo1.php) b=`cat num.txt` if [ $b != 2000 ] then echo -e "錯誤$b" fi done
按理來說,變量 $x
最后寫入文件的值應該是2000,但很不幸,并不是如此,我們對上面的腳本執(zhí)行一下:
運行了1000次,發(fā)現(xiàn)出現(xiàn)了變量$x值結(jié)果是 1000 的有8次,雖然發(fā)生錯誤的概率比較小,但是在計算機里是不能容忍的。
為什么會出現(xiàn)這種情況,我們知道單核cpu系統(tǒng)里為了實現(xiàn)多個程序同時運行的假象,操作系統(tǒng)通常都采用時間片調(diào)度,一個進程時間片用完就切換下一個進程運行,加上我們的高級語言不是每一行代碼都是原子性的,比如x = (int)file_get_contents(
$file)
這行代碼對于我們來說是不可分割是原子性的,但是經(jīng)過編譯器編譯成匯編碼【機器指令】可能是多條指令實現(xiàn),這樣就會出現(xiàn)問題,如果指令只執(zhí)行到一半進程分配的時間片用完或者被其他進程打斷,都有可能造成數(shù)據(jù)損壞,導致最后計算結(jié)果出現(xiàn)誤差
<?php $file = "num.txt";//定一個空文件 $count =0; $key = ftok("demo1.php","x"); $sem_id = sem_get($key,1);// 第二個參數(shù)是個整數(shù),表示設置信號量集,設置為1 把它當做二值信號量來用,用于互斥 file_put_contents($file,$count); $pid = pcntl_fork();//fork 一個進程 if($pid == 0){//子進程執(zhí)行邏輯 sem_acquire($sem_id); // P -1 操作 獲取一個信號量 , 如果為0表示資源被占用進程掛起等待信號量釋放 $x = (int)file_get_contents($file);//讀取文件內(nèi)容 //i 循環(huán)累加 for($i=0; $i<1000; $i++){ $x = $x + 1; } //寫入文件 file_put_contents($file,$x); sem_release($sem_id); //V +1 操作 釋放信號量 //子進程退出 exit(0); } //父進程執(zhí)行邏輯 sem_acquire($sem_id); // P -1 操作 獲取信號量, 如果為0表示資源被占用進程掛起等待信號量釋放 $x = (int)file_get_contents($file); for($i=0; $i<1000; $i++){ $x = $x+1; } //累加寫入 file_put_contents($file,$x); sem_release($sem_id); //V +1 操作 釋放信號量
加入信號量后,那就一定保證100%是2000,絕對不會出現(xiàn)其他數(shù)值。
感謝各位的閱讀,以上就是“php進程通信之信號量的用途是什么”的內(nèi)容了,經(jīng)過本文的學習后,相信大家對php進程通信之信號量的用途是什么這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關知識點的文章,歡迎關注!
標題名稱:php進程通信之信號量的用途是什么
網(wǎng)頁URL:http://chinadenli.net/article4/jsiiie.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供微信小程序、企業(yè)網(wǎng)站制作、外貿(mào)建站、定制網(wǎng)站、關鍵詞優(yōu)化、網(wǎng)站收錄
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)