61 votes

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 l'utilisateur B souhaite en même temps sauvegarder ses données dans le même fichier. Comment cette situation est-elle gérée au niveau du système de fichiers?

47voto

mdma Points 33973

La plupart des systèmes de fichiers (mais pas tous) utiliser le verrouillage de la garde d'accès simultanés au même fichier. Le verrou peut être exclusive, de sorte que le premier utilisateur d'obtenir le verrouillage de l'accès - les utilisateurs suivants obtenez une erreur "accès refusé". Dans votre exemple de scénario, l'utilisateur sera en mesure de lire le fichier et récupère le fichier de verrouillage, mais l'utilisateur B ne sera pas en mesure d'écrire pendant que l'utilisateur A est la lecture.

Certains systèmes de fichiers (par exemple, NTFS) permettent d'améliorer le niveau de verrouillage être précisée, afin de permettre par exemple de lecteurs simultanés, mais pas des écrivains. Octet-verrous de plage sont également possibles.

Contrairement aux bases de données, les systèmes de fichiers ne sont généralement pas de nature transactionnelle, pas atomique et des changements de différents utilisateurs ne sont pas isolés (si des modifications peuvent encore être vu de verrouillage peut l'interdire.)

Entier en utilisant les verrous de fichier est un grain grossier, mais elle garde contre incompatible mises à jour. Pas tous les systèmes de fichiers entiers-verrous de fichier, et donc il est de pratique courante d'utiliser un fichier de verrouillage - un fichier vide dont la présence indique que son fichier associé est en cours d'utilisation. (Création d'un fichier est une opération atomique sur la plupart des systèmes de fichiers.)

36voto

Karmastan Points 4092

Pour Linux, la réponse courte est que vous pourriez obtenir quelque étrange informations à partir d'un fichier s'il est un concurrent à l'écrivain. Le noyau n'utiliser le verrouillage interne pour l'exécution de chaque read() et write() fonctionnement en série. (Bien que, j'ai oublié si la totalité du fichier est verrouillé ou si c'est sur une page de granularité.) Mais si l'application utilise plusieurs write() appels d'écrire des informations dans le fichier, un read() pourrait se produire entre l'un de ces appels, de sorte qu'il pouvait voir les données incohérentes. C'est une atomicité de violation du système d'exploitation.

Comme de la mdma a mentionné, vous pourriez utiliser le verrouillage de fichier assurez-vous qu'il est seulement un lecteur et un écrivain à la fois. Il sonne comme NTFS utilise obligatoire de verrouillage, où si l'on programme verrouille le fichier, tous les autres programmes obtenez des messages d'erreur lorsqu'ils tentent d'accéder.

Des programmes Unix en général ne pas utiliser le verrouillage du tout, et quand ils le font, la serrure est généralement consultatif. Un avis de verrouillage empêche seulement d'autres processus d'obtention d'un avis de verrouillage sur le même fichier; il n'a pas empêcher la lecture ou l'écriture. (Qui est, il ne verrouille le fichier pour ceux qui vérifier la serrure.)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X