Comment les systèmes de fichiers gèrent-ils les lectures / écritures simultanées?

L’utilisateur A demande au système de lire le fichier foo et, simultanément, l’utilisateur B souhaite enregistrer ses données dans le même fichier. Comment cette situation est-elle gérée au niveau du système de fichiers?

La plupart des systèmes de fichiers (mais pas tous) utilisent le locking pour protéger les access simultanés au même fichier. Le verrou peut être exclusif, de sorte que le premier utilisateur à obtenir le verrou y ait access – les utilisateurs suivants reçoivent une erreur “Accès refusé”. Dans votre exemple de scénario, l’utilisateur A pourra lire le fichier et obtiendra le verrou du fichier, mais l’utilisateur B ne pourra pas écrire pendant que l’utilisateur A lit.

Certains systèmes de fichiers (par exemple NTFS) permettent de spécifier le niveau de locking, par exemple pour autoriser les lecteurs concurrents, mais pas les auteurs. Des verrous à plage d’octets sont également possibles.

Contrairement aux bases de données, les systèmes de fichiers ne sont généralement pas transactionnels, pas atomiques et les modifications provenant de différents utilisateurs ne sont pas isolées (si des modifications peuvent même être vues, le locking peut l’interdire).

L’utilisation de verrous de fichiers complets est une approche à gros grain, mais elle prévient les mises à jour incohérentes. Tous les systèmes de fichiers ne prennent pas en charge les verrous de fichiers entiers. Il est donc courant d’utiliser un fichier de locking, un fichier généralement vide dont la présence indique que le fichier associé est utilisé. (La création d’un fichier est une opération atomique sur la plupart des systèmes de fichiers.)

  • Wikipedia – Verrouillage de fichier

Pour Linux, la réponse courte est que vous pouvez récupérer des informations étranges à partir d’un fichier s’il existe un programme d’écriture simultané. Le kernel utilise le locking en interne pour exécuter chaque opération read () et write () en série. (Bien que j’oublie si tout le fichier est verrouillé ou s’il est sur une granularité par page.) Mais si l’application utilise plusieurs appels à write () pour écrire des informations dans le fichier, une lecture () peut avoir lieu entre ces appels. , donc il pourrait voir des données incohérentes. Il s’agit d’une violation d’atomicité dans le système d’exploitation.

Comme mdma l’a mentionné, vous pouvez utiliser le locking de fichier pour vous assurer qu’il n’y a qu’un lecteur et un rédacteur à la fois. Il semble que NTFS utilise le locking obligatoire , où si un programme verrouille le fichier, tous les autres programmes obtiennent des messages d’erreur lorsqu’ils tentent d’y accéder.

Les programmes Unix n’utilisent généralement pas de locking du tout, et quand ils le font, le verrou est généralement conseillé . Un verrou de conseil empêche uniquement les autres processus d’obtenir un verrou de conseil sur le même fichier; cela n’empêche pas la lecture ou l’écriture. (C’est-à-dire qu’il ne verrouille que le fichier pour ceux qui vérifient le verrou.)