Czy wywołania POSIX w systemie read () i write () są atomowe?
Usiłuję zaimplementować indeks bazy danych na podstawie struktury danych (Bpołączyć drzewo) i algorytmy sugerowane przez Lehmana i Yao wten papier. Na stronie 2 autorzy stwierdzają, że:
Dysk jest podzielony na sekcje o stałym rozmiarze (strony fizyczne; w tym dokumencie odpowiadają one węzłom drzewa).Są to jedyne jednostki, które mogą być odczytywane lub zapisywane przez proces. [podkreśl moje] (...)
(...) proces może zablokować i odblokować stronę dysku. Ta blokada daje temu procesowi wyłączne prawa do modyfikacji tej strony; także procesmusi zablokować stronę, aby zmodyfikować tę stronę. (...)Zamkinie rób uniemożliwić innym procesom odczyt zablokowanej strony. [podkreślenie moje]
Nie jestem do końca pewny, czy moja interpretacja jest poprawna (nie jestem przyzwyczajony do czytania prac naukowych), ale myślę, że można wywnioskować z podkreślonych zdań, że autorzy mają na myśli, że operacje, które czytają i piszą stronę, mają być „atomowe” , w tym sensie, że jeśli proces A już zaczął czytać (lub zapisywać) stronę, inny proces B może nie rozpocząć pisania (odpowiednio czytania) tej samej strony, dopóki A nie zakończy wykonywania operacji odczytu (odp. zapisu) . Wiele procesów jednocześnie czytających tę samą stronę jest oczywiście uzasadnionym warunkiem, podobnie jak wiele procesów jednocześnie wykonujących dowolne operacje na wyłącznie różnych stronach (proces A na stronie P, proces B na stronie Q, proces C na stronie R itd. ).
Czy moja interpretacja jest poprawna?
Czy mogę założyć POSIXread()
iwrite()
wywołania systemowe są „atomowe” w znaczeniu opisanym powyżej? Czy mogę polegać na tych wywołaniach systemowych mających pewną wewnętrzną logikę, aby określić, czy jest to specyficzneread()
lubwrite()
wywołanie powinno być tymczasowo zablokowane na podstawie pozycji deskryptora pliku i określonego rozmiaru fragmentu do odczytania lub zapisu?
Jeśli odpowiedź na powyższe pytania brzmi „Nie”, w jaki sposób powinienem przetoczyć własny mechanizm blokujący?