c++ - sirve - windows dll
¿Se cargan los archivos.dll una vez para cada programa o una vez para todos los programas? (2)
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 posibilidad de compartirlos (asignando la misma copia de memoria del código en el espacio de memoria de cada proceso) para conservar la memoria.
Sin embargo, parte de la operación de "carga" (desde el punto de vista del proceso) está ejecutando la inicialización de la DLL: esto se realiza por separado en cada proceso con copias distintas de las áreas de datos que son privadas para cada proceso.
Tengo una pequeña pregunta que alguien que sabe podrá responder fácilmente, busqué en google pero no pude encontrar la respuesta.
Hay muchos programas que se ejecutan a la vez en una computadora, y mi pregunta es: cuando un programa carga una DLL, ¿realmente carga el archivo DLL o encuentra la memoria en la que ya está cargada la DLL? 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?
Se carga una vez y todos los programas comparten la misma copia de código en la memoria. Es un poco 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 "mapeo 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 una dirección diferente en su espacio de direcciones virtuales.
Sin embargo, cada proceso tiene una sección de datos separada (de modo que las variables globales no se comparten, a menos que se les pida explícitamente) y, obviamente, también tienen un montón separado para que la memoria asignada dinámicamente no se comparta.