PHP  »  Articoli  »  Programmazione Php 

IPC: gestire i processi di sistema con PHP

di: Marco Bonzanini     18 Marzo 2004

Il problema della concorrenza

Mentre la lettura simultanea di una risorsa da parte di più processi non dovrebbe causare alcun problema, la scrittura può invece provocare situazioni di incoerenza. Nel caso della memoria condivisa, questa problematica può essere affrontata utilizzando i semafori.

Come per la memoria condivisa, anche i semafori hanno bisogno di una chiave, che andrà generata con ftok(). Essendo in sostanza un contatore, possiamo specificare quante volte questo può essere acquisito (normalmente 1, che è anche il valore di default). Nell'esempio, riproporremo in parte l'accesso alla memoria condivisa, implementando una semplice forma di mutua esclusione, ossia un sistema che garantisca l'esecuzione delle porzioni di codice potenzialmente pericolose da parte di un solo processo per volta.

$shm_key = ftok(__FILE__, 'a');
$sem_key = ftok(__FILE__, 'b');
$shm_id = shmop_open($shm_key, 'c', 0600, 1024);
$sem_id = sem_get($sem_key);
sem_acquire($sem_id);
/* Inizio sezione critica
* In questo punto andranno inserite le operazioni
* di scrittura che possono causare incoerenza
* Fine sezione critica
*/
sem_release($sem_id);

sem_get() ci consente, data una chiave, di ottenere l'identificativo del semaforo, ed eventualmente di crearlo se fosse necessario. Le funzioni sem_acquire() e sem_release() invece, ci consentono rispettivamente di acquisire e rilasciare un semaforo. Un semaforo (a meno che non sia specificato diversamente con sem_get) può essere acquisito soltanto da un processo per volta: se questa risorsa non dovesse essere disponibile, il processo rimane in attesa fino al suo rilascio. Per questo motivo, una volta usciti dalla sezione critica, ossia quella porzione di codice che risulta potenzialmente pericolosa per le situazioni di incoerenza, è importante rilasciare il semaforo. Per eliminare un semaforo quando questo non serve più, si utilizza la funzione sem_remove(), passandole come parametro l'identificativo corrispondente.

Considerazioni finali e approfondimenti

L'accesso alla memoria primaria dovrebbe risultare molto più veloce rispetto alla memoria secondaria. Tuttavia l'uso dell'estensione shmop di PHP, dopo alcuni semplici benchmark, non risulta così esaltante sotto il profilo delle prestazioni: ciò può significare che il caching del filesystem effettuato dal sistema operativo è particolarmente efficiente, oppure che l'estensione sotto esame può ancora essere migliorata.

Se si desira fare alcune prove (ed è caldamente consigliato farlo!) con semafori e memoria condivisa, è opportuno far notare che possiamo utilizzare due comandi da shell che ci consentono di monitorare i nostri esperimenti: ipcs, che fornisce lo status delle risorse IPC attuali, ed ipcrm che ci consente di rimuovere una risorsa IPC precedentemente allocata. È importante tenere presente che una risorsa IPC, come un segmento di memoria, può essere liberata soltanto da chi l'ha creata, oppure dall'utente root: diventa fondamentale quindi prevedere all'interno degli script il rilascio delle risorse quando queste non servono più, oppure, se si vuole agire tramite shell come utente amministratore, è opportuno prestare molta attenzione a come ci si muove.

Al di là degli aspetti didattici dell'argomento, un possibile uso della memoria condivisa può riguardare un sistema di caching: un esempio dal mondo reale ci viene fornito da PEAR::Cache, un pacchetto che ci consente di effettuare il caching dei dati utilizzando vari metodi, tra cui la memoria condivisa. I commenti dello stesso autore ed alcune rapide prove ci ripropongono però il problema dell'efficienza.

Concludiamo con alcune letture consigliate, riproponendo nuovamente

  • GaPiL che è probabilmente la risorsa in italiano più esauriente. Le "man pages" di ipc, ipcs, ipcrm e ftok forniscono buoni spunti.
  • Chiaramente le pagine del manuale di PHP per shmop e semafori dovranno essere un punto di riferimento.

In rete troviamo poche risorse che interessano direttamente PHP, tutte in inglese.

Guide PHP

Guida Yii Framework

Come creare applicazioni Web in modo semplice e veloce con il...

Guida Zend Framework

Diventate professionisti dello sviluppo Web. Zend Framework è lo...

Guida Applicazioni Facebook con PHP

Come realizzare un'applicazione per Facebook. Dalle basi della...

Altre guide

Newsletter @PHP

Ogni lunedì, direttamente nella tua e-mail: script, articoli, guide e tutorial su PHP, MySQL e Apache.

Iscriviti alla newsletter

Altre newsletter

Corsi in aula

Corso PHP per Webmaster

11 Giugno 2012 a Milano
Disponibilità: 7 Posti

Corso Google AdWords Base

25 Giugno 2012 a Milano
Disponibilità: 7 Posti

Corso Google AdWords Base

05 Giugno 2012 a Roma
Disponibilità: 7 Posti