di: Marco Bonzanini 18 Marzo 2004
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.
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
In rete troviamo poche risorse che interessano direttamente PHP, tutte in inglese.
Guida Yii FrameworkCome creare applicazioni Web in modo semplice e veloce con il... |
Guida Zend FrameworkDiventate professionisti dello sviluppo Web. Zend Framework è lo... |
Guida Applicazioni Facebook con PHPCome realizzare un'applicazione per Facebook. Dalle basi della... |
Ogni lunedì, direttamente nella tua e-mail: script, articoli, guide e tutorial su PHP, MySQL e Apache.
Iscriviti alla newsletter
|
|
Corso PHP per Webmaster11 Giugno 2012 a Milano |
|
|
Corso Google AdWords Base25 Giugno 2012 a Milano |
|
|
Corso Google AdWords Base05 Giugno 2012 a Roma |