shmat - ¿Cómo se llama un archivo de biblioteca compartida por dos procesos diferentes en Linux?
shared memory in os (2)
En Linux, tengo un archivo de biblioteca compartida llamado foo.so. Cuando ejecuto 2 procesos diferentes p1, p2, ambos usan foo.so. ¿Este foo.so se superpone con esos 2 procesos?
El código de la biblioteca compartida se copia (o, de manera más precisa, se asigna) en la memoria por el sistema operativo.
Luego, el sistema operativo otorga a cada uno de los procesos acceso a esa copia en la memoria.
Es posible que cada uno de los procesos "vea" la copia como si estuviera en una dirección de memoria diferente a la otra. Esto es resuelto por la unidad de gestión de memoria de la CPU.
Puede ser más complicado que esto, pero así es básicamente cómo funcionan las cosas en Linux y otros sistemas operativos relacionados con Unix como Mac OS X.
En los sistemas basados en Unix (incluye Linux), el segmento de código (.text) puede compartirse entre múltiples procesos porque es inmutable. ¿Es esta superposición que mencionas?
Básicamente, cada biblioteca compartida que contiene datos estáticos (como las variables globales) tiene una Tabla de compensación global (GOT) . En las bibliotecas compartidas, todas las referencias a datos estáticos (piense en vars globales) se producen a través de GOT (son indirectas). Entonces, incluso si el segmento de código se comparte entre múltiples procesos, cada proceso tiene su mapeo exclusivo de otros segmentos de la biblioteca compartida, incluido el GOT respectivo, cuyas entradas se reubican en consecuencia.
En resumen, solo el código se comparte entre procesos, no datos . Sin embargo, creo que las constantes pueden ser una excepción dependiendo de las banderas de compilación.
También recomiendo el capítulo 10, Enlace dinámico y carga , del siguiente libro: Enlazadores y cargadores .