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