2010-12-11 10 views

Respuesta

4

El código de la biblioteca compartida se copia (o más exactamente, se mapea) a la memoria del sistema operativo.

Luego, el SO le da 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 en una dirección de memoria diferente a la otra. Esto es resuelto por la unidad de administración de memoria de la CPU.

Se puede obtener más complicado que esto, pero eso es básicamente cómo funcionan las cosas en Linux y otros sistemas operativos relacionados con Unix como Mac OS X.

29

En los sistemas basados ​​en Unix (incluye Linux), el code segment (.text) puede haber compartido entre múltiples procesos porque es inmutable. ¿Se superpone esto que mencionas?

Básicamente, cada biblioteca compartida que contiene datos estáticos (como variables globales) tiene un Global Offset Table (GOT). En bibliotecas compartidas, todas las referencias a datos estáticos (piense en variables globales) ocurren a través de GOT (son indirectas). Por lo tanto, incluso si el segmento de código se comparte entre múltiples procesos, cada proceso tiene su asignación exclusiva 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 los datos. Sin embargo, creo que las constantes pueden ser una excepción dependiendo de los indicadores de compilación.

También recomiendo el siguiente artículo: Dynamic Linking and Loading.

+4

Para enfatizar este punto, un sistema unixy puede compartir o no compartir la biblioteca dinámica, pero desde el punto de vista de la aplicación, * no hay diferencia observable * entre cualquiera de las implementaciones. Casi todos los sistemas similares a Unix comparten el código entre los procesos porque es fácil de hacer y una excelente manera de conservar RAM sin ningún costo. Las raras excepciones son los sistemas operativos paranoicos en hardware con MMU débil (o nula), de modo que un 'texto 'compartido podría permitir que un proceso corrompara a otro. – SingleNegationElimination

Cuestiones relacionadas