摘要:為了解決這個(gè)問(wèn)題,我們必須引入互斥機(jī)制。實(shí)現(xiàn)互斥機(jī)制的最簡(jiǎn)單辦法就是使用信號(hào)燈。信號(hào)量是另外一種進(jìn)程間的方式,它同其他機(jī)構(gòu)管道消息隊(duì)列不同。在這個(gè)停車場(chǎng)系統(tǒng)中,車位是公共資源,每輛車好比一個(gè)線程,看門人起的就是信號(hào)量的作用。
在多帶帶的一個(gè)PHP進(jìn)程中讀寫、創(chuàng)建、刪除共享內(nèi)存方面上你應(yīng)該沒(méi)有問(wèn)題了。但是實(shí)際運(yùn)行中不可能只是一個(gè)PHP進(jìn)程在運(yùn)行中。如果在多個(gè)進(jìn)程的情況下你還是沿用單個(gè)進(jìn)程的處理方法,你一定會(huì)碰到問(wèn)題--著名的并行和互斥問(wèn)題。比如說(shuō)有2個(gè)進(jìn)程同時(shí)需要對(duì)同一段內(nèi)存進(jìn)行讀寫。當(dāng)兩個(gè)進(jìn)程同時(shí)執(zhí)行寫入操作時(shí),你將得到一個(gè)錯(cuò)誤的數(shù)據(jù),因?yàn)樵摱蝺?nèi)存將之可能是最后執(zhí)行的進(jìn)程的內(nèi)容,甚至是由2個(gè)進(jìn)程寫入的數(shù)據(jù)輪流隨機(jī)出現(xiàn)的一段混合的四不象。這顯然是不能接受的。為了解決這個(gè)問(wèn)題,我們必須引入互斥機(jī)制?;コ鈾C(jī)制在很多操作系統(tǒng)的教材上都有專門講述,這里不多重復(fù)。實(shí)現(xiàn)互斥機(jī)制的最簡(jiǎn)單辦法就是使用信號(hào)燈。信號(hào)量是另外一種進(jìn)程間(IPC)的方式,它同其他IPC機(jī)構(gòu)(管道、FIFO、消息隊(duì)列)不同。
說(shuō)到信號(hào)量可能大家都很陌生,作為php肯定知道m(xù)ysql、redis中的鎖,當(dāng)然還有php文件鎖。說(shuō)白了就是鎖,用來(lái)解決進(jìn)程(線程同步的問(wèn)題),訪問(wèn)前獲取鎖(獲取不到則等待),訪問(wèn)后釋放鎖。
信號(hào)量的作用就是,考慮是否有多個(gè)進(jìn)程同時(shí)寫入數(shù)據(jù)到共享內(nèi)存的情況,是否需要避免沖突。
舉一個(gè)生活中的例子:以一個(gè)停車場(chǎng)的運(yùn)作為例。簡(jiǎn)單起見(jiàn),假設(shè)停車場(chǎng)只有三個(gè)車位,一開始三個(gè)車位都是空的。這時(shí)如果同時(shí)來(lái)了五輛車,看門人允許其中三輛直接進(jìn)入,然后放下車攔,剩下的車則必須在入口等待,此后來(lái)的車也都不得不在入口處等待。這時(shí),有一輛車離開停車場(chǎng),看門人得知后,打開車攔,放入外面的一輛進(jìn)去,如果又離開兩輛,則又可以放入兩輛,如此往復(fù)。在這個(gè)停車場(chǎng)系統(tǒng)中,車位是公共資源,每輛車好比一個(gè)線程,看門人起的就是信號(hào)量的作用。
記得給環(huán)境開啟兩個(gè)擴(kuò)展【enable-shmop --enable-sysvsem】
因?yàn)閜hp默認(rèn)不支持這些函數(shù),所以需要重編譯php。如要使用:
System V信號(hào)量,編譯時(shí)加上 –enable-sysvsem
System V共享內(nèi)存,編譯時(shí)加上 –enable-sysvshm
System V消息隊(duì)列,編譯時(shí)加上 –enable-sysvmsg
Shared Memory,編譯時(shí)加上 –enable-shmop
信號(hào)量系列函數(shù)
簡(jiǎn)單小案例
如果出現(xiàn)報(bào)錯(cuò):Warning: sem_release(): SysV semaphore 140680297324568 (key 0x4337b101) is not currently acquired in /usr/local/nginx/html/index.php on line 38
那是因?yàn)闆](méi)有獲得鎖~
在Linux下命令觀察,查看系統(tǒng)共享內(nèi)存,信號(hào)量,隊(duì)列
# ipcs# ipcs -s //多帶帶查看信號(hào)量的話,使用ipcs -s命令稍微復(fù)雜的案例
0) { foreach ($child_list as $key => $pid) { $status = pcntl_waitpid($pid, $status); if ($status > 0 || $status == -1) { unset($child_list[$key]); } } sleep(1); } $count = shm_get_var($shm_id, SHARE_KEY); echo " $count ".PHP_EOL; //銷毀信號(hào)量 sem_remove($signal); shm_remove($shm_id); shm_detach($shm_id);實(shí)際運(yùn)用中根據(jù)場(chǎng)景靈活運(yùn)用就可以了~
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/61999.html
摘要:為了解決這個(gè)問(wèn)題,我們必須引入互斥機(jī)制。實(shí)現(xiàn)互斥機(jī)制的最簡(jiǎn)單辦法就是使用信號(hào)燈。信號(hào)量是另外一種進(jìn)程間的方式,它同其他機(jī)構(gòu)管道消息隊(duì)列不同。在這個(gè)停車場(chǎng)系統(tǒng)中,車位是公共資源,每輛車好比一個(gè)線程,看門人起的就是信號(hào)量的作用。 在單獨(dú)的一個(gè)PHP進(jìn)程中讀寫、創(chuàng)建、刪除共享內(nèi)存方面上你應(yīng)該沒(méi)有問(wèn)題了。但是實(shí)際運(yùn)行中不可能只是一個(gè)PHP進(jìn)程在運(yùn)行中。如果在多個(gè)進(jìn)程的情況下你還是沿用單個(gè)進(jìn)程的...
摘要:一進(jìn)程間通信理解間進(jìn)程通信機(jī)制,先了解下進(jìn)程間有哪些通訊機(jī)制歷史發(fā)展按照歷史來(lái)源主要有兩大塊的管道,,信號(hào)的消息隊(duì)列,共享內(nèi)存,信號(hào)燈。信號(hào)量主要作為進(jìn)程間,以及進(jìn)程內(nèi)部線程之間的通訊手段。主要依賴,兼容擴(kuò)展實(shí)現(xiàn)方式的進(jìn)程間通信之消息隊(duì)列。 PHP間進(jìn)程如何通信,PHP相關(guān)的服務(wù)的IPC是實(shí)現(xiàn)方式,IPC的思想如何用到項(xiàng)目中。 一、linux進(jìn)程間通信 理解php間進(jìn)程通信機(jī)制,先了解...
摘要:如果是這樣,就需要引入信號(hào)量進(jìn)行控制。這應(yīng)該是因?yàn)檎诠蚕韮?nèi)存被上一次操作占用中還沒(méi)有釋放導(dǎo)致。 共享內(nèi)存 共享內(nèi)存的使用主要是為了能夠在同一臺(tái)機(jī)器不同的進(jìn)程中共享一些數(shù)據(jù),比如在多個(gè) php-fpm 進(jìn)程中共享當(dāng)前進(jìn)程的使用情況。這種通信也稱為進(jìn)程間通信(Inter-Process Communication),簡(jiǎn)稱 IPC。 PHP 內(nèi)置的 shmop 擴(kuò)展 (Shared Mem...
閱讀 3078·2021-11-24 09:38
閱讀 1330·2021-09-22 15:27
閱讀 2968·2021-09-10 10:51
閱讀 1504·2021-09-09 09:33
閱讀 917·2021-08-09 13:47
閱讀 2072·2019-08-30 13:05
閱讀 892·2019-08-29 15:15
閱讀 2425·2019-08-29 12:21