web-dev-qa-db-fra.com

Comment les systèmes de fichiers gèrent-ils la lecture / écriture simultanée?

L'utilisateur A demande au système de lire le fichier foo et en même temps 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?

59
Matteo Riva

La plupart des systèmes de fichiers (mais pas tous) utilisent le verrouillage pour protéger l'accès simultané au même fichier. Le verrou peut être exclusif, donc le premier utilisateur à obtenir le verrou obtient l'accès - les utilisateurs suivants obtiennent une erreur "accès refusé". Dans votre exemple de scénario, l'utilisateur A pourra lire le fichier et obtient le verrou de 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 verrouillage, pour permettre par exemple des lecteurs simultanés, mais pas d'écrivains. Des verrous de plage d'octets sont également possibles.

Contrairement aux bases de données, les systèmes de fichiers ne sont généralement pas transactionnels, ni atomiques et les modifications apportées par différents utilisateurs ne sont pas isolées (si des modifications sont même visibles - le verrouillage peut l'interdire.)

L'utilisation de verrous de fichiers entiers est une approche à granularité grossière, mais elle évitera les mises à jour incohérentes. Tous les systèmes de fichiers ne prennent pas en charge les verrous de fichiers entiers, et il est donc courant d'utiliser un fichier de verrouillage - un fichier généralement vide dont la présence indique que son fichier associé est en cours d'utilisation. (La création d'un fichier est une opération atomique sur la plupart des systèmes de fichiers.)

46
mdma

Pour Linux, la réponse courte est que vous pourriez récupérer des informations étranges à partir d'un fichier s'il y a un écrivain simultané. Le noyau utilise le verrouillage en interne pour exécuter chaque read () et write () fonctionnement en série. (Bien que j'oublie si le fichier entier est verrouillé ou s'il se trouve sur une granularité par page.) Mais si l'application utilise plusieurs appels write () pour écrire des informations dans le fichier, un read () pourrait se produire entre l'un de ces appels, de sorte qu'il pourrait voir des données incohérentes. Il s'agit d'un violation d'atomicité dans le système d'exploitation.

Comme mdma l'a mentionné, vous pouvez utiliser verrouillage de fichier pour vous assurer qu'il n'y a qu'un seul lecteur et un seul écrivain à la fois. Il semble que NTFS utilise le verrouillage obligatoire , où si un programme verrouille le fichier, tous les autres programmes reçoivent des messages d'erreur lorsqu'ils essaient d'y accéder.

Les programmes Unix n'utilisent généralement pas de verrouillage du tout, et lorsqu'ils le font, le verrouillage est généralement consultatif . Un verrou consultatif empêche uniquement les autres processus d'obtenir un verrou consultatif sur le même fichier; il n'empêche pas d'empêcher la lecture ou l'écriture. (Autrement dit, il ne verrouille le fichier que pour ceux qui vérifient le verrou.)

36
Karmastan