En computadoras típicas como Mac, Windows, Linux, iOS, etc., cuando un usuario inicia un programa/binario/aplicación, ¿la parte estática del programa siempre se carga por completo en la memoria antes de que comience la ejecución? ¿Esto incluye todos los segmentos/secciones de datos en el programa como cadenas y cualquier otro dato BLOB incrustado? Digamos que incrusté un archivo de imagen enorme en el binario (por ejemplo, en el segmento __DATA). ¿Se cargarían estos datos de imagen por completo en la memoria al momento del lanzamiento?
En OS X, los ejecutables de Windows, Linux e iOS no se cargan en la RAM cuando se ejecutan. En su lugar, el ejecutable se asigna al espacio de direcciones virtuales del proceso. Cuando el proceso accede a una página asignada del ejecutable que aún no se ha cargado en la RAM, la CPU genera una falla de página que el sistema operativo maneja al leer la página en la RAM.
Entonces, si coloca un archivo de imagen enorme en la sección de datos de su ejecutable, no se cargará en la RAM hasta que su programa acceda a él por primera vez. Un archivo de imagen enorme probablemente ocupa varias páginas de memoria (que generalmente tienen un tamaño de 4K), por lo que si su programa solo accede a una parte de la imagen, solo una parte de la imagen se cargará en la RAM.
Tenga en cuenta que en Windows, y tal vez en otros sistemas operativos, hay una excepción significativa a esto. En Windows, un servicio del sistema operativo llamado prefetcher comenzará a precargar en la memoria las partes de cualquier archivo al que predice que accederá el programa durante el inicio. Hace estas predicciones basándose en los patrones de acceso de inicio registrados de ejecuciones anteriores del programa. Dado que "cualquier archivo" incluye el propio ejecutable, junto con cualquier DLL o archivo de datos que utilice, esto significa que partes del ejecutable se cargarán previamente en la RAM cuando se inicie el proceso. Esto también significa que si el programa generalmente muestra una imagen grande al inicio del programa (por ejemplo, una pantalla de inicio), entonces el precargador cargará la imagen en la RAM, ya sea que esté almacenada como parte del ejecutable o como un archivo de datos separado.