Articles récents
Linux/Unix : Les communications entre processus - IPC POSIX
Nous avons étudié dans le chapitre précédent la gestion des processus. Voyons maintenant comment les faire discuter entre eux.
Plusieurs mécanismes sont rassemblés sous le terme IPC (Inter Processus Communication) qui regroupe un ensemble de mécanismes permettant à des processus concurrents (ou distants) de communiquer.
Introduction
Il faut distinguer les IPC système V, plus ancien, ils offrent plus de possibilités mais sont plus complexes à utiliser; et les IPC POSIX (plus récents et plus simple à utiliser). Nous n'étudierons que les IPC POSIX car je considère qu'il faut toujours se tourner vers l'avenir.Ces mécanismes peuvent être classés en trois catégories :
On distingue trois types d'IPC:
1)Les sémaphores
Les sémaphores POSIX et System V fonctionnent selon le même principe, les POSIX sont plus simples et plus performants. On distingue deux types de sémaphores: nommés et non-nommés.Le principe des sémaphores est assez simple. Un sémaphore est un entier prenant la valeur 0 ou 1, auquel est associé deux opérations atomiques:
Les sémaphores constituent une solution pour résoudre le problème des accès multiples sur des ressources partagées entre activités. Globalement le concept est le suivant: le processus père créé un sémaphore qu'il initialise à 1, puis créé un processus fils. Ces deux processus seront concurrents. Aussi, pour pouvoir entrer en section critique, ils devront appliquer l'algorithme suivant : opération P sur le sémaphore, traitement de la section critique puis opération V.
Avec Linux, on peut gérer un sémaphore pour plusieurs threads. Il existe une commande pour afficher les sémaphores et une autre pour les détruire:
1.1)Les sémaphores nommés
Création :oflag spécifie le type d'accès (O_CREAT,O_EXCL,0), value repésente la valeur initiale.
Destruction :
A noter que sous Linux, les sémaphores n'ont été implémentés que depuis la version 2.6 du noyau, Linux propose une pseudo système /dev/shm pour manipuler les objets POSIX.
1.2)Les sémaphores non-nommés
Création :sem_init() initialise le sémaphore non-nommé situé à l'adresse pointée par sem, retourne 0 en cas de succès et -1 sinon. Value initialise la valeur du sémaphore. L'argument pshared indique que le sémaphore sera partagé entre différents threads ou processus, si 0 le sémaphore sera partagé entre les activités.
Destruction :
1.3)Verrouiller/déverrouiller le sémaphore
La fonction sem_wait() décrémente le sémaphore s'il est positif, sinon il est reste en attente que le sémaphore soit disponible. La fonction sem_trywait() fait la même chose mais sans attente. Enfin, la fonction sem_post() incrémente le sémaphore pointé par sem et débloque l'attente des autres threads.
Il est possible de disposer de disposer d'une attente limitée, si le sémaphore n'est toujours pas disponible, la fonction retourne -1 et rend la main.
1.3)Exemples d'utilisation des sémaphores
Le premier exemple pour une utilisation des sémaphores nommés. On créé deux thread qui sont mis en attentes immédiatement puis le processus père débloque le sémaphore pour chacun.Un second exemple de code avec les sémaphore non-nommés ce coup-ci. On bloque le processus père après chaque création d'un fils puis on libère le père deux secondes après. Ce code permet au thread fils de ne pas être perturbé par le processus père.
2)Segments de mémoire partagée POSIX
Le système Unix permet de partager la mémoire entre plusieurs processus grâce aux segments de mémoire partagée, c'est le moyen le plus rapide d'échange de données.2.1)Création et supression
La fonction shm_open() permet de créer un segment de mémoire partagée, avec nom pour le fichier, o_flag le type d'ouverture du segment (O_CREAT,O_EXCL,O_RDONLY,O_RDWR,O_TRUNC,0) et mode de création.
2.2)Initialisation d'un segment d'interface
Mais l'opération n'est pas terminée! Nous avons initialisé notre segment, ensuite il faut le projeter en mémoire grâce à la fonction mmap().
2.3)Exemple de mise en oeuvre de segment d'interface
Dans notre exemple, nous allons créer un processus père et un processus fils. Le père va charger un texte en mémoire et la fils va le lire puis l'afficher.3)Files de messages POSIX
3.1)création et suppression
3.2)Envoi d'un message
La fonction mq_send() transmet le message, pointé par msg_ptr, de priorité msg_prio et de longueur msg_len, à la file de messages. La priorité est un entier entre 0 et 31.3.3)Réception d'un message
La chaîne pointée est mise à jour par la fonction mq_receive() avec le message le plus prioritaire dans la file de messages en attente.
3.4)Linux et les files de messages
Les files de messages ont été implémentées depuis la version 2.6.6 du noyau Linux. Elles sont accessibles via le pseudo système /proc par la commande ls /proc/sys/fs/mqueue.Conclusion
Nous avons vu les trois types d'IPC POSIX Unix. Je ne vous cache pas que personnellement je préfère l'utilisation des sémaphores, qui présentent l'avantage de fonctionner sur toutes les plateformes.
© 2024 www.doritique.fr par Robert DORIGNY