..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