訊號量是什麼? 訊號量 : 又稱為訊號燈、旗語 用來解決程序(執行緒同步的問題),類似於一把鎖,訪問前獲取鎖(獲取不到則等待),訪問後釋放鎖。
舉乙個生活中的例子:以乙個停車場的運作為例。簡單起見,假設停車場只有三個車位,一開始三個車位都是空的。這時如果同時來了五輛車,看門人允許其中三輛直接進入,然後放落車攔,剩下的車則必須在入口等待,此後來的車也都不得不在入口
處等待。這時,有一輛車離開停車場,看門人得知後,開啟車攔,放入外面的一輛進去,如果又離開兩輛,則又可以放入兩輛,如此往復。在這個停車場系統中,車位是公共資源,每輛車好比乙個執行緒,看門人起的就是訊號量的作用
下面我們來看一下訊號量的幾個函式:
<?php
$key=ftok(__file__,'t');
/** * 獲取乙個訊號量資源
int $key [, int $max_acquire = 1 [, int $perm = 0666 [, int $auto_release = 1 ]]]
$max_acquire:最多可以多少個程序同時獲取訊號
$perm:許可權 預設 0666
$auto_release:是否自動釋放訊號量
*/$sem_id=sem_get($key);
#獲取訊號
sem_acquire($seg_id);
//do something 這裡是乙個原子性操作
//釋放訊號量
sem_release($seg_id);
//把次訊號從系統中移除
sem_remove($sem_id);
//可能出現的問題
$fp = sem_get(fileinode(__dir__), 100);
sem_acquire($fp);
$fp2 = sem_get(fileinode(__dir__), 1);
sem_acquire($fp2);
?>
<?php
//共享記憶體通訊
//1、建立共享記憶體區域
$shm_key = ftok(__file__, 't');
$shm_id = shm_attach( $shm_key, 1024, 0655 );
const share_key = 1;
$childlist = ;
//加入訊號量
$sem_id = ftok(__file__,'s');
$signal = sem_get( $sem_id );
//2、開3個程序 讀寫 該記憶體區域
for ( $i = 0; $i < 3; $i++ ) else if ( $pid == 0 ) else
echo "child process " . getmypid() . " is writing ! now count is $count\n";
// 用完釋放
sem_release($signal);
exit( "child process " . getmypid() . " end!\n" );
} else }
// 等待所有子程序結束
while( !empty( $childlist ) )
}//父程序讀取共享記憶體中的值
$count = shm_get_var($shm_id, share_key);
echo "final count is " . $count . php_eol;
//3、去除記憶體共享區域
#從系統中移除
shm_remove($shm_id);
#關閉和共享記憶體的連線
完美的處理了程序之間搶資源的問題,實現了操作的原子性!
程序間通訊 訊號量
ipc識別符號和關鍵字 在終端輸入ipcs,可以看到目前系統中所有的ipc資訊 第一列的key就是ipc的關鍵字,第二列是ipc的識別符號。ftok 函式用於獲得乙個ipc的關鍵字,其函式原型是 key t ftok const char pathname,int proj id 下面是乙個訊號量的...
程序間通訊 訊號量
system ipc中,對於每乙個新建的訊號量 訊息佇列 共享記憶體,都有乙個在整個系統中唯一的識別符號。每個標識也都有唯一對應的關鍵字,關鍵字的資料型別為ket t 在終端輸入命令 ipcs 可以看到目前系統中所有的ipc資訊 共享記憶體段 鍵 shmid 擁有者 許可權 位元組 nattch 狀...
程序間通訊 訊號量
訊號量不是ipc 機構,它只是乙個計數器用於不同程序之間或同一程序不同執行緒之間的同步,型別 二元訊號 值為0或 1,1說明有可用資源,0說明此時資源占用,其他程序需等待。計數訊號量 表示可用資源數量。計數訊號量集 由乙個或多個訊號量組成的集合,每乙個都是計數訊號量。訊號量資料結構 include ...