



(1 opiniones)
En realidad, esto no es así, un ejecutable no carga más lento por ser más grande, ya que los archivos EXE (y librerías DLL) se cargan a través de archivos proyectados en memoria.
Vamos a explicarlo detalladamente con un ejemplo. Supongamos que hemos creado un ejecutable que ocupa en disco 400 KB. Cuando hagamos doble clic sobre él (es decir, cuando lo ejecutemos), ocurrirá lo siguiente:
Se abre el fichero a través de la función del API CreateFile.
Se leen los datos de la cabecera del ejecutable, como referencias a funciones en DLLs externas, posición en el espacio de memoria donde debe comenzar la imagen, creación de variables estáticas (las que son globales, que no están definidas dentro de ninguna función o clase), etc. Todas estas tareas se hacen a través de la funciones de la librería "imagehlp" (dbghelp.dll), tales como ImageDirectoryEntryToData, ImageLoad, ImageNtHeader, MapAndLoad, etc.
Se reserva un bloque de memoria virtual para almacenar todo el ejecutable, pero se compromete en el mismo espacio físico donde reside el archivo EXE. Es decir, el "Page Directory" indicará que el rango de páginas reservado cuenta con almacenamiento físico comprometido en el archivo "Programa.exe". De este modo no se lee todo el ejecutable para volcarlo a memoria, sino que se deja en disco, y cada vez que se lea una nueva instrucción para ejecutarla, se accederá a la página en disco (si no está todavía en RAM).
Cada vez que se vaya a ejecutar una instrucción de nuestro programa, se irá a leer a la dirección de memoria virtual correspondiente. Si la página de esa dirección virtual no se encuentra en ese momento en RAM, se producirá un fallo de página y el sistema entrará en el proceso de lectura de la página y volcado a RAM. Una vez que ya se cuenta con la nueva instrucción en memoria física, se continúa la ejecución.
Como hemos visto, el tamaño del ejecutable no influye (hasta cierto punto) en el tiempo de carga, ya que realmente no se realiza toda la carga del código ejecutable al arrancar, sino que se va haciendo conforme se necesita. Si el contenido de una página nunca llega a ejecutarse, esa página nunca se cargará en RAM, sino que permanecerá en el propio archivo ejecutable.
|
En la figura de la derecha podemos ver un esquema de cómo se proyecta un mismo ejecutable sobre el espacio de direcciones virtuales de dos procesos. |
|
|