欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2021年05月26日 11:08:53   作者:枕邊書  
對(duì)于進(jìn)程間通信,每一個(gè)完備的語(yǔ)言都應(yīng)該有對(duì)應(yīng)的處理方式,而 PHP 對(duì)應(yīng)的則是一族對(duì) UNIX SYSTEM V包裝的函數(shù),包括信號(hào)量(semaphore)、共享內(nèi)存(shared memory)和消息隊(duì)列(msg queue)的操作。

前言

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

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

Unix System V IPC

信號(hào)量

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

一般說(shuō)來(lái),為了獲得共享資源,進(jìn)程需要執(zhí)行下列操作:

1.獲取控制共享資源的信號(hào)量的值;

2.若值為正,進(jìn)程將信號(hào)量減1,進(jìn)程操作共享資源,進(jìn)入步驟4;

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

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

信號(hào)量的使用可以類比為:

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

信號(hào)量有二值和多值之分,一般共享資源都不允許多個(gè)進(jìn)程同時(shí)操作,多使用二值信號(hào)量。

共享內(nèi)存

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

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

消息隊(duì)列

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

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

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

函數(shù)介紹

ftok

int ftok ( string $pathname, string $proj )

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

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

semaphore函數(shù)

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

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

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

bool sem_release ( resource $sem_identifier )

獲取/釋放一個(gè)信號(hào)量,注意獲取信號(hào)量的 $nowait 為false,使進(jìn)程在獲取信號(hào)量失敗后進(jìn)行進(jìn)程等待即可。

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)建時(shí),會(huì)初始化內(nèi)存大小和權(quán)限,后續(xù)再連接時(shí),這兩個(gè)參數(shù)會(huì)被忽略。

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)寫入或讀取一個(gè)變量,需要注意變量 key 只能是 int 型;

代碼實(shí)現(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 對(duì)信號(hào)量和共享內(nèi)存封裝得很好,使用起來(lái)非常簡(jiǎn)單。除此之外,PHP 的類庫(kù) Sync 將常用 IPC 方法封裝成為類,能實(shí)現(xiàn)跨平臺(tái)的使用,感興趣的可以了解使用一下。

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

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

相關(guān)文章

  • php中通過(guò)eval實(shí)現(xiàn)字符串格式的計(jì)算公式

    php中通過(guò)eval實(shí)現(xiàn)字符串格式的計(jì)算公式

    有時(shí)候我們對(duì)每一種產(chǎn)品都有一個(gè)提成公式,而這個(gè)計(jì)算提成的公式是以字符串格式存在表中的,當(dāng)我們用這個(gè)計(jì)算公式時(shí),他并不像我們寫的:$a=2+3*5;這樣簡(jiǎn)單的能計(jì)算出結(jié)果,而它是個(gè)字符串,所以,我們就必須把字符串轉(zhuǎn)化為我們能夠處理的結(jié)果
    2017-03-03
  • 如何在Laravel中驗(yàn)證zip里的文件

    如何在Laravel中驗(yàn)證zip里的文件

    在 Laravel 程序中上傳文件時(shí),請(qǐng)求驗(yàn)證可以很好驗(yàn)證上傳的文件。你可以要求上傳文件必須為圖片, 也可以限制文件字節(jié)大小, 也可以根據(jù)mime types或者文件擴(kuò)展名過(guò)濾文件。
    2021-05-05
  • php 文件上傳代碼(限制jpg文件)

    php 文件上傳代碼(限制jpg文件)

    php 文件上傳代碼,限制jpg文件,需要的朋友可以參考下。
    2010-01-01
  • 基于php的CMS中展示文章類實(shí)例分析

    基于php的CMS中展示文章類實(shí)例分析

    這篇文章主要介紹了基于php的CMS中展示文章類,涉及針對(duì)文章的各種常用設(shè)置與操作技巧,需要的朋友可以參考下
    2015-06-06
  • php生成0~1隨機(jī)小數(shù)的方法(必看)

    php生成0~1隨機(jī)小數(shù)的方法(必看)

    下面小編就為大家?guī)?lái)一篇php生成0~1隨機(jī)小數(shù)的方法(必看)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-04-04
  • php中session與cookie的比較

    php中session與cookie的比較

    這篇文章主要介紹了php中session與cookie的比較,從多個(gè)角度分析了php中session與cookie的區(qū)別,需要的朋友可以參考下
    2015-01-01
  • PHP的swoole擴(kuò)展安裝方法詳細(xì)教程

    PHP的swoole擴(kuò)展安裝方法詳細(xì)教程

    這篇文章主要為大家分享了PHP的swoole擴(kuò)展安裝方法詳細(xì)教程,具有實(shí)用性和參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-05-05
  • 解析PHP工廠模式的好處

    解析PHP工廠模式的好處

    本篇文章是對(duì)PHP工廠模式的好處進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06
  • PHP6 先修班 JSON實(shí)例代碼

    PHP6 先修班 JSON實(shí)例代碼

    先簡(jiǎn)單的談一下什麼是 JSON JSON 全稱 JavaScript Object Notation是一種非常輕量級(jí)的資料交換格式
    2008-08-08
  • php實(shí)現(xiàn)簽到功能的方法實(shí)例分析

    php實(shí)現(xiàn)簽到功能的方法實(shí)例分析

    這篇文章主要介紹了php實(shí)現(xiàn)簽到功能的方法,結(jié)合實(shí)例形式分析了php基于數(shù)據(jù)庫(kù)及時(shí)間判斷操作實(shí)現(xiàn)簽到功能的相關(guān)技巧,需要的朋友可以參考下
    2017-12-12

最新評(píng)論