..powrót do spisu
treści tematu 6
Lab-Linux
System Plików
Zadanie praktyczne nr 13
1. Wstęp
W systemie plików systemu Linux istnieje możliwość jednoczesnego korzystania
z jednego pliku przez wiele procesów. Wspólne czytanie nie stwarza oczywicie
większych problemów, a dla zapewnienia bezpieczeństwa przy wspólnym pisaniu
podczas zapisu nakładana jest na i-węzeł pliku blokada uniemożliwiająca
jednoczesny zapis wielu procesom.
Przy zwykłym korzystaniu z jednego pliku przez wiele procesów, znaczniki
bieżących pozycji w pliku są dla tych procesów niezależne od siebie; gdy
jeden proces przesuwa swój znacznik to znaczniki należące do innych procesów
pozostają niezmienione. Jest to niezwykle wygodne, znakomicie utrudnia
jednak wykonanie wielu interesujących operacji jak choćby zlecanie innemu
procesowi znalezienia czego w pliku, bez konieczności przekazywania następnie
bieżącej pozycji w tymże pliku metodami w rodzaju kolejki komunikatów lub
pamięci dzielonej (metodami skądinąd niezwykle użytecznymi, jednakże, wydaje
się, zbyt wyszukanymi na przekazanie kilku zaledwie bajtów danych).
Istnieje wprawdzie możliwość dzielenia znacznika pozycji w pliku przez
wiele procesów, co umożliwia np. wykonanie rzeczonych operacji, jest ona
jednak ograniczona do przypadku, gdy procesy te są ze sobą spokrewnione
np. jeden jest potomkiem drugiego. Jest to możliwe dzięki temu, że proces
potomny dziedziczy od swego przodka tablicę deskryptorów.
Umożliwienie współdzielenia znacznika bieżącej pozycji w pliku było
w istocie główną motywacją wprowadzenia trójstopniowoci w odwoływaniu
się do fizycznego pliku.
Nietrudno jednak zauważyć, że nie jest możliwe współdzielenie znacznika
pozycji w pliku przez wiele procesów jeli nie są one spokrewnione - zadanie
polega na stworzeniu takiej możliwoci.
2. Szczegóły
Należy uzupełnić funkcję open() w ten sposób,
by otwierała plik w sposób, jak to nazwałem, symultaniczny tzn. tak,, że
wszystkie korzystające symultanicznie z danego pliku procesy współdzielą
ten sam znacznik pozycji w pliku. Procesy otwierające ten sam plik w sposób
tradycyjny korzystają z własnych znaczników pozycji i fakt, że plik został
otwarty symultanicznie przez inne procesy nie ma wpływu na ich działanie.
Oczywiście również w ramach tego samego procesu możliwe jest otwarcie
jednego pliku raz tradycyjnie, a raz symultanicznie.
Również funkcja lseek() powinna zostać uzupełniona tak, by
umozliwić 'przesuwanie' bądź 'prywatnego' znacznika pozycji w pliku, bądź
znacznika 'symultanicznego' - wspólnego dla wszystkich procesów korzystających
z pliku symultanicznie. Przy czym samo wywołanie funkcji lseek()
nie powinno się w żaden sposób zmienić - to funkcja ma rozstrzygnąć, czy
plik jest symultaniczny, czy nie.
Należy także odpowiednio uzupełnić inne funkcje systemowe, by wykorzystanie
symultaniczności było jak najpełniejsze.
Bardzo ważną kwestią jest, przy rozwiązywaniu zadania, zachowanie bezpieczeństwa
wykonywanych działań, co w szczególnoci oznacza traktowanie fragmentów
kodu, w których jest możliwość jednoczesnych zapisów, jako sekcji krytycznych
i odpowiednie do tej sytuacji obchodzenie się z nimi.
Należy także przygotować serię testów pokazujšcych skutecznoć dokonanych
zmian w kodzie jądra.
3. Uwagi
Nie jest konieczne dodanie żadnych nowych funkcji systemowych ani nowych
struktur danych jądra - należy dokonać zmian (uzupełnień) w funkcjach i
strukturach już istniejących.
Należy pamiętać, że procesy 'nie wiedzące' o nowej możliwości otwarcia
pliku mają dokonanej w kodzie jądra zmiany nie zauważać i działać tak,
jak przedtem.
Nowy sposób wywołania powinien dotyczyć tylko funkcji open(),
tzn. wywołanie innych, modyfikowanych i niemodyfikowanych, funkcji nie
powinno ulec zmianie.
Wywołanie funkcji dup() powinno duplikować deskryptor tak,
że symultaniczność pliku lub jego 'niesymultaniczność' jest zachowana.
Dotyczy to również dziedziczenia deskryptorów przez proces potomny - symultaniczność
lub 'nie' musi być zachowana dla plików potomka.
Można przyjąć, jeżeli takowe założenie okaże się niezbędne, że symultaniczność
pliku pociąga za sobą jego synchroniczność.
Należy pamiętać o kontroli praw dostępu do otwieranego pliku - symultaniczne
otwarcie pliku ma być możliwe wtedy i tylko wtedy gdy ten plik możnaby
otworzyć tradycyjnie.
Autor: Adam Kieżun