成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

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

瀏覽:4日期:2022-09-07 11:19:41
目錄前言Unix System V IPC信號量共享內存消息隊列函數介紹ftoksemaphore函數shared_memory函數代碼實現小結前言

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

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

Unix System V IPC信號量

信號量又稱為信號燈,它是用來協調不同進程間的數據對象的,而最主要的應用是共享內存方式的進程間通信。本質上,信號量是一個計數器,它用來記錄對某個資源(如共享內存)的存取狀況。

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

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

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

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

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

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

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

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

共享內存

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

到于共享內存,我們一定要關心其生存周期:System V 共享內存區域對象是隨內核持續的,除非顯式刪除共享內存區域對象,即使所有訪問共享內存區域對象的進程都已經正常結束,共享內存區域對象仍然在內核中存在,在內核重新引導之前,對該共享內存區域對象的任何改寫操作都將一直保留。

消息隊列

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

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

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

函數介紹ftok

int ftok ( string $pathname, string $proj )

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

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

semaphore函數

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

獲取或生成一個信號量標識,我們注意其 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函數

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

bool shm_detach ( resource $shm_identifier )

連接/斷開 與 共享內存段的連接 $memsize, 以字節 byte 為單位;需要注意,在第一次使用 $key 連接內存段創建時,會初始化內存大小和權限,后續再連接時,這兩個參數會被忽略。

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

mixed shm_get_var ( resource $shm_identifier , int $variable_key )

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

代碼實現

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;}小結

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

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

以上就是淺談并發處理PHP進程間通信之System V IPC的詳細內容,更多關于并發處理PHP進程間通信之System V IPC的資料請關注好吧啦網其它相關文章!

標簽: PHP
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
亚洲一区欧美一区| 日本欧美大码aⅴ在线播放| 一区二区免费视频| 欧美日韩免费| 精品国产制服丝袜高跟| 精品一区二区影视| 日本久久精品电影| 三级在线观看一区二区 | 日韩制服丝袜先锋影音| 日韩一级网站| 亚洲欧美日韩精品久久久久| av在线不卡电影| 欧美日韩国产另类一区| 六月丁香婷婷久久| 91福利视频网站| 日本免费在线视频不卡一不卡二| 久久精品中文| 日一区二区三区| 噜噜噜在线观看免费视频日韩| 亚洲一卡二卡三卡四卡五卡| 一区二区日本视频| 一区二区三区丝袜| 国产一区二区三区奇米久涩| 亚洲精品亚洲人成人网| 一区二区三区成人精品| 一区二区高清视频在线观看| 日韩午夜激情| 一区二区视频免费在线观看| 国产亚洲午夜| 天天影视网天天综合色在线播放| 久久久久国产一区二区| 视频精品一区二区| 欧美三级电影在线看| 国产一区二区三区国产| 日韩精品在线一区二区| 粉嫩高潮美女一区二区三区| 欧美成人精精品一区二区频| 99久久婷婷国产综合精品| 国产亚洲污的网站| 亚洲国产精品一区二区第一页| 亚洲人成精品久久久久久| 日韩亚洲视频| 亚洲高清视频的网址| 老鸭窝毛片一区二区三区| 日韩福利视频网| 欧美图片一区二区三区| 国产精品一区二区久久不卡 | 国产日产欧美精品一区二区三区| 欧美久久久久久| 亚洲欧美日韩国产一区二区三区| 99在线精品视频在线观看| 亚洲成人一区二区| 欧美伦理视频网站| 91视频免费播放| 综合亚洲深深色噜噜狠狠网站| 影音先锋久久| 一区二区三区日本| 色婷婷av一区二区三区软件| 黑人巨大精品欧美一区| 精品成人在线观看| 91久久极品少妇xxxxⅹ软件| 日韩成人av影视| 日韩欧美的一区| 欧美日韩亚洲一区二区三区在线| 一区二区三区久久久| 欧美视频日韩视频| 国产aⅴ综合色| 国产精品蜜臀av| 久久国产精品久久精品国产| 国内精品嫩模私拍在线| 久久一日本道色综合| 亚洲最黄网站| 久草在线在线精品观看| 久久久蜜桃精品| 国产精品日韩一区二区三区| 精品一区二区三区视频在线观看| 26uuu国产一区二区三区| 99亚洲一区二区| 狠狠色丁香婷婷综合| 久久先锋影音av鲁色资源| 亚洲毛片av| 国内精品国产三级国产a久久| 国产亚洲婷婷免费| 蜜桃av综合| 国产91在线观看| 国产精品第四页| 在线日韩一区二区| 91免费观看视频在线| 亚洲一区二区三区四区在线 | 精品999日本| 日本午夜一区二区| 国产欧美精品一区二区色综合朱莉 | 欧美日本高清视频在线观看| 欧美私人啪啪vps| 先锋亚洲精品| k8久久久一区二区三区| 午夜激情久久久| 欧美激情在线一区二区三区| 亚欧成人精品| 亚洲天堂福利av| 欧美一区二区在线免费播放| 亚洲激情综合| 国产乱色国产精品免费视频| 亚洲图片欧美激情| 欧美伦理影视网| 一本色道精品久久一区二区三区 | 正在播放亚洲一区| 国产欧美成人| 99热精品一区二区| 免费一级片91| 亚洲欧洲色图综合| 欧美一区二区三级| 久久国产精品高清| 91美女片黄在线观看91美女| 日本不卡1234视频| 亚洲欧洲性图库| 精品国产麻豆免费人成网站| 在线免费精品视频| 狠狠色综合网站久久久久久久| 国产乱人伦精品一区二区在线观看 | 欧洲国内综合视频| 亚洲国产欧美不卡在线观看| 成人av在线影院| 奇米影视一区二区三区小说| 最好看的中文字幕久久| 精品99一区二区| 欧美三级视频在线观看| 亚洲精选久久| 91视频观看视频| 国产综合色在线| 亚洲男同性视频| 欧美一区二区三区在线电影| 每日更新成人在线视频| 国产字幕视频一区二区| 国产一区二区三区久久久| 亚洲国产精品一区二区www在线| 欧美大尺度电影在线| 色屁屁一区二区| 亚洲图片在线| eeuss影院一区二区三区| 黄色日韩三级电影| 亚洲gay无套男同| 国产精品久久午夜| 日韩欧美成人一区| 在线观看视频一区二区欧美日韩| 亚洲国产综合在线看不卡| 国产99久久久国产精品潘金| 免费黄网站欧美| 亚洲午夜久久久久久久久电影网 | 精品视频在线免费看| 在线亚洲自拍| 午夜国产精品视频| proumb性欧美在线观看| 亚洲国产综合在线| 久久久久久免费网| 日韩一级免费观看| 欧美亚洲尤物久久| 久久人人精品| 亚洲免费高清| 亚洲激情一区二区| 你懂的视频一区二区| 成人黄色小视频| 国产一区二三区| 蜜桃视频在线观看一区二区| 有码一区二区三区| ㊣最新国产の精品bt伙计久久| 久久综合色婷婷| 欧美成人女星排行榜| 欧美在线高清视频| 亚洲免费在线| 在线成人欧美| 亚洲三级视频| 欧美日韩国内| 欧美日本二区| 91在线小视频| 91年精品国产| proumb性欧美在线观看| 99视频超级精品| 成人91在线观看| 北条麻妃国产九九精品视频| 国产一区 二区| 国产精品白丝jk黑袜喷水| 久久国产麻豆精品| 麻豆成人久久精品二区三区小说| 亚洲日本韩国一区| 亚洲丝袜美腿综合| 国产精品久久国产精麻豆99网站| 中文字幕va一区二区三区| 久久综合网色—综合色88| 久久蜜桃av一区二区天堂 | 在线成人小视频| 欧美一级在线视频| 欧美精品丝袜久久久中文字幕| 91精品国产欧美一区二区成人| 欧美日韩午夜影院| 91精品在线免费观看| 日韩一级片网站| 91精品综合久久久久久| 26uuu久久综合| 精品久久国产老人久久综合|