Wat is Page fault?

Exception die de CPU veroorzaakt wanneer de benaderde pagina niet aan fysiek geheugen is toegewezen of er een niet toegestane soort toegang plaatsvindt. Het besturingssysteem maakt de pagina beschikbaar en voert de instructie opnieuw uit, of behandelt het als een ongeldige toegang.

Japanse benaming: ページフォルト

“Page fault” komt voor in 1 oefenvragen uit 1 onderwerpen, bijv. Linker, loader en uitvoerbare formaten.

Vakgebied: Besturingssysteem en hardware

Wat er gebeurt bij een page fault

Wanneer de memory management unit (MMU) een virtueel adres vertaalt, controleert ze de paginatabelentry. Als de entry niet geldig is of het type toegang niet is toegestaan, genereert de MMU een page fault, een synchrone exceptie die aan de veroorzakende instructie is gekoppeld. De handler van het besturingssysteem controleert of het adres behoort tot een gebied dat het proces mag gebruiken. Zo ja, dan zoekt hij een vrij fysiek frame, waarbij zo nodig een andere pagina wordt verdrongen, vult het vanaf schijf of met nullen, markeert de entry als geldig en start de veroorzakende instructie opnieuw. Zo nee, dan krijgt het proces een segmentation fault.

Minor versus major faults

Niet elke page fault raakt de schijf. Een minor (soft) fault wordt zonder I/O opgelost, bijvoorbeeld wanneer een pagina al in het geheugen staat in de bestandscache, alleen een nieuw met nullen gevuld frame nodig heeft, of voor copy-on-write moet worden gekopieerd. Een major (hard) fault moet de pagina uit de opslag lezen en kost milliseconden. Het verschil is enorm: met een geheugentoegang van 100 ns en een afhandeltijd van 8 ms per fault verhoogt een major-faultfrequentie van slechts één per miljoen toegangen de gemiddelde toegangstijd van 100 ns tot ongeveer 108 ns.

Page faults die bewust worden gebruikt

Besturingssystemen gebruiken faults als middel voor lazy evaluation. Demand paging beeldt een programma af zonder het te laden en laadt dan elke pagina bij de eerste aanraking. Memory-mapped files (mmap) lezen de inhoud van bestanden op dezelfde manier in. Copy-on-write laat fork pagina's alleen-lezen delen en kopieert alleen de pagina's waarnaar later wordt geschreven. Guard pages zonder toegangsrechten liggen voorbij de stack, zodat op hol geslagen recursie een fault oplevert in plaats van data te beschadigen. Op NUMA-systemen plaatst Linux een pagina op de node van de thread die er als eerste naar schrijft, dus de volgorde van initialisatie beïnvloedt de prestaties.

Page fault versus TLB-miss versus cache-miss

Deze drie worden vaak verward. Een cache-miss wordt volledig door hardware afgehandeld, die de cachelijn uit een lager geheugenniveau ophaalt. Een TLB-miss betekent dat de vertaling niet in de translation lookaside buffer staat; op de meeste moderne CPU's haalt een hardwarematige page-table walker die op, en als de entry geldig is, treedt er geen exceptie op. Alleen wanneer de paginatabelentry zelf ongeldig is of de toegang verbiedt, bereikt een page fault het besturingssysteem. Wanneer faults zo vaak voorkomen dat het systeem het grootste deel van de tijd met pagen bezig is, heet die toestand thrashing.

Nu oefenen: vragen over Page fault

Wat gebeurt er in het algemeen op Linux en dergelijke als recursie te diep wordt en de bovengrens van de stack wordt overschreden?

  1. AEr wordt een guard page aangeraakt waarvan de toegang is verboden en die voorbij de stack ligt, en het programma eindigt abnormaal
  2. BHet OS verplaatst de stack automatisch naar schijf en er kan onbeperkt diep worden gerecurseerd
  3. COude stackframes worden automatisch gewist en de berekening gaat correct verder
Antwoord en toelichting tonen

Antwoord: A. Er wordt een guard page aangeraakt waarvan de toegang is verboden en die voorbij de stack ligt, en het programma eindigt abnormaal

De stack heeft een bovengrens en daarachter ligt een guard page waarvan de toegang is verboden. Als de stack door te diepe recursie deze bereikt, treedt een page fault op en stopt het OS het programma (segmentation fault). Het voordeel van de guard page is dat kan worden gestopt voordat andere data worden beschadigd. Hetzelfde gebeurt als een grote array als lokale variabele wordt gebruikt, dus grote data worden veiliger op de heap geplaatst.

Veelgestelde vragen

Is een page fault een fout?

Niet per se. De meeste page faults zijn normale gebeurtenissen die worden gebruikt voor demand paging, copy-on-write en memory-mapped files; alleen een fault op een adres dat het proces niet mag benaderen, wordt een fout zoals een segmentation fault.

Wat is het verschil tussen een minor en een major page fault?

Een minor fault wordt opgelost zonder schijf-I/O, bijvoorbeeld door een pagina af te beelden die al in het geheugen staat, terwijl een major fault de pagina uit de opslag moet lezen en duizenden keren trager is.

Waarom start een page fault de instructie opnieuw in plaats van die over te slaan?

De veroorzakende toegang is nooit voltooid, dus het besturingssysteem herstelt de afbeelding en voert de instructie opnieuw vanaf het begin uit, zodat het programma verdergaat alsof er niets is gebeurd.

“Page fault” in de toelichting

Vragen met “Page fault” (1)

  1. Wat gebeurt er in het algemeen op Linux en dergelijke als recursie te diep wordt en de bovengrens van de stack wordt overschreden?

Verwante termen

Heap Apparaatstuurprogramma (device driver) ASID (address space identifier) Bevoorrechte modus (privileged mode) Contextwissel (context switch) Copy-on-write Demand paging Geneste paginering (nested paging) Hypervisor Interrupt handler

Naar de woordenlijst