Se ha investigado bastante sobre algoritmos de exclusión mutua; por ejemplo, gran parte se presenta en libros de texto clásicos como The Art of Multiprocessor Programming , donde se dedica un capítulo completo a ellos.
Me pregunto cuáles son las situaciones prácticas en las que uno podría necesitar estos algoritmos durante la ingeniería de un sistema concurrente, en lugar de usar primitivas de sincronización típicas proporcionadas por el lenguaje y el sistema operativo (por ejemplo, proporcionadas por la biblioteca pthread).
Puedo pensar en muchos casos especiales en los que me imagino que las primitivas estándar no están específicamente ajustadas para ellos, por ejemplo, "un lector frecuente y un escritor poco frecuente", o viceversa, o "exactamente una operación de escritura, muchos lectores", etc. - ¿Alguno de los algoritmos de exclusión mutua del libro de texto es significativamente mejor en la práctica en tales situaciones?
En pocas palabras: ¿qué algoritmos de exclusión mutua son de relevancia práctica para un ingeniero que ya tiene a su disposición una biblioteca típica de primitivas de concurrencia proporcionadas por el lenguaje?
Respuestas:
Respuesta: ninguna. De eso no se tratan esas secciones de The Art of Multiprocessor Programming de Herlihy y Shavit. En los capítulos sobre exclusión mutua, Herlihy y Shavit no le ofrecen alternativas a la
pthread
biblioteca, le muestran cómo se implementa el equivalente de lapthread
biblioteca.El capítulo 2 de Herlihy y Shavit se titula "Exclusión mutua". Ofrece una variedad de algoritmos clásicos para implementar el equivalente
pthread_mutex_lock()
con solo memoria compartida secuencialmente consistente. Mis respuestas https://cs.stackexchange.com/a/12632/7459 y https://cs.stackexchange.com/a/30249/7459 discuten la importancia de estas implementaciones y tienen un puntero a uno que es práctico para usar en máquinas que no tienen operaciones de sincronización de hardware incorporadas. (Documento de Lamport de 1987 en ACM Trans. Sobre sistemas informáticos).El Capítulo 7 de Herlihy y Shavit ofrece una variedad de implementaciones de bloqueo de giro y cola del equivalente de
pthread_mutex_lock()
, y el Capítulo 8 se expande para discutirpthread_cond_t
(variables de condición),pthread_rwlock_t
(bloqueos de lector / escritor), y toca brevementesemaphores
. Puede haber situaciones en las quepthread_rwlock_t
podría usarse como una alternativapthread_lock_t
por razones de rendimiento (pero generalmente no) y en Posix debe usarsemaphores
para la sincronización entre procesos.Los capítulos 9 a 16 tratan principalmente sobre aplicaciones (varios tipos de contenedores concurrentes). El capítulo 17 discute brevemente el equivalente de
pthread_barrier_t
.Dicho todo esto, Herlihy y Shavit son dos de los defensores más vocales de la memoria transaccional y una variedad de tipos de sincronización sin bloqueo (y sin esperas). Estas técnicas están pensadas como alternativas a la exclusión mutua en ciertos casos. Herlihy y Shavit rocian varias implementaciones sin bloqueo en los capítulos 9 a 16, y luego entran en detalles sobre la memoria transaccional en el Capítulo 18.
La memoria transaccional y otras técnicas de sincronización sin bloqueo están destinadas a resolver el problema de que algunos algoritmos mal diseñados requieren subprocesos para mantener sus secciones críticas durante mucho tiempo. La memoria transaccional y la sincronización verdaderamente sin bloqueo no son actualmente alternativas prácticas en una situación real, pero las técnicas para transformar estructuras de datos de bloqueo en estructuras de datos sin bloqueo son útiles en la práctica para minimizar la cantidad de tiempo que una estructura de datos de bloqueo permanece en su estado crítico. sección. (A menudo puede reducir el tamaño de la sección crítica a solo un par de instrucciones de la máquina).
fuente