Niejasno pamiętam gdzieś, gdzie kiedyś był, w niektórych Uniksach sposób otwierania istniejącego pliku do pisania, z flagą, która prosiła jądro o użycie starej wersji (dla innych procesów uzyskujących dostęp do niego do odczytu), aż do „nowego „wersja została w pełni zapisana (fd zamknięta), od tego momentu plik pojawił się jako nowa wersja.
Innymi słowy, inne procesy albo widziały starą wersję, albo nową, nigdy nie w pełni napisaną.
Czy ktoś kompetentny może wskazać mi odniesienie?
kernel
open-files
eudoksos
źródło
źródło
Odpowiedzi:
To, co opisujesz, brzmi dokładnie jak podstawowa zmiana nazwy w celu zastąpienia pliku.
Po zmianie nazwy / przeniesieniu jednego pliku na inny stary plik jest rozłączany. Oznacza to, że plik nadal istnieje, ale nie ma go już w drzewie systemu plików. W ten sposób stare aplikacje będą mogły uzyskiwać dostęp do pliku, dopóki będą otwarte. Gdy wszystkie aplikacje zamkną stary plik, wówczas jest on faktycznie nieprzydzielony na dysku.
rename
Wywołanie systemowe jest operacją atomową. Aby to zrobić, należy utworzyć nowy plik pod inną nazwą, a następnie wywołać,rename
aby zmienić nazwę pliku tymczasowego na ten, który chcesz zastąpić. Ponieważ operacja jest atomowa, absolutnie nie ma okresu, w którym brakuje pliku. Natychmiast przechodzi ze starego pliku do nowego pliku.Należy jednak pamiętać, że plik tymczasowy i zastępowany plik muszą znajdować się w tym samym punkcie podłączenia.
źródło
rename
zamianę. Nawet jeśli istniała taka „funkcja systemu operacyjnego”, o której mówisz, program nadal musiałby zostać napisany, aby z niej skorzystać. Co za różnica?open
syscall lub jeśli musisz zrobić to, co opisujesz ręcznie.Jak pisze Patrick , zwykłym sposobem na to jest zapisanie nowej wersji do osobnego pliku, a po zakończeniu zmień nazwę nowej wersji na starą nazwę pliku, zastępując ją atomowo. Ta druga operacja nosi nazwę nadpisywania według zmiany nazwy .
Teraz niektóre referencje:
ISO C wymaga
rename
atomowości. Z podstawowych specyfikacji grupy otwartej :Stare wersje Mac OS X nie miały nazw atomowych; jest to podobno naprawione w Lion.
Btrfs najwyraźniej celowo narusza standard, nie gwarantując nazw atomowych ze względu na wydajność. Jednak nadpisywanie przez zmianę nazwy jest nadal atomowe , co jest wszystkim, czego potrzebujesz do tego celu.
źródło
man 3p rename
mówi mi, żerename
to rzeczywiście jest atomowe i myślę, że to jest przeznaczone dla wszystkich systemów plików Linux. A kiedy czytam pierwszy artykuł, który podłączyłeś, nadal myślę, że operacje zmiany nazwy Btrfs są atomowe.To przypomina mi Allocate On Flush . Gdy system plików korzysta z tej funkcji, zamiast zapisywać dane bezpośrednio na dysku, odejmuje rozmiar danych do zapisania od licznika wolnego miejsca na dysku i przechowuje dane w pamięci, dopóki nie zostanie wykonane wywołanie systemowe synchronizacji lub jądro nie zdecyduje opróżnić zabrudzone bufory.
W takim przypadku, jeśli plik jest modyfikowany przez jeden proces i otwierany przez inny proces, ten drugi proces „zobaczy” niezmodyfikowaną ( lub „starą”, jeśli wolisz ) wersję pliku.
Oczywiście powyższe są teoretyczne i zależą od różnych czynników, i powiedziałbym trochę nieprzewidywalne - ponieważ nie wiesz dokładnie, kiedy jądro będzie spłukiwać brudne strony. Na przykład w Linuksie ( jak można również przeczytać w sekcji 15.3 Zrozumienia jądra Linuksa ), brudne strony są zapisywane na dysk pod następującymi warunkami:
Pamięć podręczna stron zapełnia się i potrzeba więcej stron lub liczba brudnych stron staje się zbyt duża.
Upłynęło zbyt wiele czasu, ponieważ strona pozostała brudna.
Proces żąda, aby wszystkie oczekujące zmiany urządzenia blokowego lub określonego pliku zostały usunięte; robi to przez wywołanie wywołania systemowego sync (), fsync () lub fdatasync ().
Ta funkcja jest znana z implementacji w systemach plików HFS +, XFS, Reiser4, ZFS, Btrfs i ext4.
źródło