IPC sans verrouillage sous Linux pour les processeurs multicœurs


9

J'essaie de trouver un moyen d'écrire une application avec IPC sans verrouillage sous Linux, en C, avec des processeurs multicœurs.

Supposons que j'ai le processus 1 et le processus 2 qui écrivent dans une mémoire FIFO ou partagée. Ensuite, le processus 3 et le processus 4 liront à partir de cette mémoire partagée ou FIFO.

Est-ce possible avec un algorithme sans verrouillage?

Vos conseils sont très appréciés.


Pouvez-vous donner des indications ou une référence à une documentation externe concernant la communication sans verrouillage? Que signifie exactement ce terme?
Giorgio


Si je comprends bien, le problème est les écritures simultanées (1, 2) et les lectures simultanées (3, 4). La synchronisation entre écrivains et lecteurs est déjà couverte par l'algorithme décrit sur la page liée.
Giorgio

Réponses:


2

J'ai vu une référence à l'utilisation de tampons en anneau et un accès contrôlé aux pointeurs de localisation pour éliminer ou réduire le besoin de verrous. Cependant, cela n'élimine pas la nécessité d'attendre et ne devrait fonctionner que si un tampon en anneau a un écrivain et un lecteur. Dans votre cas, vous auriez besoin d'au moins deux tampons.

Le mécanisme que je comprends est:

  • l'écrivain attend qu'il y ait un emplacement ouvert (dernier + 1! = courant)
  • le rédacteur écrit l'entrée dans le tampon en anneau.
  • l'auteur met à jour le dernier pointeur d'entrée.

  • le lecteur attend qu'il y ait une entrée disponible dans le tampon en anneau (dernier! = courant).

  • le lecteur traite l'entrée.
  • le lecteur incrémente le pointeur actuel.

Selon le temps d'attente utilisé, cela peut soit ajouter de la latence pour les nouveaux éléments dans une file d'attente vide, soit graver de nombreux cycles CPU dans la boucle d'attente. L'ordre de mise à jour du pointeur et de séparation stricte de l'accès en écriture est essentiel pour que cela fonctionne. L'écrivain est uniquement autorisé à écrire l'entrée du tampon en anneau avant d'incrémenter le pointeur pour le mettre à la disposition du lecteur.


Et j'ai aussi trouvé celui-ci sur wikipedia, il a l'air intéressant, je ne l'ai pas encore essayé par concurrencykit.org
poly

1

Oui c'est possible. Nous utilisons l'un des algorithmes de la file d'attente sans verrou dans notre projet. Mais ces algorithmes ne sont vraiment pas évidents. Si vous voulez les comprendre en profondeur, vous devriez être prêt à y passer quelques mois.


0

La communication entre processus ne peut pas être sans verrouillage. Inter-thread uniquement. Pour autant que je sache.


Je pense que "lock free" est un attribut du mécanisme, pas de l'utilisateur. La différence entre les threads et les processus devient assez mince lorsque vous ajoutez des éléments tels que la mémoire partagée au mélange.
tylerl
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.