Respuestas:
La razón es que Unix no bloquea un archivo ejecutable mientras se ejecuta o incluso si le gusta Linux, este bloqueo se aplica al inodo, no al nombre del archivo. Eso significa que un proceso que lo mantiene abierto está accediendo a los mismos datos (antiguos) incluso después de que el archivo se haya eliminado (desvinculado en realidad) y reemplazado por uno nuevo con el mismo nombre, que es esencialmente lo que hace una actualización del paquete.
Esa es una de las principales diferencias entre Unix y Windows. Este último no puede actualizar un archivo bloqueado ya que le falta una capa entre los nombres de archivo y los inodos, lo que dificulta la actualización o incluso la instalación de algunos paquetes, ya que generalmente requiere un reinicio completo.
Los ejecutables generalmente se abren una vez, se adjuntan a un descriptor de archivo y no tienen un descriptor de archivo a su binario reabierto durante un solo período de ejecución. Por ejemplo, si ejecuta bash
, exec()
generalmente solo crea un descriptor de archivo para el inodo al que apunta /bin/bash
una vez, en la invocación.
Esto a menudo significa que para los archivos binarios simples que no intentan releerse durante la ejecución (mediante el uso de la ruta por la que se invocaron), el contenido almacenado en caché permanece válido como un inodo colgante. Esto significa que esencialmente hay una réplica de la versión anterior del ejecutable.
En casos más complejos, esto puede causar problemas. Por ejemplo, un archivo de configuración puede actualizarse y luego volverse a leer, o el programa puede volver a ejecutarse a sí mismo a través de la ruta desde la que se ejecutó. También puede haber problemas si los programas están interconectados, y uno se ejecuta antes de la actualización y otro después (posiblemente por el primer programa). Esto también es cierto para algunas bibliotecas.
Sin embargo, para casos de uso simples, es seguro actualizar sin reiniciar el proceso.
bash
binario tiene alrededor de 200 páginas 4K, no estoy seguro de que todas se usen en una sesión promedio.
ialloc()
de una estructura del núcleo en lectura, no del mapeo de memoria de las páginas en sí. ¿No estoy en lo cierto al pensar que en los modernos sistemas de archivos ext *, el inodo eventualmente es consistente en el núcleo (y dentro del subsistema VM)?