Lors de l'utilisation de mmap()
pour la mémoire partagée (à partir de Linux ou d'autres systèmes UNIX) est-il possible (et portable) d'utiliser les fonctions fcntl()
(ou flock()
ou lockf()
) pour coordonner l'accès au mappage?Coordination de mmap partagée à l'aide de verrous fcntl?
Les réponses à this SO question semble suggérer que cela devrait fonctionner.
L'idée que j'ai en tête serait de structurer la mémoire partagée avec un mappage processus/page pour minimiser la contention de verrouillage. Les processus peuvent chacun fonctionner avec leurs pages simultanément, et un verrou ne doit être acquis que lors de la mise à jour des mappages de processus/pages. (L'accès en lecture à partir de pages sans propriétaire impliquerait de vérifier un numéro de série, de copier les données désirées, puis de valider que le numéro de série de ce bloc n'avait pas changé). Conceptuellement chaque processus partageant ce mappage de fichiers effectuerait le mmap()
, y trouver un bloc libre, acquérir un verrou à la zone de processus/page, mettre à jour avec sa propre affectation, libérer le verrou, puis continuer joyeusement son travail . Tout processus peut rechercher des mappages périmés (en utilisant kill()
avec zéro comme signal) et nettoyer le mappage de processus/table de pages.
(En termes grossiers et génériques, je suis en train de jouer avec un moteur de production/consommateur utilisant la mémoire partagée de Python sur Linux, je voudrais que la solution soit portable à BSD et à d'autres langages de programmation. tant que le support mmap()
et les interfaces nécessaires à fcntl()
, flock()
ou lockf().
Je serais également intéressé par psuedo code montrant comment on mesurerait la contention de verrouillage et de détecter les défauts de synchronisation. Je suis conscient que le filetage et multitraitement avec leurs objets Queue()
respectifs sont la manière la plus simple d'implémenter un modèle de traitement Python producteur/consommateur).
Pas besoin d'écrire une extension Python en fait. Vous pouvez utiliser le module 'ctypes' de Python pour accéder à la bibliothèque C directement via le code Python. (Vous avez toujours besoin d'une bonne quantité de connaissances sur C si) – intgr