
ilustrar
1. Semáforo: es una operación atómica proporcionada por el sistema. Una cantidad de señal solo puede ser operada por un proceso al mismo tiempo.
Un proceso recibe una señal y debe ser liberado por el proceso.
2. Memoria compartida: es un área de memoria pública abierta por el sistema en la memoria y a la que puede acceder cualquier proceso.
Al mismo tiempo, varios procesos pueden acceder a esta área. Para garantizar la coherencia de los datos, esta área de memoria debe estar bloqueada o señalizada.
Ejemplo
echo "pid de progreso principal:{$parentPid}n";
$listaniño = matriz();
//Crea memoria compartida, crea semáforo y define clave compartida
$shm_id = ftok(__FILE__,'m');
$sem_id = ftok(__FILE__,'s');
$shareMemory = shm_attach($shm_id);
$señal = sem_get($sem_id);
constante SHARE_KEY = 1;
// función de productor productor(){
global $compartirMemoria;
señal $ global;
$pid = posix_getpid();
$númerorepetición = 5;
para ( $i = 1; $i <= $repeatNum; $i++) {
//Adquirir el semáforo sem_acquire($signal);
si (shm_has_var($shareMemory,SHARE_KEY)){
// Si hay un valor, agrega uno $count = shm_get_var($shareMemory,SHARE_KEY);
$cuenta++;
shm_put_var($shareMemory,SHARE_KEY,$count);
echo "({$pid}) recuento: {$cuenta}n";
}demás{
// Sin valor, inicialización shm_put_var($shareMemory,SHARE_KEY,0);
echo "({$pid}) recuento: 0n";
}
// Liberar después del uso sem_release($signal);
$rand = rand(1,3);
dormir ($ rand);
}
}
función crearProgreso($devolución de llamada){
$pid = pcntl_fork();
si ($pid == -1) {
// Error en la creación exit("¡error de progreso de la bifurcación!n");
} más si ($pid == 0) {
// Programa de ejecución de subprocesos $pid = posix_getpid();
$devolución de llamada();
exit("({$pid})¡fin del progreso del niño!n");
}demás{
//El proceso padre ejecuta el programa return $pid;
}
}
// 3 procesos de escritura para ($i = 0; $i < 3; $i ++ ) {
$pid = createProgress('productor');
$childList[$pid] = 1;
echo "crear progreso hijo productor: {$pid} n";
}
// Espera a que finalicen todos los procesos secundarios while(!empty($childList)){
$childPid = pcntl_wait($estado);
si ($childPid > 0){
unset($childList[$childPid]);
}
}
// Liberar memoria compartida y semáforo shm_remove($shareMemory);
sem_remove($señal);
echo "({$parentPid})¡fin del progreso principal!n";Lo anterior es una introducción a los semáforos PHP y la memoria compartida. Espero que sea útil para todos.