Je me souviens vaguement d'avoir lu quelque part qu'il existait, dans certains Unices, un moyen d'ouvrir un fichier existant pour l'écriture, avec un indicateur qui demandait au noyau d'utiliser l'ancienne version (pour d'autres processus y accédant en lecture), jusqu'à ce que le "nouveau "la version a été entièrement écrite (fd fermé), à partir de ce moment le fichier est apparu comme la nouvelle version.
En d'autres termes, d'autres processus ont vu l'ancienne version ou la nouvelle, jamais une version incomplète.
Quelqu'un bien informé peut-il m'indiquer une référence?
kernel
open-files
eudoxos
la source
la source
Réponses:
Ce que vous décrivez ressemble exactement à un changement de nom de base pour remplacer un fichier.
Lorsque vous renommez / déplacez un fichier au-dessus d'un autre, l'ancien fichier n'est pas lié. Cela signifie que le fichier existe toujours, mais il n'est plus dans l'arborescence du système de fichiers. Ainsi, les anciennes applications continueront à pouvoir accéder au fichier tant qu'elles le garderont ouvert. Une fois que toutes les applications ont fermé l'ancien fichier, il n'est en fait pas alloué sur le disque.
L'
rename
appel système est une opération atomique. Pour ce faire, vous devez créer un nouveau fichier sous un nom différent, puis appelerrename
pour renommer le fichier temporaire comme celui que vous souhaitez remplacer. Puisque l'opération est atomique, il n'y a absolument aucune période où le fichier est manquant. Il passe instantanément de l'ancien fichier au nouveau fichier.Notez cependant que le fichier temporaire et le fichier remplacé doivent résider sur le même point de montage.
la source
rename
chose d'échange. Même si une telle «fonctionnalité du système d'exploitation» dont vous parlez existait, le programme devrait toujours être écrit pour en profiter également. Quelle est la différence?open
appel système ou si vous devez faire ce que vous décrivez à la main.Comme Patrick l'écrit , la façon habituelle de le faire est d'écrire la nouvelle version dans un fichier séparé et, une fois terminé, de renommer la nouvelle version en l'ancien nom de fichier, en l'écrasant atomiquement. Cette deuxième opération est appelée écrasement par renommage .
Maintenant, quelques références:
ISO C doit
rename
être atomique. D'après les spécifications de la base Open Group :Les anciennes versions de Mac OS X n'avaient pas de renom atomique; cela aurait été corrigé dans Lion.
Btrfs viole apparemment intentionnellement la norme en ne garantissant pas les renommages atomiques , pour des raisons de performances. Cependant, l' écrasement par renommage est toujours atomique , ce qui est tout ce dont vous avez besoin à cet effet.
la source
man 3p rename
me dit querename
c'est effectivement atomique, et je suppose que cela est destiné à tous les systèmes de fichiers Linux. Et quand je lis le premier article que vous avez lié, je pense toujours que les opérations de renommage de Btrfs sont atomiques.Cela me rappelle Allocate On Flush . Lorsqu'un système de fichiers utilise cette fonctionnalité, au lieu d'écrire des données directement sur le disque, il soustrait la taille des données à écrire du compteur d'espace libre du disque et conserve les données en mémoire jusqu'à ce qu'un appel système de synchronisation soit effectué ou que le noyau décide pour vider les tampons sales.
Dans ce cas, si le fichier est modifié par un processus et est ouvert par un autre processus, ce dernier processus "verra" la version non modifiée ( ou "ancienne" si vous préférez ) du fichier.
Bien sûr, ce qui précède est théorique et dépend de divers facteurs, et je dirais un peu imprévisible - puisque vous ne savez pas exactement quand le noyau va vider les pages sales. Par exemple sous Linux ( comme vous pouvez également le lire dans la section 15.3 de Comprendre le noyau Linux ), les pages sales sont écrites sur le disque dans les conditions suivantes:
Le cache de pages est trop plein et plus de pages sont nécessaires, ou le nombre de pages sales devient trop important.
Trop de temps s'est écoulé depuis qu'une page est restée sale.
Un processus demande que toutes les modifications en attente d'un périphérique de bloc ou d'un fichier particulier soient vidées; il le fait en appelant un appel système sync (), fsync () ou fdatasync ().
Cette fonctionnalité est connue pour être implémentée dans les systèmes de fichiers HFS +, XFS, Reiser4, ZFS, Btrfs et ext4.
la source