首頁 php教程 PHP源码 PHP进程通信基础之信号量与共享内存通信_php技巧

PHP进程通信基础之信号量与共享内存通信_php技巧

May 26, 2016 am 08:18 AM
共享記憶體 行程通訊 進程間通訊

这篇文章主要介绍了PHP进程通信基础知识中的信号量与共享内存通信的相关资料,有需要的小伙伴可以查看下

由于进程之间谁先执行并不确定,这取决于内核的进程调度算法,其中比较复杂。由此有可能多进程在相同的时间内同时访问共享内存,从而造成不可预料的错误。信号量这个名字起的令人莫名其妙,但是看其英文原意,就十分容易理解。

semaphore 英[ˈseməfɔ:(r)] vt. 发出信号,打旗语;

类似于指挥官的作用。

下面我们看下一个伪代码信号量的使用。

1、创建信号量唯一标识符

$ftok = ftok(__FILE__, 'a');

2、创建信号量资源ID

$sem_resouce_id = sem_get($ftok);

3、接受信号量

sem_acqure($sem_resource_id);

4、释放信号量

sem_release($sem_resource_id);

5、销毁信号量

sem_remove($sem_resource_id);

举个不文雅的例子,使我们容易理解这个信号量在生活中的用法。理解之后可以套用到我们编程领域。
一家公司只有一个卫生间。那么当有人上厕所的时候,都要获取一把锁(信号量),表示卫生间正在使用。代码如下:

sem_acqure($sem_resource_id);

那么员工上完厕所之后,就需要将锁打开,释放锁(信号量),表示现在可以允许别人使用。代码如下:

sem_release($sem_resource_id);

通过一个简单的锁,我们就能够知道当前的厕所(共享内存)是否可以使用。这个例子不雅观,但说明了问题。这篇博客也是有味道的博客,真是不容易。。。。以下是示例代码:

<?php
//创建共享内存区域
$shm_key = ftok(__FILE__, &#39;a&#39;);
$shm_id = shm_attach($shm_key, 1024, 0755);
//var_dump($shm_id);die(); resource(4) of type (sysvshm)
const SHARE_KEY = 1;
$child_list = [];
//加入信号量
$sem_id = ftok(__FILE__, &#39;b&#39;);
$signal = sem_get($sem_id);
//$signal resource(5) of type (sysvsem)
for ($i = 0; $i < 3; $i++) {
  $pid = pcntl_fork();
  if ($pid == -1) {
    exit("Fork fail!".PHP_EOL);
  } elseif ($pid == 0) {
   //获取信号量
   sem_acquire($signal);
    if (shm_has_var($shm_id,SHARE_KEY)) {
      $count = shm_get_var($shm_id, SHARE_KEY);
      $count++;
      //模拟业务处理
      $sec = rand(1, 3);
      sleep($sec);
     shm_put_var($shm_id, SHARE_KEY, $count);
    } else {
      $count = 0;
      $sec = rand(1, 3);
      sleep($sec);
      shm_put_var($shm_id, SHARE_KEY, $count);
    }
    echo "child process: ".getmypid()." is writing! now count is: $count ".PHP_EOL;
    //释放信号量
    sem_release($signal);
    exit("child process".getmypid()."end".PHP_EOL);
  } else {
    $child_list[] = $pid;
  }
}

while (count($child_list) > 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;

//销毁信号量
sem_remove($signal);

shm_remove($shm_id);
shm_detach($shm_id);
登入後複製
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

win10gpu共享記憶體關閉方法 win10gpu共享記憶體關閉方法 Jan 12, 2024 am 09:45 AM

對電腦有了解的小伙伴肯定都知道gpu有著共享內存,而許多小伙伴都擔心共享內存會導致內存數變小影響電腦而想著關閉它,下面就給大家帶來了關閉它的方法,一起看看吧。 win10gpu共享記憶體關閉:註:GPU的共享記憶體是無法關閉的,但是可以將它的數值設定為最小值。 1.開機時按DEL進入BIOS,部分主機板需要按F2/F9/F12進入,在BIOS介面的最上方有很多Tab,包含「Main、Advanced」等等設定,找到「Chipset」選項。在下面的介面中找到SouthBridge設定選項,點擊Enter進入

Golang函數的多進程之間共享記憶體的應用方法 Golang函數的多進程之間共享記憶體的應用方法 May 17, 2023 pm 12:52 PM

Golang作為一門高並發程式語言,其內建的協程機制和多執行緒操作實現了輕量級的多工處理。然而,在多進程處理的場景下,不同進程之間的通訊和共享記憶體成為了程式開發的關鍵問題。本文將介紹在Golang中實作多進程之間共享記憶體的應用方法。一、Golang中多進程的實作方式在Golang中,可以透過多種方式實現多進程並發處理,其中包括fork、os.Process、

PHP共享記憶體函數用法及應用 PHP共享記憶體函數用法及應用 Jun 16, 2023 pm 12:27 PM

PHP共享記憶體函數用法及應用共享記憶體是指多個進程同時存取同一段記憶體空間的技術。在同時編程中,共享記憶體可用於進程間通信,從而實現不同進程之間的資料共享。 PHP也提供了相關的共享記憶體函數,這篇文章將介紹PHP共享記憶體函數的用法,並且探討一些實際應用場景。共享記憶體函數的使用PHP提供了shmop這個擴充模組,使得PHP可以對系統共享記憶體進行操作。此擴充模組提供的函

PHP中的多進程 PHP中的多進程 May 23, 2023 am 08:39 AM

隨著網路的發展,越來越多的網站需要承載大量使用者的存取請求。單一進程的伺服器在面對高並發的情況下,會很快達到瓶頸,導致使用者無法正常存取網站。因此,多進程成為解決高並發問題的有效方案之一。本文將介紹PHP中的多進程技術,在保證程序品質的前提下提高程序處理並發請求的能力。一、多進程簡介在電腦科學中,進程是指正在執行的程式實例。每個行程有自己的記憶體空間和系統資源。

Golang 進程通訊:建構高效溝通橋樑 Golang 進程通訊:建構高效溝通橋樑 Apr 03, 2024 pm 10:09 PM

Go中的進程間通訊(IPC)透過管道、通道和共享記憶體實現。管道允許協程透過管道端點寫入和讀取數據,而通道則保證了發送和接收操作的原子性。共享記憶體透過讓進程存取同一塊記憶體實現快速資料交換,但需要同步以防止並發存取。

Golang開發:使用RPC實現跨進程通信 Golang開發:使用RPC實現跨進程通信 Sep 21, 2023 pm 03:26 PM

Golang開發:使用RPC實現跨進程通信,需要具體程式碼範例一、介紹RPCRPC(RemoteProcedureCall)是一種遠端過程調用協議,它使得客戶端可以呼叫位於遠端電腦上的服務端程式的函數或方法,就像呼叫本地函數一樣。 RPC可以使用不同的網路協定實現,如TCP、HTTP等。在分散式系統中,RPC是一種重要的通訊機制,常用於跨進程或跨網路節點的

Python 3.x 中如何使用multiprocessing模組進行進程間通訊 Python 3.x 中如何使用multiprocessing模組進行進程間通訊 Aug 01, 2023 pm 12:39 PM

Python3.x中如何使用multiprocessing模組進行進程間通訊隨著電腦技術的發展,我們在程式設計中經常需要同時執行多個任務。為了更好地利用多核心處理器,Python的multiprocessing模組提供了一套簡單而強大的工具來創建並發程式。 multiprocessing模組允許我們在Python中使用多個進程,這些進程可以同時執行並在需要時進

在C++中使用共享記憶體和訊息佇列 在C++中使用共享記憶體和訊息佇列 Aug 22, 2023 pm 04:21 PM

在C++中,共享記憶體和訊息佇列是兩個常用的進程間通訊方式。它們可以幫助我們在不同的進程之間共享數據和訊息,從而實現更有效率的程式設計。共享記憶體是一種特殊的記憶體區域,可以被多個進程共享。使用共享記憶體可以避免複製資料的開銷,也能夠減少資料在進程間傳輸的延遲。 C++中使用共享記憶體需要包含&lt;sys/shm.h&gt;頭文件,並使用shmget、shmat、sh

See all articles