..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 oczywiście
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ójstopniowości 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 jeśli nie s± one spokrewnione - zadanie
polega na stworzeniu takiej możliwości.
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ólności 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