Pregunta

Tengo una pregunta sobre las bibliotecas compartidas vs bibliotecas estáticas tiempo de carga.

Supongamos que i tiene un foo.exe ejecutable que utiliza Liba, libB, libc. También en un momento dado hay más de 10 casos de la marcha ejecutable en la máquina.

Ahora bien, si las bibliotecas se compartieron las 3 bibliotecas anteriores: Primero insance se carga en la memoria RAM: El tiempo necesario será tiempo empleado por main () de foo.exe para ser cargado de memoria (asumiendo su despreciable) + tiempo para cargar Liba + tiempo para cargar libB + tiempo para cargar libc Segunda instancia se inicia: Supongamos ahora una segunda instancia de este ejecutable se ejecuta. Dado que todas las bibliotecas ya están cargados en la memoria principal, el tiempo tomado es sólo para cargar el main () a la memoria que es insignificante.

Ahora bien, si las 3 bibliotecas anteriores eran bibliotecas estáticas: Primero insance se carga en la memoria RAM: El tiempo necesario será tiempo empleado por main () de foo.exe para ser cargado memoria (asumiendo su despreciable) + tiempo para cargar Liba + tiempo para cargar libB + tiempo para cargar libc (Offcourse su ahora toda la parte del ejecutable como un todo) Segunda instancia se inicia: Supongamos ahora una segunda instancia de este ejecutable se ejecuta. Tiempo empleado será de nuevo tiempo tomado por la memoria principal () de foo.exe para ser cargado (suponiendo su despreciable) + tiempo para cargar Liba + tiempo para cargar libB + tiempo para cargar libc. (Puesto que cada ejecutable librareies compartir no puede como estos son librareies estáticas)

Así que mi conclusión es que con la biblioteca estática el tiempo de carga será más. Pero me dijeron que las bibliotecas compartidas toman más tiempo durante la carga de bibliotecas estáticas, por lo que habrá un retraso y por lo bibliotecas compartidas no es una buena opción. ¿Cómo es esto posible?

¿Fue útil?

Solución

La vinculación (resolver referencias) no es libre. Con la vinculación estática, la resolución se realiza una vez por todas cuando se genera el binario. Con la vinculación dinámica, que se tiene que hacer cada vez que se carga el binario. Por no mencionar que el código compilado para ejecutarse en una biblioteca compartida puede ser menos eficiente que el código compilado para vincularse estáticamente. El costo exacto depende de la arquitectura y sobre la aplicación del sistema de enlace dinámico.

El costo de hacer una dinámica biblioteca puede ser relativamente alta para el conjunto de instrucciones x86 de 32 bits: en el ELF formato binario , uno de los registros que ya son escasos tiene que ser sacrificado para hacer reubicable código de enlace dinámico. El a.out formato antiguo colocado cada biblioteca compartida en un lugar fijo, pero que didn' t escala. Creo que Mac OS X ha tenido un sistema intermedio cuando las bibliotecas dinámicas, en las colocan en lugares predeterminados en el espacio de direcciones, pero los conflictos se resolvieron en la escala del equipo individual (la prolongada fase "Optimizar el rendimiento del sistema" después de instalar nuevo software). En cierto modo, este sistema (llamado pre-vinculante ) le permite tener su pastel y comerlo también. No sé si prebinding sigue siendo necesario ahora que Apple más o menos pasó a la arquitectura AMD64.

Además, en un sistema operativo moderno tanto el código relacionado estática y dinámicamente sólo se carga (paginado en) desde el disco si se utiliza, pero esto es bastante ortogonal a su pregunta.

Otros consejos

Las librerías estáticas están vinculados a la hora de compilar, bibliotecas compartidas están vinculadas en tiempo de ejecución. Por lo tanto, ejecutables utilizando librerías estáticas amortizar todo su tiempo de enlace antes incluso de que se escribe en el disco.

Muchas gracias por esta respuesta increíblemente rápido. tenemos 2 scenarious architecural:

Q1. Architecure-1: Supongamos tamaño exe 3GB (bibliotecas estáticas). 95% es bibliotecas y 5% main (). Con un tamaño tan enorme sería la carga de este exe tomar más tiempo (suponiendo bibliotecas estáticas) o que la vinculación de este exe tomar más tiempo (suponiendo el uso de bibliotecas compartidas, y si todas las bibliotecas son ya solamente la memoria de enlace tiene que ser hecho.)

Architecure-2: Supongamos que i tiene un 1,5 GB tamaño exe (95% lib + 5% main ()), y 6 casos de este se están ejecutando al mismo tiempo. Una vez que estos 6 casos son hasta que tendrán una duración de días, suponer que estamos listos para tomar el retardo adicional durante la carga inicial + vinculación de estos 6 casos.

Q2. Ahora bien, si estoy usando objetos compartidos en lugar de objetos estáticos, voy a tener mucho espacio libre en la memoria RAM ya que todas las bibliotecas son compartidos entre los 6 casos? no acelerará mi ejecución en tiempo real a causa de más espacio en la memoria RAM que disminuyen el intercambio página?

Q3. Si utilizo archivos de 'mapa' para disminuir el número de símbolos exportados (que sólo es posible utilizando bibliotecas compartidas) se no es mi símbolo disminuir el tamaño de mesa y a no mejorar el rendimiento en tiempo de ejecución?

Gracias Sud

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top