Question

Lors de l'utilisation mmap() mémoire partagée (à partir de Linux ou d'autres systèmes de type UNIX) est-il possible (et portable) à utiliser fcntl() (ou fonctions flock() ou lockf()) pour coordonner l'accès à la cartographie?

Les réponses à ce SO question semble suggérer qu'il devrait fonctionner.

L'idée que j'ai à l'esprit serait d'avoir la mémoire partagée structurée avec une carte processus / page pour minimiser la contention de verrouillage. Les processus peuvent chaque travail avec leurs pages simultanément, et une serrure aurait seulement besoin d'être acquise lors de la mise à jour des applications processus / page. (Accès en lecture des pages unowned impliquerait la vérification d'un numéro de série, la copie des données souhaitées, puis validez que le numéro de série de ce bloc n'a pas changé).

Conceptuellement chaque processus de partage de ce mappage de fichiers exécuterait le mmap(), trouver un bloc libre à l'intérieur, un verrou dans la zone processus / page, mise à jour qui avec sa propre mission, libérer le verrou, puis passez allègrement ses travaux. Tout processus pourrait rechercher des applications obsolètes (en utilisant kill() avec zéro comme signal) et nettoyer le mappage de table processus / page.

(dans le rough, termes génériques, je suis jouer avec un moteur de traitement de producteur / consommateur en utilisant la mémoire partagée de Python sur Linux, je voudrais que la solution soit portable BSD et à d'autres langages de programmation --- si longtemps comme mmap() de soutien et les interfaces nécessaires pour 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 threading et multitraitement avec leurs objets respectifs Queue() sont la façon la plus simple à mettre en œuvre un modèle de traitement de producteur Python / consommateur).

Était-ce utile?

La solution

Je suis sûr que les serrures fourniront l'exclusion mutuelle, mais je ne sais pas s'ils vous donneront une barrière de mémoire. Il semble comme sauter dans le noyau (qui fcntl, troupeau et lockf fera) est susceptible de le faire quelque chose que les forces hors de la mémoire de commande lit et écrit à commettre, mais je doute que vous aurez un garantie dur. Je pense que c'est une de ces choses où il travaille probablement, et le test montrera qu'il fonctionne, mais vous ne saurez pas que cela fonctionne toujours à moins de trouver une référence disant que beaucoup.

Je l'ai fait quelque chose de semblable à ce de C, mais je spinlocks atomique dans la mémoire partagée elle-même. Il fut un temps que vous deviez faire un peu de montage en ligne, mais gcc a maintenant quelques opérations intrinsèques que vous pouvez utiliser:

http://gcc.gnu.org/onlinedocs/gcc/Atomic- Builtins.html

Si vous êtes prêt à écrire une extension Python très simple, vous pouvez envelopper __sync_lock_test_and_set (...) et __sync_lock_release (...) pour faire ce que vous avez besoin. Celles-ci devraient être assez portable.

Je crois qu'il ya un moyen de mettre en mutex pthread mémoire partagée aussi, mais je n'ai aucune expérience avec cela. Encore une fois, vous devriez écrire une simple extension C pour obtenir l'accès à ce à partir de Python.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top