Tiedoston lukitus

Tiedoston lukitus on käyttöjärjestelmän tarjoama mekanismi, jonka avulla prosessi voi varata tiedoston tai tiedoston osan käyttöönsä.

Lukituksen tarkoituksena on estää skenaario, jossa ensimmäinen ohjelma lukee tiedostosta tiedon käsittelyä varten, toinen ohjelma kirjoittaa tiedostoon, ja lopulta ensimmäinen ohjelma kirjoittaa tiedostoon käsittelemänsä tiedon, jonka johdosta tiedostossa tämän jälkeen oleva tieto on joko vanhaa (toisen ohjelman tallentama tieto ei tallentunut) tai pahimmassa tapauksessa käyttökelvotonta (ensimmäisen ohjelman tekemä päivitys saattaa vaurioittaa tiedoston, jos se olettaa, että tiedoston rakenne oli sama kuin sen lukiessa tiedostoa).

Lukituksen avulla tiedoston luku, käsittely ja kirjoittaminen voidaan muuttaa jonomaiseksi: Ensimmäinen ohjelma lukitsee tiedoston käsittelyn ajaksi, ja toinen ohjelma odottaa, kunnes tiedosto on luettavissa. Lukitsemista koskevat monet ongelmat, jotka koskevat rinnakkaisuutta yleensä; tiedoston lukkojen huolimaton käsittely johtaa helposti lukkiutumiseen (deadlock).

Monet käyttöjärjestelmät tukevat kahden tyyppisiä lukkoja: Pakollisia (mandatory) ja ohjeellisia (advisory). Ohjeellisten lukkojen ero pakollisiin on se, että ohjeellisia lukkoja käyttävä ohjelma tietää, että tiedosto on lukittu, mutta voi silti halutessaan käyttää tiedostoa ilman, että käyttöjärjestelmä tulkitsisi sen virheeksi. Lukot voivat olla toisinaan myös jaettuja (shared), jolloin useampi prosessi voi käyttää tiedostoa.

Lukitusmekanismeja on useita, riippuen käyttöjärjestelmästä ja käytettävästä tiedostojärjestelmästä.

Microsoft Windows-järjestelmissä tiedostot lukitetaan oletusarvoisesti tiedostoa käyttävälle ohjelmalle, ja lukot pitää erikseen jakaa, mikäli kahden ohjelman tarvitsee käyttää samaa tiedostoa.

Unix-johdannaisissa fcntl()- ja flock()- järjestelmäkutsuilla luotavat lukot ovat pääsääntöisesti ohjeellisia ja jotkin Unix-kloonit tukevat myös pakollisia lukkoja. Useimmissa Unixeissa lukot eivät toimi verkkotiedostojärjestelmissä kuten NFS.

Yksinkertaisimmillaan tiedostojen ohjeellisen lukituksen voi toteuttaa lukkotiedoston (lock file) avulla: Prosessi luo toisen tiedoston sen merkiksi, että jotain toista tiedostoa käsitellään, ja poistaa lukkotiedoston lopuksi. Toinen prosessi tarkistaa, onko lukkotiedosto olemassa, ja odottaa tarvittaessa kunnes tiedosto poistetaan.

Ohjelmointi