Réponses:
La raison est qu'Unix ne verrouille pas un fichier exécutable pendant qu'il est exécuté ou même s'il aime Linux, ce verrou s'applique à l'inode, pas au nom de fichier. Cela signifie qu'un processus qui le garde ouvert accède aux mêmes (anciennes) données même après que le fichier a été supprimé (non lié en fait) et remplacé par un nouveau avec le même nom, ce qui est essentiellement ce que fait une mise à jour de package.
C'est l'une des principales différences entre Unix et Windows. Ce dernier ne peut pas mettre à jour un fichier verrouillé car il manque une couche entre les noms de fichier et les inodes, ce qui complique grandement la mise à jour ou même l'installation de certains packages car il nécessite généralement un redémarrage complet.
Les exécutables sont généralement ouverts une fois, attachés à un descripteur de fichier et n'ont pas de descripteur de fichier à leur binaire rouvert pendant une seule période d'exécution. Par exemple, si vous exécutez bash
, exec()
ne crée généralement qu'un descripteur de fichier pour l'inode indiqué par /bin/bash
une invocation unique.
Cela signifie souvent que pour les binaires simples qui n'essaient pas de se relire pendant l'exécution (en utilisant le chemin par lequel ils ont été invoqués), le contenu mis en cache reste valide en tant qu'inode pendant. Cela signifie qu'il existe essentiellement une réplique de la version précédente de l'exécutable.
Dans des cas plus complexes, cela peut entraîner des problèmes. Par exemple, un fichier de configuration peut être mis à niveau et relu par la suite, ou le programme peut se ré-exécuter via le chemin à partir duquel il a été exécuté. Il peut également y avoir des problèmes si les programmes sont interconnectés, et l'un est exécuté avant la mise à niveau, et l'autre après (éventuellement par le premier programme). Cela est également vrai pour certaines bibliothèques.
Pour les cas d'utilisation simples, cependant, la mise à niveau est sûre sans redémarrer le processus.
bash
binaire représente environ 200 pages 4K, pas sûr qu'elles soient toutes utilisées dans une session moyenne.
ialloc()
ing à une structure du noyau en lecture, pas du mappage mémoire des pages elles-mêmes. N'ai-je pas raison de penser que sur les systèmes de fichiers ext * modernes, l'inode est finalement cohérent dans le noyau (et à l'intérieur du sous-système VM)?