gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区

站長資訊網
最全最豐富的資訊網站

簡單了解php進程通信之信號量

本篇文章給大家帶來了關于PHP的相關知識,信號量又稱為信號燈、旗語 用來解決進程(線程同步的問題),類似于一把鎖,訪問前獲取鎖(獲取不到則等待),訪問后釋放鎖,文中通過示例代碼介紹的非常詳細,希望對大家有幫助。

簡單了解php進程通信之信號量

(推薦教程:PHP視頻教程)

常見進程通信方式

簡單了解php進程通信之信號量

一些理論基礎

  • 臨界資源:每次僅允許一個進程訪問的資源。
  • 臨界區:每個進程中訪問臨界資源的那段代碼叫臨界區

所謂臨界區(也稱為臨界段)就是訪問和操作共享數據的代碼段。

進程互斥:兩個或以上的進程不能同時進入關于同一組共享變量的臨界區域,即一個進程正在訪問臨界資源,另一個進程要想訪問必須等待。

進程同步:主要研究如何確定數個進程之間的執行順序和避免數據競爭的問題 即,如何讓多個進程能一塊很好的協作運行

所謂同步,就是并發進程/線程在一些關鍵點上可能需要互相等待與互通消息,這種相互制約的等待與互通信息稱為進程/線程同步。

舉個生活的同步例子,你肚子餓了想要吃飯,你叫媽媽早點做菜,媽媽聽到后就開始做菜,但是在媽媽沒有做完飯之前,你必須阻塞等待,等媽媽做完飯后,自然會通知你,接著你吃飯的事情就可以進行了。

注意,同步與互斥是兩種不同的概念:

同步就好比:「操作 A 應在操作 B 之前執行」,「操作 C 必須在操作 A 和操作 B 都完成之后才能執行」等;

互斥就好比:「操作 A 和操作 B 不能在同一時刻執行」;

system V 信號量

信號量用途:主要用于多進程或多線程對公共資源對象的訪問控制。 用來解決多進程(多線程同步的問題),類似于一把鎖,訪問前獲取鎖(獲取不到則等待),訪問后釋放鎖。

多進程/多線程一般是并發執行,如果對公共資源訪問沒有做同步處理,很容易造成數據破壞

信號量其實是一個整型的計數器,主要用于實現進程間的互斥與同步,而不是用于緩存進程間通信的數據。

信號量表示資源的數量,控制信號量的方式有兩種原子操作:

一個是 P 操作,這個操作會把信號量減去 -1,相減后如果信號量 < 0,則表明資源已被占用,進程需阻塞等待;相減后如果信號量 >= 0,則表明還有資源可使用,進程可正常繼續執行。

另一個是 V 操作,這個操作會把信號量加上 1,相加后如果信號量 <= 0,則表明當前有阻塞中的進程,于是會將該進程喚醒運行;相加后如果信號量 > 0,則表明當前沒有阻塞中的進程;

P 操作是用在進入共享資源之前,V 操作是用在離開共享資源之后,這兩個操作是必須成對出現的。

舉個類比,2 個資源的信號量,相當于 2 條火車軌道,PV 操作如下圖過程:

簡單了解php進程通信之信號量

一輛火車進入軌道,相當于信號量的P操作,資源-1,這樣就剩下一條軌道

簡單了解php進程通信之信號量

接著又一輛火車占用另一條軌道,也就是P操作,資源-1

簡單了解php進程通信之信號量

此時交通信號燈變為紅色,因為沒有軌道可用,第三輛火車必須等待

簡單了解php進程通信之信號量

第一輛火車離開軌道,相當于V操作,此時軌道資源為1,交通燈變為綠燈

簡單了解php進程通信之信號量

第三輛火車發現交通信號燈變綠,于是進入火車軌道,軌道資源耗盡為0,于是交通信號燈變為紅燈

簡單了解php進程通信之信號量

在這個火車軌道系統中,軌道是公共資源,每輛火車好比一個線程,交通信號燈起的就是信號量的作用。信號量可以實現鎖的互斥操作,也可以實現進程/線程同步

信號量類型

1)二進制信號量(也叫二值信號量)

此時信號量的初值只能是0和1。(二進制信號量可以實現互斥鎖操作)

2)一般/計數信號量

此時信號量的初值可以是任意非負數。顯然,其包含二進制信號量。上面舉的火車軌道例子就可以使用計數信號量來實現,一般計數信號量與鎖的區別是它可以允許多個線程/進程(線程的數量由計數信號量初值定義) 同時操作公共資源

一般只有在開發多進程的時候才可能遇到需要使用信號量的場景,phper 幾乎很少有使用信號量的場景,就算有多進程對公共資源操作,大多也是使用 flock 文件鎖做互斥操作

php模擬多進程操作公共資源

<?php $file = "num.txt";//定一個空文件 $count =0; file_put_contents($file,$count);  $pid = pcntl_fork();//fork 一個進程  if($pid == 0){//子進程執行邏輯     $x = (int)file_get_contents($file);//讀取文件內容     //i 循環累加     for($i=0; $i<1000; $i++){         $x = $x + 1;     }     //寫入文件     file_put_contents($file,$x);     //子進程退出     exit(0); } //父進程執行邏輯 $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,但很不幸,并不是如此,我們對上面的腳本執行一下:

簡單了解php進程通信之信號量

運行了1000次,發現出現了變量$x值結果是 1000 的有8次,雖然發生錯誤的概率比較小,但是在計算機里是不能容忍的。

為什么會出現這種情況,我們知道單核cpu系統里為了實現多個程序同時運行的假象,操作系統通常都采用時間片調度,一個進程時間片用完就切換下一個進程運行,加上我們的高級語言不是每一行代碼都是原子性的,比如x = (int)file_get_contents($file) 這行代碼對于我們來說是不可分割是原子性的,但是經過編譯器編譯成匯編碼【機器指令】可能是多條指令實現,這樣就會出現問題,如果指令只執行到一半進程分配的時間片用完或者被其他進程打斷,都有可能造成數據損壞,導致最后計算結果出現誤差

使用php封裝system v 信號量集函數

<?php $file = "num.txt";//定一個空文件 $count =0; $key = ftok("demo1.php","x"); $sem_id = sem_get($key,1);// 第二個參數是個整數,表示設置信號量集,設置為1 把它當做二值信號量來用,用于互斥 file_put_contents($file,$count); $pid = pcntl_fork();//fork 一個進程 if($pid == 0){//子進程執行邏輯 sem_acquire($sem_id); // P -1 操作 獲取一個信號量 , 如果為0表示資源被占用進程掛起等待信號量釋放     $x = (int)file_get_contents($file);//讀取文件內容     //i 循環累加     for($i=0; $i<1000; $i++){         $x = $x + 1;     }     //寫入文件     file_put_contents($file,$x);        sem_release($sem_id); //V +1 操作 釋放信號量     //子進程退出     exit(0); } //父進程執行邏輯 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,絕對不會出現其他數值。

(推薦教程:PHP視頻教程)

贊(0)
分享到: 更多 (0)
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区
激情在线观看视频| 免费成人进口网站| 51xx午夜影福利| 日韩手机在线观看视频| 97超碰在线视| 国产高清999| 天天爱天天操天天干| 热99这里只有精品| 国产激情片在线观看| 91香蕉国产线在线观看| 国产精品久久久毛片| 久久精品网站视频| 日本www在线播放| 国产一区二区四区| 亚洲五码在线观看视频| 午夜免费视频网站| 搡的我好爽在线观看免费视频| 美女一区二区三区视频| 玩弄japan白嫩少妇hd| 国产成人精品视频免费看| 缅甸午夜性猛交xxxx| 青草青青在线视频| 怡红院av亚洲一区二区三区h| 国产成人永久免费视频| 国产小视频免费| 国产精品久久久久久久乖乖| 97超碰国产精品| 国产欧美精品aaaaaa片| 秋霞无码一区二区| 免费无码毛片一区二三区| 777精品久无码人妻蜜桃| 91视频 -- 69xx| www.久久com| 精品久久久久av| 日韩 欧美 视频| 任你操这里只有精品| 欧美 日韩精品| 黄色高清无遮挡| 在线看的黄色网址| 亚洲精品国产一区二区三区| 青青草原播放器| 免费不卡av在线| 妞干网在线免费视频| 三上悠亚在线一区二区| caoporm在线视频| 人妻激情另类乱人伦人妻| 亚洲美免无码中文字幕在线 | 国产精品jizz在线观看老狼| 小早川怜子一区二区三区| www.国产二区| 91猫先生在线| 永久免费黄色片| 国产主播自拍av| 嫩草影院国产精品| 97碰在线视频| 污污网站免费看| 久久精品无码中文字幕| 精品视频无码一区二区三区| www激情五月| 欧美成人免费高清视频| 在线免费黄色小视频| 女人天堂av手机在线| 亚洲综合av在线播放| 久草视频这里只有精品| 自拍偷拍一区二区三区四区| 日韩极品视频在线观看| 在线免费av播放| 国产在线精品91| 免费在线精品视频| 手机看片福利盒子久久| 久无码久无码av无码| 欧美日韩精品区别| 波多野结衣家庭教师视频| 青青草综合在线| 不卡中文字幕在线观看| 日韩网址在线观看| 日韩精品一区二区三区四| 五月婷婷六月丁香激情| 国产91xxx| 粉嫩av一区二区三区天美传媒| 最近免费中文字幕中文高清百度| 奇米777四色影视在线看| 亚洲久久中文字幕| 日韩欧美在线播放视频| 999久久欧美人妻一区二区| 久久国产精品国产精品| 男人的天堂日韩| 日本www在线视频| 精品一区二区三区无码视频| 成年人黄色在线观看| 中文字幕视频三区| 波多野结衣天堂| 亚洲视频在线a| 久久久精品麻豆| 国产淫片av片久久久久久| 蜜桃传媒一区二区三区| 福利视频一二区| www.亚洲成人网| 99久热在线精品视频| 亚洲精品国产suv一区88| 午夜啪啪福利视频| 乱子伦一区二区| 在线观看18视频网站| 毛片在线视频观看| 日本一本中文字幕| 欧美激情视频免费看| www.99热这里只有精品| 熟女少妇在线视频播放| 91av资源网| www日韩视频| 邪恶网站在线观看| 九一精品久久久| 国产人妻互换一区二区| 日韩精品久久一区二区| 无码人妻少妇伦在线电影| 97超碰在线人人| 久草精品在线播放| 在线观看国产中文字幕| 国产精品自在自线| 亚洲精品国产suv一区88| 久久国产午夜精品理论片最新版本| 免费毛片网站在线观看| 熟妇人妻va精品中文字幕 | 亚洲高潮无码久久| 国产一区二区三区小说| 成人免费在线小视频| 一级特黄性色生活片| 中文字幕66页| 草草草视频在线观看| 国模无码视频一区二区三区| 午夜dv内射一区二区| 亚洲一区二区三区四区精品 | 九九久久九九久久| 国产a级一级片| 污污视频网站在线| 高清无码视频直接看| 精品久久久久av| 一级一片免费播放| 欧美视频在线播放一区| 亚洲免费黄色录像| 国产亚洲黄色片| 三上悠亚在线一区| 欧美大黑帍在线播放| 日本免费观看网站| 国产av熟女一区二区三区| 亚洲色图久久久| 国产日韩欧美精品在线观看| 天天干天天综合| 久久久久免费看黄a片app| 欧美美女一级片| 国产伦精品一区二区三区四区视频_| 最新中文字幕免费视频| 国产美女在线一区| 国产成人在线综合| 日韩亚洲在线视频| 91.com在线| 9999在线观看| www.精品在线| 亚洲精品无码久久久久久| 乱熟女高潮一区二区在线| 欧美第一页浮力影院| 国产中文字幕免费观看| 久久福利一区二区| 一级做a爱视频| 成人免费视频久久| 欧美成人高潮一二区在线看| 美国av在线播放| 亚洲午夜精品一区| 天天干天天操天天玩| 黄色高清无遮挡| 日韩精品xxxx| 97视频在线免费| 大陆极品少妇内射aaaaaa| 一级片黄色免费| 天堂在线一区二区三区| 亚洲少妇久久久| 亚洲最大成人在线观看| 五月婷婷之综合激情| 欧美成人精品欧美一级乱| 女人喷潮完整视频| 久久综合九色综合88i| 国产v片免费观看| 欧美一级免费播放| 国产精品久久国产| 免费人成在线观看视频播放| 六月婷婷激情网| 日韩一级免费看| 国产玉足脚交久久欧美| 妺妺窝人体色777777| 日韩av新片网| www插插插无码视频网站| 国产av天堂无码一区二区三区| 欧美a级黄色大片| 国产免费一区二区视频| 男人添女荫道口图片| 久久免费视频3| 999在线免费视频| 五月天av在线播放| 日韩av影视大全| av免费看网址|