GNU/Linux >> Tutoriales Linux >  >> Linux

Mecanismos de bloqueo para la consistencia de la memoria compartida

Entonces, investigando un poco, descubrí que los semáforos de System V tienen un indicador llamado SEM_UNDO que puede revertir el estado de bloqueo cuando el programa falla, pero no se garantiza que funcione.

SEM_UNDO desbloquearía el semáforo si el proceso falla. Si los procesos fallan debido a la corrupción de la memoria compartida, los semáforos no pueden hacer nada por usted. El sistema operativo no puede deshacer el estado de la memoria compartida.

Si necesita poder revertir el estado de la memoria compartida, entonces debe implementar algo por su cuenta. He visto al menos dos modelos que se ocupan de eso.

El primer modelo antes de modificar algo en la memoria compartida fue tomar una instantánea de la estructura, guardando en una lista en la memoria compartida. Si algún otro proceso pudo obtener el bloqueo y la lista no estaba vacía, estaba deshaciendo todo lo que el proceso bloqueado podría haber cambiado.

El segundo modelo es hacer copias de las estructuras shm en la memoria local y mantener el bloqueo bloqueado durante toda la transacción. Cuando se confirma la transacción, antes de liberar el bloqueo, simplemente copie las estructuras de la memoria local a la memoria compartida. La probabilidad de que la aplicación se bloquee durante la copia es menor y la intervención de señales externas se puede bloquear usando sigprocmask() . (Es mejor que el bloqueo en el caso esté bien particionado sobre los datos. Por ejemplo, he visto pruebas con un conjunto de 1000 bloqueos para 10 millones de registros en shm accedidos por 4 procesos simultáneos).


Solo hay unas pocas cosas que se garantiza que se limpiarán cuando falla un programa. Lo único que me viene a la mente aquí son los recuentos de enlaces. Un descriptor de archivo abierto aumenta el recuento de enlaces del inodo subyacente y un cierre correspondiente lo disminuye, incluido un cierre forzado cuando el programa falla.

Entonces, todos sus procesos podrían abrir un archivo común (no recuerdo si funciona para segmentos de memoria compartida) y podría activar algún tipo de alarma si el conteo disminuye, donde no debería. Por ejemplo, en lugar de hacer una espera simple, sus procesos podrían hacer una espera temporizada (por un segundo, por ejemplo) en un bucle y sondear el recuento de enlaces para recibir alertas cuando algo va mal.


Linux
  1. Cómo crear un directorio compartido para todos los usuarios en Linux

  2. ¿Consulta la lista de servidores para la memoria/cpu asignada?

  3. ¿"cuál" equivalente para bibliotecas compartidas?

  4. Gestión de memoria de Linux:intercambio, cachés y VM compartida

  5. Ejemplos de comandos ipcs en Linux

Cómo verificar la memoria compartida de Linux usando el comando ipcs

Detecte bibliotecas compartidas obsoletas en la memoria con UChecker

Cómo usar la memoria compartida con Linux en C

¿Eliminar la memoria compartida posix cuando no esté en uso?

Memoria compartida de Linux:shmget() vs mmap()?

rkhunter:segmentos sospechosos de memoria compartida