Considere la siguiente aplicación: un servidor de búsqueda web que al inicio crea un gran índice en la memoria de páginas web basado en datos leídos del disco. Una vez inicializado, el índice en memoria no se puede modificar y se inician varios subprocesos para atender las consultas de los usuarios. Supongamos que el servidor está compilado con código nativo y utiliza subprocesos del sistema operativo.¿Es factible implementar primitivas de simultaneidad de concurrencia de Linux que proporcionen un mejor aislamiento que los hilos pero un rendimiento comparable?
Ahora, el modelo de subprocesamiento no ofrece aislamiento entre subprocesos. Un subproceso con errores o cualquier código que no sea seguro para subprocesos, puede dañar el índice o dañar la memoria asignada por y, lógicamente, pertenece a otro subproceso. Tales problemas son difíciles de detectar y depurar.
Teóricamente, Linux permite forzar un mejor aislamiento. Una vez que se inicializa el índice, la memoria que ocupa se puede marcar como de solo lectura. Los subprocesos se pueden reemplazar con procesos que comparten el índice (memoria compartida) pero, aparte de eso, tienen montones separados y no pueden dañarse entre sí. La operación ilegal es detectada automáticamente por el hardware y el sistema operativo. No se necesitan mutex u otras primitivas de sincronización. Las carreras de datos relacionadas con la memoria se eliminan por completo.
¿Es factible tal modelo en la práctica? ¿Conoce alguna aplicación de la vida real que haga tales cosas? ¿O tal vez hay algunas dificultades fundamentales que hacen que ese modelo no sea práctico? ¿Cree que este enfoque introduciría una sobrecarga de rendimiento en comparación con los hilos tradicionales? Teóricamente, la memoria que se utiliza es la misma, pero ¿hay algunos problemas relacionados con la implementación que harían las cosas más lentas?
Ciertamente hay aplicaciones que usan mmap para marcar varios espacios de memoria como de solo lectura. Sin embargo, esto normalmente se debe a motivos de rendimiento y no a la protección contra el código defectuoso. – Gray
Aunque ciertamente no quiero comenzar una guerra religiosa, cambiar al uso de un lenguaje (como Java) que admite tipos verdaderamente inmutables resolvería muchos de los problemas con "hilos defectuosos" que "corrompen la memoria". – Gray
La corrupción de memoria en programas de subprocesos múltiples ocurre no solo cuando el hilo escribe en una ubicación aleatoria en la memoria (estos errores son relativamente fáciles de evitar y detectar) sino también cuando el hilo obtiene una referencia válida a un objeto que no es seguro para subprocesos utilizado por otro hilo. Dichos errores son mucho más difíciles de prevenir y detectar, y pueden ocurrir en cualquier programa de subprocesos múltiples, sin importar el idioma. –