En Linux, Tengo un archivo de biblioteca compartida llamado foo.so Cuando ejecuto 2 procesos diferentes p1, p2 que usan foo.so. ¿Este foo.so se superpone por esos 2 procesos?¿cómo se llama un archivo de biblioteca compartida por dos procesos diferentes en Linux?
Respuesta
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.
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.
- 1. Cómo inicializar una biblioteca compartida en Linux
- 2. Biblioteca compartida dinámica de C++ en Linux
- 3. cómo vincular la biblioteca compartida con otra biblioteca compartida en Linux?
- 4. Linux: ¿Cómo incrustar información de versión en una biblioteca compartida y en un archivo binario?
- 5. librería compartida de Linux que utiliza un símbolo indefinido biblioteca compartida
- 6. cómo usar la memoria compartida para comunicar entre dos procesos
- 7. ¿Cómo enumerar los procesos conectados a un segmento de memoria compartida en Linux?
- 8. Exportación explícita de funciones de biblioteca compartida en Linux
- 9. rendimiento entre diferentes procesos
- 10. Causa de un evento de encuesta de Linux en un archivo de memoria compartida
- 11. Memoria compartida entre 2 procesos (aplicaciones)
- 12. depurando una biblioteca compartida envuelta por SWIG en perl
- 13. ¿Cómo inicializar los recursos de Qt de una biblioteca compartida?
- 14. ¿Cómo sincronizo dos procesos?
- 15. Linux dlopen: ¿se puede "notificar" una biblioteca cuando se carga?
- 16. En Linux, ¿por qué el destructor se ejecuta dos veces en una instancia compartida de variable global en C++?
- 17. ¿Por qué onKey() se llama dos veces?
- 18. Linking boost a la biblioteca compartida con CMake en Linux
- 19. ¿Cómo compartir variables globales en una biblioteca compartida (.so) en instancias del mismo proceso que utilizan la biblioteca compartida en Linux?
- 20. Mantener dos ramas de Git diferentes por un archivo
- 21. Cargar biblioteca compartida por ruta en tiempo de ejecución
- 22. Biblioteca de Python para la gestión de procesos de Linux
- 23. Dos procesos de lectura/escritura en el mismo archivo Python
- 24. Linux: ¿cómo se usan los archivos .pc cuando se vinculan con una biblioteca compartida?
- 25. Cómo exportar símbolos de una biblioteca compartida
- 26. ¿Por qué los nombres de funciones de biblioteca estándar son diferentes entre Windows y Linux?
- 27. ¿Por qué el modificador "g" da resultados diferentes cuando test() se llama dos veces?
- 28. Biblioteca compartida en Go?
- 29. Memoria compartida entre procesos de python
- 30. Vinculación de una biblioteca compartida mediante gcc
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