5.1.6. Sharing Support

Pokud přistupuje k souboru více procesů, je samozřejmě potřeba nějak definovat jak to bude vypadat. Minimální řešení je zajištění atomičnosti jednotlivých operací, což má jako default například UNIX či MS-DOS bez nataženého share.

Důmyslnější řešení je možnost zamykání celých souborů, to je například k dispozici v MS-DOSu při nataženém share. Při volání INT 21h fn 3Dh File Open se dalo zadat, zda se povolí další otevírání pro čtení a pro zápis. Podobnou věc umí UNIX pomocí volání flock.

Ještě o něco důmyslnější je možnost zamykat části souborů pro čtení či pro zápis. Tohle umí jak UNIX přes fcntl, tak třeba i nešťastný MS-DOS se share. Zadá se offset a délka zamykaného bloku a režim zamykání, ten je zpravidla shared (alias read) lock nebo exclusive (alias write) lock. Zamykání části souboru má jednu nevýhodu, totiž u každého souboru se musí pamatovat seznam existujících zámků, který se musí kontrolovat při relevantních operacích.

Aby se omezila velikost seznamu zámků, DOS například vyžaduje, aby odemykání specifikovalo pouze přesně takové bloky, které byly zamčené. Tedy není možné zamknout velký blok a odemknout kousek z jeho prostředka, čímž se odstraní problémy s fragmentací bloků.

5.1.6.1. Example: Linux Sharing Operations

Unix rozlišuje advisory a mandatory locking. Od začátku implementované jsou pouze advisory locks, totiž zámky, které se projeví pouze pokud se na ně proces zeptá. To samozřejmě není příliš bezpečné, a tak se doplnily ještě mandatory locks, které kontroluje kernel. Aby mandatory locks neblokovaly ve chvílích, kdy to stávající aplikace nečekaly, řeklo se, že budou automaticky nasazené na soubory s nastaveným group ID bitem a shozeným group execute bitem.

Mandatory locks uměl první tuším UNIX System V.

Nepříjemná vlastnost mandatory locks je, že mají trochu složitější sémantiku než advisory locks, a ne všechny systémy se do ní vždycky trefí. Sice existuje specifikace UNIX System V Interface Definition, ale tu snad nikdo přesně nedodržuje. Pěkný seznam odchylek je v dokumentaci o zamykání v Linux kernelu.

Mandatory locking také může způsobovat deadlock. Oblíbeným hackem bývalo zamknout si lokálně mandatory nějaký soubor a pak zkusit porušit tenhle zámek přes NFS, čímž se s trochou štěstí dal zablokovat NFS server.

Souborové zámky zpravidla nejsou vhodné pro časté zamykání s malou granularitou.

5.1.6.2. Example: Windows Sharing Operations

Locked and unlocked regions must match, it is not possible to lock a region and then unlock part of a region, or to lock multiple adjacent regions and then unlock the regions together.

Locking does not prevent reading through memory mapping.

Locks are unlocked on closing the locked file or terminating the owning process. Arbitrary time may elapse between closing or terminating and unlocking.