
illustrer
1. Sémaphore : Il s'agit d'une opération atomique fournie par le système. Une quantité de signal ne peut être exploitée que par un seul processus à la fois.
Un processus reçoit un signal et doit être libéré par le processus.
2. Mémoire partagée : Il s'agit d'une zone de mémoire publique ouverte par le système dans la mémoire et accessible par n'importe quel processus.
En même temps, plusieurs processus peuvent accéder à cette zone. Afin de garantir la cohérence des données, cette zone mémoire doit être verrouillée ou signalée.
Exemple
echo "pid de progression parent :{$parentPid}n" ;
$childList = tableau();
//Créer une mémoire partagée, créer un sémaphore et définir une clé partagée
$shm_id = ftok(__FILE__,'m');
$sem_id = ftok(__FILE__,'s');
$shareMemory = shm_attach($shm_id);
$signal = sem_get($sem_id);
const SHARE_KEY = 1 ;
// fonction producteur producteur(){
mémoire de partage $ globale ;
signal $ global ;
$pid = posix_getpid();
$repeatNum = 5 ;
pour ( $i = 1; $i <= $repeatNum; $i++) {
//Acquérir le sémaphore sem_acquire($signal);
si (shm_has_var($shareMemory,SHARE_KEY)){
// S'il y a une valeur, ajoutez-en une $count = shm_get_var($shareMemory,SHARE_KEY);
$compte++;
shm_put_var($shareMemory,SHARE_KEY,$count);
echo "({$pid}) count : {$count}n" ;
}autre{
// Aucune valeur, initialisation shm_put_var($shareMemory,SHARE_KEY,0);
echo "({$pid}) nombre : 0n" ;
}
// Libération après utilisation sem_release($signal);
$rand = rand(1,3);
dormir($rand);
}
}
fonction createProgress($callback){
$pid = pcntl_fork();
si ( $pid == -1) {
//Échec de la création exit("erreur de progression du fork !n");
} sinon si ($pid == 0) {
// Programme d'exécution de sous-processus $pid = posix_getpid();
$rappel();
exit("({$pid})fin de progression de l'enfant!n");
}autre{
//Le processus parent exécute le programme return $pid;
}
}
// 3 processus d'écriture pour ($i = 0; $i < 3; $i ++ ) {
$pid = createProgress('producteur');
$childList[$pid] = 1;
echo "créer la progression de l'enfant producteur : {$pid} n" ;
}
// Attendez la fin de tous les processus enfants while(!empty($childList)){
$childPid = pcntl_wait($status);
si ($childPid > 0){
unset($childList[$childPid]);
}
}
// Libère la mémoire partagée et le sémaphore shm_remove($shareMemory);
sem_remove($signal);
echo "({$parentPid})fin de la progression principale !n" ;Ce qui précède est une introduction aux sémaphores PHP et à la mémoire partagée. J'espère que cela sera utile à tout le monde.