설명하다
1. 세마포어(Semaphore): 시스템이 제공하는 원자적 연산으로 동시에 하나의 프로세스에서만 신호량을 연산할 수 있습니다.
프로세스는 신호를 받고 프로세스에 의해 해제되어야 합니다.
2. 공유 메모리(Shared memory) : 시스템이 메모리 내에서 오픈하는 공용 메모리 영역으로, 모든 프로세스에서 접근이 가능하다.
동시에 여러 프로세스가 이 영역에 액세스할 수 있으므로 데이터 일관성을 보장하기 위해 이 메모리 영역을 잠그거나 신호를 보내야 합니다.
예
echo "상위 진행 pid:{$parentPid}n"; $childList = 배열(); //공유 메모리 생성, 세마포어 생성, 공유 키 정의 $shm_id = ftok(__FILE__,'m'); $sem_id = ftok(__FILE__,'s'); $shareMemory = shm_attach($shm_id); $신호 = sem_get($sem_id); const SHARE_KEY = 1; // 생산자 함수 producer(){ 글로벌 $shareMemory; 글로벌 $ 신호; $pid = posix_getpid(); $repeatNum = 5; for ( $i = 1; $i <= $repeatNum; $i++) { //세마포어 획득 sem_acquire($signal); if (shm_has_var($shareMemory,SHARE_KEY)){ // 값이 있으면 1개 추가 $count = shm_get_var($shareMemory,SHARE_KEY); $개수++; shm_put_var($shareMemory,SHARE_KEY,$count); echo "({$pid}) 개수: {$count}n"; }또 다른{ // 값 없음, 초기화 shm_put_var($shareMemory,SHARE_KEY,0); echo "({$pid}) 개수: 0n"; } // 사용 후 해제 sem_release($signal); $rand = 랜드(1,3); 수면($rand); } } 함수 createProgress($callback){ $pid = pcntl_fork(); if ( $pid == -1) { //생성 실패exit("포크 진행 오류!n"); } else if ($pid == 0) { // 하위 프로세스 실행 프로그램 $pid = posix_getpid(); $콜백(); exit("({$pid})하위 진행 끝!n"); }또 다른{ //상위 프로세스가 프로그램을 실행합니다. return $pid; } } // ($i = 0; $i < 3; $i ++ ) {에 대한 3개의 쓰기 프로세스 $pid = createProgress('생산자'); $childList[$pid] = 1; echo "생산자 하위 생성 진행률: {$pid} n"; } // 모든 하위 프로세스가 끝날 때까지 기다립니다. while(!empty($childList)){ $childPid = pcntl_wait($status); if ($childPid > 0){ unset($childList[$childPid]); } } // 공유 메모리 및 세마포어 해제 shm_remove($shareMemory); sem_remove($signal); echo "({$parentPid})주요 진행 끝!n";
위 내용은 PHP 세마포어와 공유 메모리에 대한 소개입니다. 모든 분들께 도움이 되기를 바랍니다.