Pregunta

Cuando usas mmap() para memoria compartida (de Linux u otros sistemas similares a UNIX), ¿es posible (y portátil) utilizar fcntl() (o flock() o lockf() funciones) para coordinar el acceso al mapeo?

Responde a esta pregunta SO parece sugerir que debería funcionar.

La idea que tengo en mente sería tener la memoria compartida estructurada con un mapa de proceso/página para minimizar la contención de bloqueo.Cada uno de los procesos podría trabajar con sus páginas al mismo tiempo, y solo sería necesario adquirir un bloqueo al actualizar las asignaciones de proceso/página.(El acceso de lectura desde páginas sin propietario implicaría verificar un número de serie, copiar los datos deseados y luego validar que el número de serie de ese bloque no haya cambiado).

Conceptualmente, cada proceso que comparta este mapeo de archivos realizaría el mmap(), encuentre un bloque libre allí, adquiera un bloqueo para el área de proceso/página, actualícelo con su propia asignación, libere el bloqueo y luego continúe alegremente con su trabajo.Cualquier proceso podría buscar asignaciones obsoletas (usando kill() con cero como señal) y limpie el mapeo de la tabla de proceso/página.

(En términos generales y aproximados, estoy jugando con un motor de procesamiento de productor/consumidor que utiliza memoria compartida de Python sobre Linux;Me gustaría que la solución fuera portátil a BSD y a otros lenguajes de programación, siempre y cuando el soporte mmap() y las interfaces necesarias para fcntl(), flock() o lockf(). También me interesaría un psuedocódigo que muestre cómo se mediría la contención de bloqueos y detectaría cualquier error de sincronización.Soy consciente de que el enhebrar y multiprocesamiento con sus respectivos Queue() Los objetos son la forma más sencilla de implementar un modelo de procesamiento de productor/consumidor de Python).

¿Fue útil?

Solución

Estoy seguro de que las cerraduras proporcionarán exclusión mutua, pero no sé si te darán una barrera de memoria.Parece que saltar al kernel (que fcntl, grey y lockf servirán) probablemente sea suficiente. algo eso obliga a las lecturas y escrituras de memoria fuera de servicio a confirmarse, pero dudo que obtenga una garantía estricta.Creo que esta es una de esas cosas en las que probablemente funciona, y las pruebas mostrarán que funciona, pero no sabrás que siempre funciona a menos que encuentres una referencia que lo diga.

Hice algo similar a esto desde C, pero usé spinlocks atómicos en la propia memoria compartida.Solía ​​ser que tenías que hacer un poco de ensamblaje en línea, pero ahora gcc tiene algunas operaciones intrínsecas que puedes usar:

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

Si está dispuesto a escribir una extensión de Python muy simple, puede ajustar __sync_lock_test_and_set(...) y __sync_lock_release(...) para hacer lo que necesita.Deberían ser bastante portátiles.

Creo que también hay una manera de colocar pthread mutex en la memoria compartida, pero no tengo ninguna experiencia con eso.Nuevamente, tendrías que escribir una extensión C simple para obtener acceso desde Python.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top