Étape 6: Les fonctions de lecture/écriture
Pour écrire dans la mémoire tampon, l’esquisse tente d’abord de décrémenter sem_space avec la fonction semop. Il utilise un struct (défini dans IPCBuffer.h comme sem_up et sem_down) dont les trois valeurs indiquent l’index dans le tableau de sémaphore (encore une fois, toujours 0 pour ce code), combien nous voulons increment (entier positif) ou décrémentation (entier négatif) et indicateurs de contrôle optionnel, respectivement. La troisième valeur de 0 signifie ici que le processus se bloque si elle est incapable de décrémenter le sémaphore (c.-à-d., le compteur est à 0).Après que la décrémentation à sem_space réussit, nous savons qu’il n’y a place pour au moins un élément de données. Nous permettons seulement un processus lire ou écrire une seule unité de données à la fois, sinon nous serait contraire à l’interprétation du compteur du sémaphore. Nous ne savons pas valeur du sémaphore, seulement qu’il n’était pas 0 quand nous avons appelé semop sur sem_space. Ensuite, nous essayons de decrement, sem_lock. Si elle bloque alors cela signifie un processus différent accède le segment de mémoire partagée. Lorsque l’esquisse est débloqué, il lira la tête du répertoire et copie des preuves d’une largeur d’octets de mémoire adresse source vers l’emplacement approprié dans la mémoire partagée. L’indice de tête est incrémenté et réécrites dans la mémoire partagée avant incrémentation sem_lock.
La dernière étape consiste à incrémenter sem_data. Cela permettra aux autres processus de voir que les nouvelles données valides a été placées dans la mémoire tampon. Il est intéressant de souligner que nous ne devons pas n’importe quel état supplémentaire pour gérer la situation où les valeurs de la tête et la queue sont égaux. Cela se produit lorsque le buffer est vide et quand il est plein. Les sémaphores sem_space et sem_data garder une trace de combien d’espace il y a de données être lues ou écrites dans la mémoire tampon. Lorsque sem_space atteint 0, par exemple, cela signifie que le tampon est plein et ne succédera à aucun processus essaie d’écrire dans la mémoire tampon jusqu'à ce qu’un processus différent lit un élément dans la zone tampon.
La méthode de lecture suit le même raisonnement pour l’écriture mais il décrémente sem_data premier et incrémente sem_space à la fin ainsi qu’à l’aide de l’index de queue pour lire de la mémoire tampon. Le script Python suit le même schéma pour lire et écrire juste avec l’API du module sysv_ipc.