[ Pobierz całość w formacie PDF ]
.Jesli wlasciciel starej blokady zaklada nowa to z obszaru przecieciazostaje zdjeta stara blokada, a nowa zakladana jest na zadany obszarTylko wlasciciel moze zdjac blokade.Dopuszczalne jest zdjecie blokady z czesci zajmowanego obszaruNie mozna uspic procesu, jesli spowoduje to zastojZamkniecie pliku powoduje anulowanie wszystkich blokad na pliku zalozonychprzez procesJak widac blokady POSIX sa bardzo poteznym narzedziem, pozwalajacymna zakladanie wielu blokad na jeden plik z zapewnieniem, ze nie doprowadzimydo zastoju.Operacje na blokadach POSIX wykonywanesa za pomoca funkcji systemowej fcntl().Dawniej istniala funkcjalockf() bedaca nakladka (ang.wrapper) na funkcje fcntl()operujaca tylko na blokadach, jednak w najnowszych wersjach Linuxa niezaimplementowano jej.Semantyka blokad typu FLOCK.Blokady zakladane sa na caly plikBlokada moze byc dzielona (ang.shared) lub wylaczna (ang.exclusive)Blokada jest zwiazana ze wskaznikiem pliku (ang.file pointer, flick)Lista blokad przechowywana jest w i-wezleNa jeden wskaznik pliku (nie na plik) moze zostac zalozona tylko jedna blokadaDwie blokady dzielone nie koliduja ze sobaBlokady wylaczne koliduja ze soba, jesli dotycza jednego plikuBlokady wylaczne i dzielone koliduja ze soba jesli dotycza tego samego plikuJesli na wskaznik pliku zakladana jest nowa blokada, to stara jest kasowanaTylko proces majacy dostep do danego wskaznika pliku, moze zdjac blokadeBlokada jest zdejmowana z calego plikuZamkniecie pliku nie powoduje usuniecia blokadZwiazanie blokady ze wskaznikiem pliku powoduje, ze prawo zmiany blokady jestdziedziczone na potomkow.Nie mamy wiec mozliwosci stwierdzenia, kto jestfaktycznym wlascicielem blokady.To wlasnie bylo powodem zabronienia uzywaniaroznych typow blokad na jednym pliku.A oto przyklad sytuacji, kiedy jestemyw zastoju i nie wiemy nawet o tym (zakladajac mozliwosc mieszania blokad) :Proces 100 zaklada blokade POSIX na czesc pliku AProces 200 zaklada blokade FLOCK na plik BProces 200 uruchamia proces 201 i konczy sieProces 201 probuje zalozyc blokade FLOCK na plik A i zostaje uspionyProces 100 probuje zalozyc blokade POSIX na plik B i zostaje uspionyW momencie proby zakladania blokady na plik B nie mamy mozliwosci dowiedzeniasie, kto naprawde sprawuje wladze nad blokada, gdyz nie ma juz procesuktory zalozyl blokade na plik A, a jednak istnieje proces mogacy zdjac blokade.Ze specyfikacji wynika, ze nie da sie wprowadzic prostego mechanizmu kontroli,czy nie tworzymy zastoju procesow dla blokad typu FLOCK.Algorytm wykrywajacy taka sytuacje musialby posiadac bardzo wiele informacjio procesach, ktore kiedys istnialy.Poza tym czas potrzebny na sprawdzenieznacznie obnizylby wydajnosc systemu.Do operacji na blokadach typu FLOCK sluzy funkcja systemowaflock().Blokady obowiazkoweBlokady obowiazkowe sa naturalnym rozszerzeniem blokad doradzanych.Zalozeniem implementacji bylo nie zmienianie istniejacych funkcji a jednoczesnieumozliwienie stosowania rownolegle blokad doradzanych i obowiazkowych.Zrealizowane zostalo to za pomoca zaznaczania pojedynczych plikow jakokandydatow do stosowania blokad obowiazkowych.Aby uzyskac blokady obowiazkowenalezy ustawic bit group_id (ATTR_GID) flagi pliku oraz skasowacbit group_execute z praw dostepu.Od tej chwili blokada POSIX zalozonana ten plik bedzie obowiazujaca.A oto semantyka blokad obowiazkowych:Blokada moze byc tylko typu POSIXObszar zablokowany blokada F_RDLCK moze zostac odczytany przezinny proces, ale nie moze byc do niego nic zapisane.Proba zapisu spowodujeuspienie procesu do czasu zdjecia blokady.Obszar zablokowany blokada F_WRLCK nie moze zostac odczytanyani zapisany przez inny proces niz wlasciciel blokady.Proby zapisu/odczytuspowoduja uspienie procesu do czasu zdjecia blokady.Jesli plik zostal otwarty z flaga O_NONBLOCK, operacjepisania i czytania nie beda powodowaly uspienia tylko powrot z wynikiem EAGAIN.Wywolanie funkcji open() z flaga O_TRUNC lubfunkcji creat() na istniejacym pliku z zalozona blokada obowiazkowazakonczy sie wynikiem EAGAINPo wlaczeniu opcji blokad obowiazkowych zmienia sie dzialanie funkcji:read()write()open()creat()truncate()BibliografiaPliki zrodlowe Linuxa:include/asm/fcntl.h(naglowki funkcji, definicje stalych i struktur)include/linux/fs.h(definicje struktur)fs/fcntl.c (implementacjafunkcji glownej)fs/locks.c (implementacjablokad)Dokumentacja do linuxa:Plik Documentation/locks.txtPlikDocumentation/mandatory.txtAutor: Andrzej Boczek
[ Pobierz całość w formacie PDF ]