Zamykani souboru

Alexandr Malusek malusek na sysel.ujf.cas.cz
Pátek Červenec 25 14:31:18 CEST 1997


>  mam nasledujici otazku : programove zamknu cast souboru, a pak mi program
> umre (treba na SIGSEGV to je jedno), zajima me , co se stane s tim
> uzamcenym souborem (nebo s tou uzamcenou oblasti v nem) ??
> Predpokladam ze se system postara o uzavreni deskriptoru a odemknuti ale
> nejsem si moc jistej.

Ano, jadro odstrani odpovidajici zamky a soubory uzavre. Pokud ne, jde
o chybu jadra.

Slozitejsi situace je, pokud mate soubor (nebo jeho cast) zamknutou
pres sit. Tam by to melo fungovat stejne, ale moznych zdroju chyb je
vice. Radsi to popisi.

NFS v.2 je bezstavovy protokol, takze sam o sobe zamykani nemuze
zajistit. (Terminem bezstavovy se mysli to, ze NFS server neudrzuje
zadne informace o stavu clienta - jestli ma nejake soubory otevrene,
zamcene ...). Proto bylo zamykani implementovano pomoci dvou demonu
(hovorim o Solarisu, ale ostatni Unixy by to mely mit podobne), ktere
bezi jak na strane serveru, tak na strane klienta:

- lockd (Network Lock Manager)
- statd (Network Status Monitor)

Pokud chce NFS klient zamknout soubor, jadro preda pozadavek demonu
lockd na strane klienta, ten to dale preda lockd na strane serveru a
ten pres volani jadra zajisti zamknuti. Ukolem demona statd na strane
serveru je monitorovat stav tohoto NFS klienta (pomoci statd na strane
klienta) a pokud dojde k ukonceni procesu, padu klienta, ... pak
pozadat lockd na strane serveru aby zamky uvolnil. Vzhledem k moznym
ztratam paketu v siti, ... je "stabilni" implementace tohoto
mechanismu pomerne narocna, o cemz svedci velike mnozstvi Solarisich
patches prave k temto demonum. Obvykle se nasla nejaka malo
pravdepodobna varianta, kdy to nefungovalo korektne, a nasledovala
patch. Kapitolu samu pro sebe predstavuji vselijake implementace
zamykani pro MS-DOS a MS-Windows, ale o tom se zde radsi ani zminovat
nebudu ;-)

Dale je potreba vedet, ze pres lockd muzete provadet pouze "advisory
locking" (zamek slouzi jen pro informaci, do zamknute oblasti je mozne
psat), nikoliv "mandatory locking" (do zamknute oblasti neni mozne
psat). Pokud by se "mandatory locky" pomoci lockd povolily, pak by
dochazelo k tomu, ze na strane NFS serveru by se hromadily odforkovane
nfsd (pripadne kernel level thready v pripade Solarisu), ktere by
cekaly, az se zamek uvolni. V pripade mensiho poctu pozadavku by to
asi fungovalo, ale tech pozadavku mohou byt stovky, coz by mohlo
zablokovat cely system. Proto mandatory locking nebyl pro NFS
implementovan.

No a jak to vypada s Linuxem:
V RedHatu 4.1 mam flock() ktery implementuje jen advisory locking,
lockf(), statd a lockd nemam, ale uz jsem byl upozornen, ze ve
vyvojarske verzi lockd a statd jsou. Ale zase na druhou stranu ja
zamykat nepotrebuji, takze mi nechybi :-)


S pozdravem,
Alexandr Malusek (malusek na ujf.cas.cz)
UJF AV CR



Další informace o konferenci Linux