
설명하다
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 세마포어와 공유 메모리에 대한 소개입니다. 모든 분들께 도움이 되기를 바랍니다.