Les sémaphores permettent de réaliser l'accès en exclusion mutuelle à une ressource (par exemple une zone de mémoire partagée).
Un peu de théorie :
Les sémaphores garantissent l'accès d'un nombre borné de processus à une donnée. Ils permettent de placer en exclusion mutuelle une ressource (par exemple la mémoire).
Dijkstra a écrit de nombreux algorithmes d'exclusion mutuelle, et a défini les sémaphores pour faciliter l'écriture de ces algorithmes. Les sémaphores sont des variables partagées, dont l'accès ne se fait que grâce aux deux opérations atomiques P et V.
On appelle section critique la partie de programme qui doit être réalisée en exclusion.
P(S)
Ces opérations sont atomiques : totalement ininterruptibles, ont toujours lieu séquentiellement même sur une machine multi-processeurs.
Le fichier <sys/sem.h>
:
Pour chaque sémaphore :
struct __sem {
unsigned short int semval; /* adresse */
unsigned short int sempid; /* pid de dernière opération */
unsigned short int semncnt; /* # de Proc. en attente de V */
unsigned short int semzcnt; /* # en attente de S = 0 */
};
Pour chaque dipc de sémaphore:
struct semid_ds {
struct ipc_perm sem_perm; /* droits */
struct __sem *sem_base; /* premier élément de l'ensemble*/
time_t sem_otime; /* last semop time */
time_t sem_ctime; /* last change time */
unsigned short int sem_nsems; /* taille de l'ensemble */
};