Bestandsvergrendeling - File locking

Bestandsvergrendeling is een mechanisme dat de toegang tot een computerbestand of een deel van een bestand beperkt door slechts één gebruiker of proces toe te staan ​​het op een bepaald tijdstip te wijzigen of te verwijderen en om te voorkomen dat het bestand wordt gelezen terwijl het wordt gewijzigd of verwijderd .

Systemen implementeren vergrendeling om het klassieke tussentijdse updatescenario te voorkomen , wat een typisch voorbeeld is van een raceconditie , door de serialisatie van updateprocessen naar een bepaald bestand af te dwingen. Het volgende voorbeeld illustreert het probleem met de tussentijdse update:

  1. Proces A leest een klantrecord uit een bestand met rekeninginformatie, inclusief het rekeningsaldo en telefoonnummer van de klant.
  2. Proces B leest nu hetzelfde record uit hetzelfde bestand, dus het heeft zijn eigen kopie.
  3. Proces A wijzigt het rekeningsaldo in zijn kopie van het klantrecord en schrijft het record terug naar het bestand.
  4. Proces B, dat nog steeds de oorspronkelijke oude waarde voor het rekeningsaldo in zijn kopie van het klantrecord heeft, werkt het rekeningsaldo bij en schrijft het klantrecord terug naar het bestand.
  5. Proces B heeft nu zijn oude rekeningsaldowaarde naar het bestand geschreven, waardoor de wijzigingen die door proces A zijn aangebracht verloren gaan.

De meeste besturingssystemen ondersteunen het concept van recordvergrendeling , wat betekent dat individuele records binnen een bepaald bestand kunnen worden vergrendeld, waardoor het aantal gelijktijdige updateprocessen toeneemt . Databaseonderhoud maakt gebruik van bestandsvergrendeling, waarbij het de toegang tot het volledige fysieke bestand dat aan een database ten grondslag ligt, kan serialiseren. Hoewel dit voorkomt dat andere processen toegang krijgen tot het bestand, kan het efficiënter zijn dan het individueel vergrendelen van veel regio's in het bestand door de overhead van het verwerven en vrijgeven van elke vergrendeling weg te nemen.

Slecht gebruik van het bestand sloten, net als elke computer vergrendelen , kan leiden tot slechte prestaties of in impasses . Bestandsvergrendeling kan ook verwijzen naar extra beveiliging die wordt toegepast door een computergebruiker, hetzij door Windows-beveiliging, NTFS-machtigingen te gebruiken of door software voor bestandsvergrendeling van derden te installeren.

In mainframes

IBM pionierde in 1963 met bestandsvergrendeling voor gebruik in mainframecomputers met OS/360 , waar het "exclusieve controle" werd genoemd.

In Microsoft Windows

Microsoft Windows gebruikt drie verschillende mechanismen om de toegang tot gedeelde bestanden te beheren:

  1. met behulp van gedeelde toegangscontroles waarmee toepassingen toegang tot volledige bestanden kunnen specificeren voor lezen, schrijven of verwijderen
  2. bytebereikvergrendelingen gebruiken om lees- en schrijftoegang tot regio's binnen een enkel bestand te arbitreren
  3. door Windows-bestandssystemen die toestaan ​​dat uitvoerende bestanden niet worden geopend voor schrijf- of verwijdertoegang

Windows neemt de semantiek van gedeelde toegangscontroles over van het MS-DOS- systeem, waar delen werd geïntroduceerd in MS-DOS 3.3. Een toepassing moet dus expliciet delen toestaan ​​wanneer het een bestand opent; anders heeft het exclusieve lees-, schrijf- en verwijdertoegang tot het bestand totdat het wordt gesloten (andere soorten toegang, zoals die om de kenmerken van een bestand op te halen, zijn toegestaan.)

Voor een bestand dat met gedeelde toegang is geopend, kunnen toepassingen vervolgens bytebereikvergrendeling gebruiken om de toegang tot specifieke delen van het bestand te regelen. Dergelijke bytebereikvergrendelingen specificeren een regio van het bestand (offset en lengte) en het type vergrendeling (gedeeld of exclusief). Houd er rekening mee dat de regio van het bestand dat wordt vergrendeld, geen gegevens in het bestand hoeft te hebben, en toepassingen maken soms misbruik van deze mogelijkheid om hun functionaliteit te implementeren.

Voor toepassingen die de API's voor het lezen/schrijven van bestanden in Windows gebruiken, worden bytebereikvergrendelingen afgedwongen (ook wel verplichte vergrendelingen genoemd ) door de bestandssystemen die binnen Windows worden uitgevoerd. Voor toepassingen die de bestandstoewijzing- API's in Windows gebruiken, worden bytebereikvergrendelingen niet afgedwongen (ook wel adviserende vergrendelingen genoemd. ) Bytebereikvergrendeling kan ook andere neveneffecten hebben op het Windows-systeem. Het Windows-mechanisme voor het delen van bestanden zal bijvoorbeeld meestal de cache aan de clientzijde van een bestand voor alle clients uitschakelen wanneer bytebereikvergrendelingen door een client worden gebruikt . De client zal langzamere toegang waarnemen omdat lees- en schrijfbewerkingen naar de server moeten worden gestuurd waar het bestand is opgeslagen.

Onjuiste foutafhandeling in een applicatieprogramma kan leiden tot een scenario waarin een bestand is vergrendeld (ofwel met behulp van "share"-toegang of met byte-range bestandsvergrendeling) en niet toegankelijk is voor andere applicaties. Als dit het geval is, kan de gebruiker mogelijk de bestandstoegang herstellen door het defecte programma handmatig te beëindigen. Dit wordt meestal gedaan via het hulpprogramma Taakbeheer .

De sharing mode parameter (dwShareMode) van de CreateFilefunctie (gebruikt om geopende bestanden) bepaalt file-sharing. De deelmodus kan worden gespecificeerd om het delen van het bestand toe te staan ​​voor lees-, schrijf- of verwijdertoegang, of een combinatie hiervan. Volgende pogingen om het bestand te openen, moeten compatibel zijn met alle eerder verleende toegang tot het bestand om het bestand te delen. Wanneer het bestand is gesloten, worden de beperkingen voor toegang tot delen aangepast om de beperkingen op te heffen die zijn opgelegd door dat specifieke geopende bestand.

Het type vergrendeling van het bytebereik wordt bepaald door de dwFlagsparameter in de LockFileExfunctie die wordt gebruikt om een ​​regio van een bestand te vergrendelen. De Windows API- functie LockFilekan ook worden gebruikt en krijgt een exclusieve vergrendeling op de regio van het bestand.

Elk bestand dat een uitvoerbaar programmabestand bevat dat momenteel als een programma op het computersysteem wordt uitgevoerd (bijv. een EXE, COM, DLL, CPLof een ander binair programmabestandsformaat) wordt normaal gesproken vergrendeld door het besturingssysteem zelf, waardoor een toepassing het niet kan wijzigen of verwijderen. Elke poging om dit te doen wordt geweigerd met een fout bij het delen van fouten, ondanks het feit dat het programmabestand door geen enkele toepassing wordt geopend. Sommige toegang is echter nog steeds toegestaan. Een actief toepassingsbestand kan bijvoorbeeld worden hernoemd of gekopieerd (gelezen), zelfs wanneer het wordt uitgevoerd.

Bestanden zijn toegankelijk voor toepassingen in Windows met behulp van bestandshandvatten . Deze bestandshandvatten kunnen worden verkend met het hulpprogramma Process Explorer . Dit hulpprogramma kan ook worden gebruikt om hendels geforceerd te sluiten zonder dat de toepassing die ze vasthoudt, hoeft te worden beëindigd. Dit kan een ongedefinieerd gedrag veroorzaken, aangezien het programma een onverwachte fout zal ontvangen bij gebruik van de geforceerd gesloten handle en zelfs kan werken op een onverwacht bestand aangezien het handle-nummer kan worden hergebruikt.

Microsoft Windows XP en Server 2003- edities hebben volume snapshot ( VSS) in NTFS geïntroduceerd , waardoor open bestanden toegankelijk zijn voor back-upsoftware, ondanks exclusieve vergrendelingen. Tenzij software echter wordt herschreven om deze functie specifiek te ondersteunen, zal de snapshot alleen crash-consistent zijn, terwijl correct ondersteunde applicaties het besturingssysteem kunnen helpen bij het maken van "transactioneel consistente" snapshots. Andere commerciële software voor toegang tot vergrendelde bestanden onder Windows zijn onder meer File Access Manager en Open File Manager . Deze werken door hun eigen stuurprogramma's te installeren om toegang te krijgen tot de bestanden in de kernelmodus .

In Unix-achtige systemen

Unix-achtige besturingssystemen (inclusief Linux en Apple's macOS ) vergrendelen normaal gesproken geopende bestanden niet automatisch. Er zijn verschillende soorten bestandsvergrendelingsmechanismen beschikbaar in verschillende smaken van Unix, en veel besturingssystemen ondersteunen meer dan één soort voor compatibiliteit. Het meest voorkomende mechanisme is fcntl. Twee andere van dergelijke mechanismen zijn flock(2)en lockf(3), die afzonderlijk kunnen zijn of bovenop kunnen worden geïmplementeerd fcntl. Hoewel sommige typen vergrendelingen als verplicht kunnen worden geconfigureerd, zijn bestandsvergrendelingen onder Unix standaard adviserend . Dit betekent dat samenwerkende processen sloten kunnen gebruiken om de toegang tot een bestand onderling te coördineren, maar niet-coöperatieve processen zijn ook vrij om sloten te negeren en toegang te krijgen tot het bestand op elke gewenste manier. Met andere woorden, bestandsvergrendelingen sluiten alleen andere bestandsvergrendelingen uit, niet I/O.

Er worden twee soorten sloten aangeboden: gedeelde sloten en exclusieve sloten. In het geval van fcntl, kunnen verschillende soorten vergrendelingen worden toegepast op verschillende secties (bytebereiken) van een bestand, of anders op het hele bestand. Gedeelde vergrendelingen kunnen tegelijkertijd door meerdere processen worden vastgehouden, maar een exclusieve vergrendeling kan slechts door één proces worden vastgehouden en kan niet naast een gedeelde vergrendeling bestaan. Om een ​​gedeelde vergrendeling te verkrijgen, moet een proces wachten totdat geen enkel proces exclusieve vergrendelingen heeft. Om een ​​exclusieve vergrendeling te verkrijgen, moet een proces wachten totdat geen enkel proces een van beide soorten vergrendelingen bevat. In tegenstelling tot sloten die zijn gemaakt door fcntl, worden de sloten die zijn gemaakt door s flockbewaard fork, waardoor ze nuttig zijn bij het forken van servers. Het is daarom mogelijk dat meer dan één proces een exclusieve vergrendeling voor hetzelfde bestand heeft, op voorwaarde dat deze processen een kinderlijke relatie hebben en de exclusieve vergrendeling in eerste instantie in één proces is gemaakt voordat deze over een fork.

Gedeelde sloten worden soms "leessloten" genoemd en exclusieve sloten worden soms "schrijfsloten" genoemd. Omdat vergrendelingen op Unix echter adviserend zijn, wordt dit niet afgedwongen. Het is dus mogelijk dat een database een concept heeft van "gedeelde schrijfbewerkingen" versus "exclusieve schrijfbewerkingen"; het wijzigen van een veld op zijn plaats kan bijvoorbeeld worden toegestaan ​​onder gedeelde toegang, terwijl het verzamelen van afval en het herschrijven van de database exclusieve toegang kan vereisen.

Bestandsvergrendelingen zijn van toepassing op het eigenlijke bestand, in plaats van op de bestandsnaam. Dit is belangrijk omdat Unix toestaat dat meerdere namen naar hetzelfde bestand verwijzen. Samen met niet-verplichte vergrendeling leidt dit tot een grote flexibiliteit bij de toegang tot bestanden vanuit meerdere processen. Aan de andere kant kan de coöperatieve vergrendelingsbenadering tot problemen leiden wanneer een proces naar een bestand schrijft zonder te gehoorzamen aan bestandsvergrendelingen die door andere processen zijn ingesteld.

Om deze reden bieden sommige Unix-achtige besturingssystemen ook beperkte ondersteuning voor verplichte vergrendeling . Op dergelijke systemen wordt een bestand waarvan de setgidbit aan staat maar waarvan de groepsuitvoeringsbit uit is wanneer dat bestand wordt geopend, onderworpen aan automatische verplichte vergrendeling als het onderliggende bestandssysteem dit ondersteunt. Niet-lokale NFS-partities hebben echter de neiging dit bit te negeren. Als een bestand is onderworpen aan verplichte vergrendeling, worden pogingen om te lezen uit een regio die is vergrendeld met een exclusieve vergrendeling, of om te schrijven naar een regio die is vergrendeld met een gedeelde of exclusieve vergrendeling, geblokkeerd totdat de vergrendeling wordt opgeheven. Deze strategie is voor het eerst ontstaan ​​in System V en is tegenwoordig te zien in de besturingssystemen Solaris , HP-UX en Linux. Het maakt echter geen deel uit van POSIX en van BSD afgeleide besturingssystemen zoals FreeBSD , OpenBSD , NetBSD en Apple's macOS ondersteunen het niet. Linux ondersteunt ook verplichte vergrendeling via de speciale -o mandparameter voor bestandssysteemmontage ( mount(8)), maar dit wordt zelden gebruikt.

Sommige Unix-achtige besturingssystemen voorkomen pogingen om het uitvoerbare bestand van een actief programma te openen om te schrijven; dit is een derde vorm van vergrendeling, los van die van fcntlen flock.

Problemen

Meer dan één proces kan een flockexclusieve vergrendeling bevatten voor een bepaald bestand als de exclusieve vergrendeling op een later fork. Dit vereenvoudigt de codering voor netwerkservers en helpt race-omstandigheden te voorkomen, maar kan verwarrend zijn voor de onwetende.

Verplichte vergrendelingen hebben geen effect op de unlinksysteemaanroep. Bijgevolg kunnen bepaalde programma's de verplichte vergrendeling effectief omzeilen. Stevens & Rago (2005) merkten op dat de edredacteur dat inderdaad deed.

Of en hoe flocksloten werken op netwerkbestandssystemen, zoals NFS , is afhankelijk van de implementatie. Op BSD- systemen zijn flockaanroepen van een bestandsdescriptor die openstaat voor een bestand op een NFS-gemounte partitie succesvolle no-ops . Op Linux vóór 2.6.12 werkten flockoproepen op NFS-bestanden alleen lokaal. Kernel 2.6.12 en hoger implementeren flockoproepen op NFS-bestanden met behulp van POSIX-bytebereikvergrendelingen. Deze vergrendelingen zijn zichtbaar voor andere NFS-clients die POSIX-vergrendelingen infcntl -stijl implementeren , maar zijn onzichtbaar voor degenen die dat niet doen.

Slotupgrades en -downgrades geven het oude slot vrij voordat het nieuwe slot wordt toegepast. Als een toepassing een exclusieve vergrendeling downgradet naar een gedeelde vergrendeling terwijl een andere toepassing wordt geblokkeerd in afwachting van een exclusieve vergrendeling, kan de laatste toepassing de exclusieve vergrendeling krijgen en de eerste toepassing buitensluiten. Dit betekent dat lock-downgrades kunnen blokkeren, wat contra-intuïtief kan zijn.

Alle fcntl vergrendelingen die zijn gekoppeld aan een bestand voor een bepaald proces, worden verwijderd wanneer een bestandsdescriptor voor dat bestand door dat proces wordt gesloten, zelfs als er nooit een vergrendeling is aangevraagd voor die bestandsdescriptor. Ook worden fcntlsloten niet overgenomen door een onderliggend proces. De fcntlnauwe semantiek is vooral lastig voor toepassingen die subroutinebibliotheken aanroepen die toegang hebben tot bestanden. Geen van deze "bugs" treedt op bij gebruik van echte flockvergrendelingen.

Het behoud van de vergrendelingsstatus op open bestandsdescriptors die aan een ander proces worden doorgegeven met behulp van een Unix-domeinsocket, is afhankelijk van de implementatie.

Gebufferde I/O-problemen

Een bron van vergrendelingsfouten treedt op wanneer buffers voor gebufferde I/O zijn toegewezen in de lokale werkruimte van de gebruiker, in plaats van in een bufferpool van het besturingssysteem. freaden fwriteworden vaak gebruikt om gebufferde I/O uit te voeren, en zodra een sectie van een bestand is gelezen, zal een andere poging om diezelfde sectie te lezen, hoogstwaarschijnlijk de gegevens uit de lokale buffer verkrijgen. Het probleem is dat een andere gebruiker die aan hetzelfde bestand is gekoppeld, zijn eigen lokale buffers heeft en hetzelfde gebeurt voor hen. Een fwritevan gegevens uit de buffer van freadzal niet het verkrijgen van de gegevens uit het bestand zelf, en enkele andere gebruiker kan deze veranderd. Beide kunnen worden gebruikt flockvoor exclusieve toegang, wat gelijktijdig schrijven verhindert, maar aangezien de leesbewerkingen uit de buffer worden gelezen en niet uit het bestand zelf, kunnen alle gegevens die door gebruiker #1 zijn gewijzigd, verloren gaan door gebruiker #2 (overschreven). De beste oplossing voor dit probleem is het gebruik van niet-gebufferde I/O ( readen write) met flock, wat ook betekent in lseekplaats van fseeken ftell. Natuurlijk moet u aanpassingen maken voor functieparameters en geretourneerde resultaten. Over het algemeen is gebufferde I/O onveilig bij gebruik met gedeelde bestanden.

In AmigaOS

In AmigaOS kan een vergrendeling op een bestand (of map) worden verkregen met behulp van de Lockfunctie (in de dos.library). Een vergrendeling kan worden gedeeld (andere processen kunnen het bestand/de map lezen, maar kunnen deze niet wijzigen of verwijderen), of exclusief, zodat alleen het proces dat met succes de vergrendeling verkrijgt toegang heeft tot het object of het kan wijzigen. Het slot zit op het hele object en maakt er geen deel van uit. De vergrendeling moet worden ontgrendeld met de UnLockfunctie: in tegenstelling tot Unix ontgrendelt het besturingssysteem het object niet impliciet wanneer het proces wordt beëindigd.

Bestanden vergrendelen

Shell-scripts en andere programma's gebruiken vaak een strategie die vergelijkbaar is met het gebruik van bestandsvergrendeling: het maken van lock-bestanden , dit zijn bestanden waarvan de inhoud niet relevant is (hoewel men vaak de proces-ID van de houder van de lock in het bestand zal vinden) en waarvan het enige doel is om door hun aanwezigheid aan te geven dat een bron is vergrendeld. Een vergrendelingsbestand is vaak de beste aanpak als de te beheren bron helemaal geen gewoon bestand is, dus het gebruik van methoden voor het vergrendelen van bestanden is niet van toepassing. Een vergrendelingsbestand kan bijvoorbeeld de toegang tot een reeks gerelateerde bronnen regelen, zoals verschillende bestanden, mappen, een groep schijfpartities of geselecteerde toegang tot protocollen van een hoger niveau, zoals servers of databaseverbindingen.

Bij het gebruik van vergrendelingsbestanden moet ervoor worden gezorgd dat de bewerkingen atomair zijn . Om een ​​vergrendeling te verkrijgen, moet het proces verifiëren dat het vergrendelingsbestand niet bestaat en het vervolgens maken, terwijl wordt voorkomen dat een ander proces het in de tussentijd maakt. Verschillende methoden om dit te doen zijn onder meer:

  • Met behulp van de lockfileopdracht (een voorwaardelijke maker van een semafoorbestand dat in het procmailpakket wordt gedistribueerd ).
  • Systeemaanroepen die een bestand maken, maar mislukken als het bestand al bestaat. (Systeemaanroepen zijn beschikbaar in talen zoals C of C++, en shellscripts kunnen gebruik maken van noclobber )
  • De mkdiropdracht gebruiken en de afsluitcode controleren op fouten

Lock-bestanden krijgen vaak een naam met een tilde ( ~) voor de naam van het bestand dat ze vergrendelen, of een duplicaat van de volledige bestandsnaam met het achtervoegsel .LCK . Als ze een andere bron dan een bestand vergrendelen, kunnen ze willekeuriger worden genoemd.

Bepaalde Mozilla- producten (zoals Firefox , Thunderbird, Sunbird) gebruiken dit type vergrendelingsmechanisme voor bestandsbronnen (met een tijdelijk bestand met de naam "parent.lock".)

Unlocker-software

Een unlocker is een hulpprogramma dat wordt gebruikt om te bepalen welk proces een bestand vergrendelt, en geeft een lijst met processen weer, evenals keuzes over wat te doen met het proces (kill-taak, ontgrendelen, enz.) samen met een lijst met bestandsopties zoals zoals verwijderen of hernoemen. Op sommige Unix-achtige systemen kunnen hulpprogramma's zoals fstaten lockfworden gebruikt om de status van bestandsvergrendelingen per proces, per bestandsnaam of beide te inspecteren.

Als een bestand op Windows-systemen is vergrendeld, is het mogelijk om het verplaatsen of verwijderen ervan in te plannen bij de volgende herstart. Deze aanpak wordt meestal gebruikt door installatieprogramma's om vergrendelde systeembestanden te vervangen.

Versiecontrolesystemen

In versiebeheersystemen wordt bestandsvergrendeling gebruikt om te voorkomen dat twee gebruikers dezelfde bestandsversie parallel wijzigen en dat de tweede gebruiker bij het opslaan overschrijft wat de eerste gebruiker heeft gewijzigd. Dit wordt geïmplementeerd door vergrendelde bestanden te markeren als alleen-lezen in het bestandssysteem. Een gebruiker die het bestand wil wijzigen, voert een ontgrendelingsbewerking (ook wel uitcheckbewerking genoemd) uit, en totdat een incheckbewerking (opslaan) is voltooid of de vergrendeling wordt teruggedraaid, mag niemand anders het bestand ontgrendelen.

Zie ook

Referenties

Externe links