Как файловите системи обработват едновременно четене/запис?

Потребител A иска от системата да прочете файл foo и в същото време потребител B иска да запише своите данни в същия файл. Как се справя тази ситуация на ниво файлова система?


person Matteo Riva    schedule 01.05.2010    source източник


Отговори (2)


Повечето файлови системи (но не всички) използват заключване, за да предпазят едновременния достъп до един и същи файл. Заключването може да бъде ексклузивно, така че първият потребител, който получи заключването, получава достъп - следващите потребители получават грешка "достъпът е отказан". Във вашия примерен сценарий потребител A ще може да прочете файла и ще получи заключване на файла, но потребител B няма да може да пише, докато потребител A чете.

Някои файлови системи (напр. NTFS) позволяват да се посочи нивото на заключване, за да се позволи например едновременни четци, но не и писатели. Възможни са и заключвания на байтов диапазон.

За разлика от базите данни, файловите системи обикновено не са транзакционни, не са атомарни и промените от различни потребители не са изолирани (ако промените дори могат да се видят - заключването може да забрани това.)

Използването на заключвания за цял файл е груб подход, но ще предпази от непоследователни актуализации. Не всички файлови системи поддържат заключвания на цял файл и затова е обичайна практика да се използва файл за заключване - обикновено празен файл, чието присъствие показва, че свързаният с него файл се използва. (Създаването на файл е атомарна операция в повечето файлови системи.)

person mdma    schedule 01.05.2010
comment
Заключването работи ли върху целия файл или върху части (блокове/inodes/каквото и да е) от него? - person Matteo Riva; 02.05.2010
comment
Отговорът е специфичен за файловата система (както без съмнение сте разбрали от другите отговори). Windows използва заключване на целия файл в повечето случаи, тъй като това е част от API за отваряне на файлове (CreateFile). Налично е заключване на диапазон от байтове, но приложенията трябва специално да поискат заключване за регион на файл, използвайки различна API функция (LockFile). - person mdma; 02.05.2010

За Linux краткият отговор е, че можете да получите някаква странна информация обратно от файл, ако има паралелен запис. Ядрото използва вътрешно заключване, за да изпълнява всяка операция read() и write() последователно. (Въпреки че забравям дали целият файл е заключен или е на детайлност на страница.) Но ако приложението използва множество извиквания на write(), за да напише информация във файла, read() може да се случи между някое от тези извиквания, така че може да види непоследователни данни. Това е нарушение на атомарността в операционната система.

Както mdma спомена, можете да използвате заключване на файлове, за да сте сигурни, че има само един читател и един писател на време. Изглежда, че NTFS използва задължително заключване, при което, ако една програма заключи файла, всички други програми получават съобщения за грешка, когато се опитат да получат достъп до него.

Unix програмите обикновено изобщо не използват заключване, а когато го правят, заключването обикновено е препоръчително. Препоръчителното заключване само предотвратява други процеси да получат препоръчително заключване на същия файл; всъщност не предотвратява четенето или записването. (Тоест заключва файла само за тези, които проверяват ключалката.)

person Karmastan    schedule 01.05.2010