2010-05-17 11 views
16

Tengo una pequeña pregunta simple que alguien que sabe podrá responder fácilmente, busqué en Google pero no pude encontrar la respuesta.¿Los archivos .dll se cargan una vez para cada programa o una vez para todos los programas?

Hay muchos programas ejecutándose a la vez en una computadora, y mi pregunta es: cuando un programa carga una DLL, ¿carga realmente el archivo DLL o encuentra la memoria en la que la DLL ya está cargada? Por ejemplo, ¿se carga ws2_32.dll (winsock 2) para cada programa que usa winsock, o se carga una vez y todos los programas que lo usan usan las mismas direcciones de memoria para llamar a las funciones?

Respuesta

18

Se carga una vez y todos los programas comparten la misma copia en memoria del código. Es algo complicado, pero para las secciones de solo lectura de la DLL (es decir, el código), el cargador del sistema operativo usa una técnica llamada "asignación de memoria" para asignar la DLL al espacio de direcciones del proceso. Las páginas solo se cargan en la memoria física una vez para todos los procesos, aunque pueden tener la página asignada a direcciones diferentes en su espacio de direcciones virtuales.

Sin embargo, cada proceso tiene una sección de datos separada (para que las variables globales no se compartan, a menos que explícitamente se solicite) y obviamente también tienen un montón separado para que la memoria asignada dinámicamente no se comparta.

+0

Ok, gracias, esto tiene sentido. Solo necesitaba saber si un puntero a una función de una DLL apuntaría a la misma dirección que usan todos los programas que usaron la función. – Nilbert

+2

La respuesta a esa pregunta es "no". Los punteros de función son direcciones en los procesos * espacio de direcciones virtuales *, y eso definitivamente no se comparte entre procesos. Se puede cargar una DLL en diferentes direcciones en diferentes procesos y, por lo tanto, la dirección de un puntero a función será diferente, aunque se use la misma página física. –

+0

De hecho, sería muy poco probable que la función tenga la misma dirección en dos programas diferentes. El código de la DLL se asignará al siguiente espacio de direcciones disponible después de todas las contribuciones del segmento de código que lo preceden. En Linux seguro, se usa la asignación aleatoria de dirección de carga (para evitar que viri use direcciones codificadas en ataques). No estás escribiendo un virus, ¿verdad? :-) – wallyk

5

Depende de lo que quiere decir con "cargado".

La DLL está preparada para el uso compartido de código y datos: la mayoría de los entornos de Windows respetan la compartibilidad (mapeando la misma copia de memoria del código en el espacio de memoria de cada proceso) para conservar memoria.

Sin embargo, parte de la operación "cargar" (desde el punto de vista de un proceso) ejecuta la inicialización de la DLL: se realiza por separado en cada proceso con copias distintas de las áreas de datos que son privadas para cada proceso.

Cuestiones relacionadas