2010-09-26 12 views
5

Aparte del concepto Dll que proporciona la capacidad de cargar o descargar métodos o funciones en tiempo de ejecución, me pregunto si un compilador alguna vez puede decir algo así como, esta parte del código ocupa una cantidad considerable de espacio en el segmento de código y nunca volverá a usarse después de este punto durante la ejecución del programa, sería bueno generar algún código para descargar esa parte del segmento de código después de alcanzar ese punto particular durante la ejecución del programa, de modo que el espacio total tomado por segmento de código se haga más pequeño. ¿Es algo simplemente ficticio o puede que eso suceda?¿Puede un compilador generar código para descargar partes del segmento de código durante la ejecución?

+2

+1 pregunta interesante – delnan

Respuesta

3

Un compilador puede hacer lo que quiera, siempre que eso no viole el estándar. Si puede descubrir que el código nunca vuelve a llamarse, puede deshacerse por completo.

Incluso podría reemplazarlo con una función de trozo más pequeña que volvería a cargar el código, si fuera necesario.

Pero es muy poco probable que lo veas en un sistema operativo moderno, ya que el sistema operativo proporciona esa capacidad bajo las cubiertas.

Los sistemas operativos (al menos los comunes) intercambiarán sus páginas físicas cuando la memoria se agota, y no se volverán a cargar hasta que se necesiten (generalmente por un error de página al intentar acceder a ellas).

1

No conozco un compilador que haga esto, pero no hay ninguna regla que lo prohíba. Si el compilador puede probar que hacerlo no cambiará la semántica del programa, entonces está permitido bajo la regla de si.

Sin embargo, generalmente no es necesario, porque el código no utilizado ya puede ser intercambiado como parte del mecanismo de archivo de paginación asociado a la memoria virtual. (y porque probablemente solo guarde unos pocos KB de espacio en la memoria)

4

Sure. Hay una técnica llamada overlaying que carga diferentes códigos en el mismo espacio de direcciones en diferentes momentos. A veces se hacía manualmente, otras veces los compiladores ayudaban. A veces la carga se realiza en software, a veces en hardware (con multiplexación de direcciones, de modo que, por ejemplo, durante el arranque, un bit de espacio de direcciones se lee desde un chip ROM, pero después del arranque cambia a RAM de direcciones o una ROM diferente).

La superposición fue mucho más común cuando las computadoras tenían menos memoria, p. en los primeros días de DOS donde tenías 640K en el mejor de los casos y muchas veces ni siquiera eso. En la actualidad, todavía tiene aplicaciones para sistemas integrados en los que la memoria y/o el espacio de direcciones son una prioridad.

3

Sí, los controladores de dispositivos de Windows utilizan esta técnica. El formato LE file tiene ciertos segmentos de código marcados como descartables. El sistema operativo también puede tomar esa decisión en ciertas ocasiones para intercambiar segmentos de código que no se han utilizado durante mucho tiempo.

Hablando a la ligera, sin embargo, este no es el área para jugar con el compilador. Es principalmente el linker/loader/OS que afecta esto.

+0

Segmentos de código descartable también existe en el formato PE más común utilizado por EXE y DLL. El compilador ciertamente tiene un papel aquí; coloca funciones en segmentos específicos. Pero tiene poco sentido, como notó: un SO puede descartar todas las páginas de solo lectura que son recargables, y descartará las páginas que no se han tocado últimamente. – MSalters

Cuestiones relacionadas