日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

淺談并發(fā)處理PHP進程間通信之System V IPC

瀏覽:49日期:2022-09-07 11:19:41
目錄前言Unix System V IPC信號量共享內(nèi)存消息隊列函數(shù)介紹ftoksemaphore函數(shù)shared_memory函數(shù)代碼實現(xiàn)小結(jié)前言

它的安裝和使用非常簡單,在編譯 PHP 時添加 --enable-sysvsem --enable-sysvshm --enable-sysvmsg 參數(shù)就可以,當(dāng)然 Windows 上無法使用。

今天我們?nèi)耘f使用上一篇文章的例子來介紹 PHP 內(nèi)部實現(xiàn)的進程間通信,在了解它們的具體使用之前,先簡單介紹一下信號量、共享內(nèi)存、消息隊列的概念。

Unix System V IPC信號量

信號量又稱為信號燈,它是用來協(xié)調(diào)不同進程間的數(shù)據(jù)對象的,而最主要的應(yīng)用是共享內(nèi)存方式的進程間通信。本質(zhì)上,信號量是一個計數(shù)器,它用來記錄對某個資源(如共享內(nèi)存)的存取狀況。

一般說來,為了獲得共享資源,進程需要執(zhí)行下列操作:

1.獲取控制共享資源的信號量的值;

2.若值為正,進程將信號量減1,進程操作共享資源,進入步驟4;

3.若值0,則拒絕進程使用共享資源,進程進入睡眠狀態(tài),直至信號量值大于0后,進程被喚醒,轉(zhuǎn)入步驟1;

4.當(dāng)進程不再使用共享資源時,將信號量值加1。如果此時有進程正在睡眠等待此信號量,則喚醒此進程;

信號量的使用可以類比為:

一個房間必須用鑰匙才能開門,有N把鑰匙放在門口,拿到鑰匙開門進入房間,出來時將鑰匙放回并告知等待的人去取鑰匙開門。 此例中,鑰匙的數(shù)量限制了同一時間內(nèi)在房間的最大人數(shù)。房間即共享資源,鑰匙是信號量,而想進入房間的人則是多個進程。

信號量有二值和多值之分,一般共享資源都不允許多個進程同時操作,多使用二值信號量。

共享內(nèi)存

為了在多個進程間交換信息,內(nèi)核專門留出了一塊內(nèi)存區(qū),可以由需要訪問的進程將其映射到自己的私有地址空間。進程就可以直接讀寫這一塊內(nèi)存而不需要進行數(shù)據(jù)的拷貝,從而大大提高效率。共享內(nèi)存可以比喻成一塊公用黑板,每個人都能在上面留言,寫東西。

到于共享內(nèi)存,我們一定要關(guān)心其生存周期:System V 共享內(nèi)存區(qū)域?qū)ο笫请S內(nèi)核持續(xù)的,除非顯式刪除共享內(nèi)存區(qū)域?qū)ο螅词顾性L問共享內(nèi)存區(qū)域?qū)ο蟮倪M程都已經(jīng)正常結(jié)束,共享內(nèi)存區(qū)域?qū)ο笕匀辉趦?nèi)核中存在,在內(nèi)核重新引導(dǎo)之前,對該共享內(nèi)存區(qū)域?qū)ο蟮娜魏胃膶懖僮鞫紝⒁恢北A簟?/p>消息隊列

消息隊列是一條公共消息鏈,消息存取一般為先進先出(FIFO),能實現(xiàn)多個進程對消息的原子操作和異步存取。消息隊列的應(yīng)用十分廣泛,不光是進程間通信,流程異步化、解耦方面也應(yīng)用廣泛。

消息隊列則相當(dāng)于一條流水線的一段,上層有多個工人把產(chǎn)品放入,下層有多個工人將產(chǎn)品取出加工。

本文的實現(xiàn)不包括消息隊列的使用,但對于消息隊列實現(xiàn)互斥鎖,這里給出一個思路:先給消息隊列初始化一個值,并發(fā)進程競爭獲取此值,獲取到值的進程進行共享資源的處理,進程不再共享資源時,再將此值放入隊列,通過隊列的原子性來保證同時只有一個進程訪問共享資源。

函數(shù)介紹ftok

int ftok ( string $pathname, string $proj )

ftok將一個路徑 pathname 和一個項目名(必須為一個字符), 轉(zhuǎn)化成一個整數(shù)形的 System V IPC 鍵,本文介紹的 System V 通信方式都是基于此鍵來完成的,此ID 值也可以自己指定一個 INT 型來確定,不必要使用 ftok 獲取;

需要注意的是:ftok 的結(jié)果是通過文檔的索引節(jié)點號來計算獲取的,而文件的刪除重建會導(dǎo)致其索引節(jié)點號變動,所以即使是相同的文件名,也可能會導(dǎo)致獲取到的 IPC 鍵不同,所以需要盡量保證 $pathname 不變動;

semaphore函數(shù)

resource sem_get ( int $key [, int $max_acquire = 1 [, int $perm = 0666 [, int $auto_release = 1 ]]] )

獲取或生成一個信號量標(biāo)識,我們注意其 max_acquire 值為 1,即保證同時只有一個進程能獲取到它;auto_release 為 1 ,保證進程在非正常情況退出時能釋放此信號量;

bool sem_acquire ( resource $sem_identifier [, bool $nowait = false ] )

bool sem_release ( resource $sem_identifier )

獲取/釋放一個信號量,注意獲取信號量的 $nowait 為false,使進程在獲取信號量失敗后進行進程等待即可。

shared_memory函數(shù)

resource shm_attach ( int $key [, int $memsize [, int $perm = 0666 ]] )

bool shm_detach ( resource $shm_identifier )

連接/斷開 與 共享內(nèi)存段的連接 $memsize, 以字節(jié) byte 為單位;需要注意,在第一次使用 $key 連接內(nèi)存段創(chuàng)建時,會初始化內(nèi)存大小和權(quán)限,后續(xù)再連接時,這兩個參數(shù)會被忽略。

bool shm_put_var ( resource $shm_identifier , int $variable_key , mixed $variable )

mixed shm_get_var ( resource $shm_identifier , int $variable_key )

向共享內(nèi)存內(nèi)寫入或讀取一個變量,需要注意變量 key 只能是 int 型;

代碼實現(xiàn)

function getCycleIdFromSystemV($max, $min = 0) { $key = ftok(’/tmp/cycleIdFromSystemV.tok’, ’d’); $var_key = 0; $sem_id = sem_get($key); $shm_id = shm_attach($key, 4096); if (sem_acquire($sem_id)) {$cycle_id = intval(shm_get_var($shm_id, $var_key));$cycle_id++;if ($cycle_id > $max) { $cycle_id = $min;}shm_put_var($shm_id, $var_key, $cycle_id);shm_detach($shm_id);sem_release($sem_id);return $cycle_id; }return false;}小結(jié)

我們發(fā)現(xiàn) PHP 對信號量和共享內(nèi)存封裝得很好,使用起來非常簡單。除此之外,PHP 的類庫 Sync 將常用 IPC 方法封裝成為類,能實現(xiàn)跨平臺的使用,感興趣的可以了解使用一下。

當(dāng)然進程間通信的方式和種類有很多,本文介紹的 id 遞增只是很簡單的一種,不過,知道了方法,再去把這些方法改造成為其他種類也就不難了。

以上就是淺談并發(fā)處理PHP進程間通信之System V IPC的詳細(xì)內(nèi)容,更多關(guān)于并發(fā)處理PHP進程間通信之System V IPC的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: PHP
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产亚洲精品精品国产亚洲综合| 亚洲成人国产| 五月天激情综合网| 色天使综合视频| 国产成人精品亚洲线观看| 老司机精品视频网| 国产精品嫩草影院在线看| 欧美亚洲网站| 国产欧美日韩亚洲一区二区三区| 欧美日韩一区二区三区在线电影| 日韩精品久久久久久| 亚洲欧美一级| 日韩精品视频网站| 久久精品97| 免费一区二区三区在线视频| 亚洲人成高清| 亚洲精品四区| 欧美日韩中文| 久久99蜜桃| 久久精品二区亚洲w码| 精品一区二区男人吃奶| 美日韩一区二区三区| 久久91视频| 91综合视频| 色一区二区三区| 久久狠狠婷婷| 亚洲少妇在线| 中文字幕亚洲精品乱码| 欧美日韩一区自拍| 精品视频自拍| 国产一区国产二区国产三区| 天堂√8在线中文| 亚洲成人二区| 午夜在线精品偷拍| 91精品在线免费视频| 麻豆国产欧美一区二区三区| 91日韩欧美| 不卡在线一区二区| 亚洲三级在线| 免费在线日韩av| 成人羞羞视频播放网站| 亚洲一区激情| 欧美伊人久久| 国产黄大片在线观看| 五月精品视频| 麻豆亚洲精品| 欧美黄色精品| 久久一区二区中文字幕| 日韩中文字幕亚洲一区二区va在线| 日韩一区二区三区精品| 美女视频一区在线观看| 久久精品亚洲欧美日韩精品中文字幕| 日韩一级不卡| 国产九一精品| 久久精品91| 日韩免费精品| 国产中文字幕一区二区三区| 狠狠色狠狠色综合日日tαg| 欧美一区二区三区久久| 欧美天堂视频| 老牛国产精品一区的观看方式| 国产精品视频一区二区三区综合| 亚洲成人精品| 青草av.久久免费一区| 日韩电影免费网站| 综合一区在线| 欧美久久天堂| 亚洲精品大全| 成人三级高清视频在线看| 亚洲一区欧美| 丰满少妇一区| 四虎国产精品免费久久| 日韩欧美综合| 国产欧美另类| 香蕉久久久久久久av网站| 美腿丝袜亚洲一区| 蜜桃视频免费观看一区| 久久蜜桃精品| 精品久久久中文字幕| 婷婷视频一区二区三区| 午夜久久黄色| 日韩在线不卡| 欧美国产日韩电影| 亚洲精品三级| 五月天久久久| 日本精品不卡| 久久女人天堂| 中文字幕日本一区二区| 极品日韩av| 日本久久黄色| 亚洲欧洲日韩精品在线| 欧美一级鲁丝片| 蜜臀久久99精品久久久久宅男| 精品日韩一区| 99国产精品| 亚洲黄色网址| 亚洲精品亚洲人成在线观看| 成人在线视频区| 免费看黄色91| 国产一区久久| 精品国产午夜肉伦伦影院| 久久先锋影音| 日本不卡免费高清视频在线| 一区二区三区四区精品视频| 日韩电影免费网址| 男人的天堂久久精品| 亚洲黄色免费av| 国产精品黄网站| 最新亚洲一区| 日本一区二区高清不卡| 亚州欧美在线| 亚洲国产日韩欧美在线| 国产一区二区亚洲| 日韩精品乱码av一区二区| 国产伊人精品| 欧美日韩亚洲一区在线观看| 亚洲作爱视频| 日韩精品一卡| 国产精品v一区二区三区| 日韩一区欧美二区| 国产一区二区三区久久 | 久久中文字幕一区二区| 六月天综合网| 中文不卡在线| 激情婷婷亚洲| 久久久久免费av| 免费视频一区二区| 亚洲91网站| 国产精品一区二区美女视频免费看| 亚洲一区免费| 日本一区二区三区视频在线看| 影院欧美亚洲| 欧美国产三级| 日韩高清电影一区| 国产亚洲在线| 日韩午夜av在线| 五月天久久777| 日韩美女精品| 一区二区亚洲视频| 亚洲视频二区| 日韩一区二区三区精品| 国产精品久久久久77777丨| 久久av国产紧身裤| 欧美特黄一级大片| 成人国产精品一区二区免费麻豆| 日韩国产欧美三级| 国内激情久久| 亚洲尤物在线| 日韩精品第一区| 久久精品播放| 欧美sm一区| 亚洲电影在线一区二区三区| 亚洲免费观看| 久久精品青草| 日韩视频中文| 视频一区欧美日韩| 国产精品99久久久久久董美香| 亚洲日产av中文字幕| 国产模特精品视频久久久久| 免费观看久久av| 欧美高清一区| 午夜国产精品视频免费体验区| 黄色亚洲大片免费在线观看| 91亚洲国产成人久久精品| 国产aⅴ精品一区二区四区| 综合日韩av| 91精品亚洲| 在线视频亚洲| 亚洲精品美女| 青草综合视频| 老鸭窝一区二区久久精品| 麻豆国产欧美一区二区三区 | 日本在线视频一区二区| 亚洲精品极品少妇16p| 午夜亚洲福利在线老司机| 视频一区中文字幕国产| 中文字幕日韩欧美精品高清在线| 日韩在线观看一区二区三区| 欧美一区二区三区久久| 国产精品夜夜夜| 精品少妇一区| 色天使综合视频| 日韩午夜一区| 亚洲精品亚洲人成在线观看| 精品黄色一级片| 欧美sm一区| 99re国产精品| 色8久久久久| 国产精品任我爽爆在线播放| 国内自拍视频一区二区三区| 久久九九国产| 欧美日韩在线观看视频小说| 性一交一乱一区二区洋洋av| 日韩不卡手机在线v区| 韩国一区二区三区视频| 米奇777超碰欧美日韩亚洲| 快she精品国产999| 欧美激情 亚洲a∨综合| 日韩精品免费一区二区三区| 91久久国产|