Adresruimten en adresvertaling

Leer hoe een besturingssysteem elk actief programma zijn eigen afgeschermde, beschermde geheugen geeft. Begin met de adresruimte die een programma ziet en de doelen van geheugenvirtualisatie. Volg daarna geheugenaanvragen op de heap van malloc en free tot aan de achterliggende systeemaanroepen. Vertaal stap voor stap adressen met basis- en grensregisters en met segmentatie. Ontdek hoe beheerders van vrije ruimte aanvragen van verschillende grootte plaatsen, van het eerste passende blok tot buddyallocatie, en daarbij interne en externe fragmentatie beperken.

GemiddeldLes 3 van 9 in Cursus Besturingssystemen: processen, geheugen, threads en bestandssystemen

Wat je leert

  1. Beschrijf de adresruimte die een actief programma ziet, waarom het besturingssysteem geheugen virtualiseert en aan welke doelen elke methode voor geheugenvirtualisatie moet voldoen.
    • Beschrijf een adresruimte en de indeling ervan
      Leg uit wat een adresruimte is, hoe code, heap en stack daarin zijn ingedeeld en hoe virtuele adressen verschillen van fysieke adressen.
    • Beoordeel geheugenvirtualisatie aan de hand van de doelstellingen
      Beoordeel een methode voor geheugenvirtualisatie op transparantie, efficiëntie en bescherming en onderscheid het hardwaremechanisme van het beleid van het besturingssysteem.
  2. Onderscheid stack- en heapgeheugen, vraag heapgeheugen aan en geef het vrij met de standaardaanroepen, herken de fouten die daarbij kunnen ontstaan en leg uit waar het achterliggende geheugen vandaan komt.
    • Wijs geheugen toe en geef het vrij met de geheugen-API
      Onderscheid automatisch stackgeheugen van heapgeheugen, gebruik malloc en free in grote lijnen correct en herken de belangrijkste soorten geheugenfouten.
    • Leg uit hoe de geheugenallocator geheugen van het besturingssysteem krijgt
      Onderscheid de taak van het besturingssysteem om de adresruimte van een proces te beheren van de taak van de bibliotheek om de heap te beheren, en beschrijf de systeemaanroepen die geheugen laten groeien en krimpen.
  3. Leg uit hoe dynamische relocatie met hardware elk virtueel adres omzet in een fysiek adres, wat hardware en besturingssysteem elk bijdragen en waar de aanpak tekortschiet.
    • Vertaal virtuele adressen met basis- en grensregisters
      Pas dynamische relocatie toe door de basis bij elk virtueel adres op te tellen en het adres aan de grens te toetsen, en vergelijk dit met statische relocatie.
    • Verdeel het werk tussen hardware en het besturingssysteem
      Noem wat de hardware moet bieden en wat het besturingssysteem moet doen bij het aanmaken van processen, contextwisselingen, excepties en beëindiging om een basis en een grens te laten werken.
    • Beoordeel adresvertaling met een basis en een grens
      Weeg de snelheid en bescherming van een basis en een grens af tegen het geheugen dat deze methode verspilt, en leg uit waarom dit tot segmentatie leidt.
  4. Geef elk logisch segment van een adresruimte zijn eigen basis en grens, vertaal en controleer adressen met segmentregisters en beoordeel wat segmentatie van het besturingssysteem vraagt.
    • Vertaal adressen per segment
      Plaats code, heap en stack onafhankelijk van elkaar in het fysieke geheugen en vertaal een adres door de offset binnen het segment te berekenen.
    • Bepaal naar welk segment een adres verwijst
      Bepaal het segment aan de hand van de hoogste bits van een virtueel adres of van de manier waarop het adres is gevormd en bereken de offset binair.
    • Verwerk de stack, bescherming en gedeeld geheugengebruik
      Vertaal stackadressen met een negatieve offset, gebruik beschermingsbits per segment en leg uit hoe processen code veilig delen.
    • Ondersteun en beoordeel segmentatie
      Beschrijf wat het besturingssysteem voor segmentatie moet doen, vergelijk grof- en fijnmazige segmentatie en leg uit hoe externe fragmentatie de methode beperkt.
  5. Leg uit hoe een beheerder van vrije ruimte vrij geheugen bijhoudt en aanvragen van verschillende grootte afhandelt, vergelijk plaatsingsstrategieën en redeneer over interne en externe fragmentatie.
    • Onderscheid interne en externe fragmentatie
      Definieer de twee soorten fragmentatie, herken ze in voorbeelden en leg uit waarom een heapallocator het geheugen niet kan comprimeren.
    • Houd vrije ruimte bij met een vrijelijst
      Splits vrije blokken op en voeg ze samen, gebruik headers om geheugen zonder een grootte vrij te geven en bouw de vrijelijst in het vrije geheugen zelf op.
    • Vergelijk plaatsingsstrategieën
      Pas het kleinst, grootst, eerste en volgende passende blok toe op een vrijelijst en weeg hun snelheid af tegen de fragmentatie die ze veroorzaken.
    • Gebruik gescheiden vrijelijsten, slaballocatie en buddyallocatie
      Leg uit hoe lijsten per grootte, objectcaches en buddyblokken met een macht van twee als grootte de toewijzing versnellen, en bereken de verspilling en het samenvoegen bij buddyallocatie.

Adresruimten en adresvertaling: uitleg

5 hoofdstukken

1

Een eigen geheugenbeeld voor elk proces

Een pointer hoort bij het proces dat die gebruikt. De getalswaarde alleen duidt geen fysieke geheugencel aan. Dankzij adresruimten kunnen meerdere programma's in het geheugen blijven terwijl elk programma met zijn eigen beeld van code en data werkt. Het besturingssysteem en de processor moeten dat beeld behouden, toegang snel vertalen en voorkomen dat het ene programma het andere beschadigt. Deze doelen verklaren zowel de indeling die een programma ziet als de werking daarachter, die verborgen blijft.

1.1 Het geheugen dat een proces ziet

Een actief programma werkt met een adresruimte: zijn eigen beeld van het geheugen, met genummerde bytelocaties. Het besturingssysteem plaatst het geheugen van het programma in de machine en zorgt dat de adressen de juiste fysieke bytes bereiken. De indeling die het programma ziet en de indeling in de hardware zijn verschillende zaken.

Waarom meerdere programma's in het geheugen blijven

Vroege systemen konden één programma naast het besturingssysteem houden. Het besturingssysteem kon bijvoorbeeld de eerste 64 KB innemen en het programma de rest van het geheugen. Met multiprogrammering stonden meerdere processen klaar, zodat de CPU kon werken terwijl een ander proces op invoer of uitvoer wachtte. Bij tijdsverdeling wisselde de CPU vaak genoeg tussen processen om interactieve gebruikers te bedienen.

Het volledige geheugen van een proces bij elke wisseling op schijf opslaan zou het wisselen veel te traag maken. Door meerdere processen in fysiek geheugen te houden is dat kopiëren niet nodig, maar ontstaat een beschermingsprobleem. Een adres dat door een proces wordt gevormd, mag het proces niet in staat stellen het besturingssysteem of een ander proces te overschrijven.

Geheugengroottes volgen hier de binaire conventie die in deze modellen wordt gebruikt: 1 KB is 1.024 bytes, ook geschreven als 1 KiB; 1 MB is 1.024 KB. Een adresruimte van 16 KB heeft 16.384 bytelocaties, genummerd van 0 tot en met 16.383. Het getal 16.384 is de eindgrens, geen geldig byteadres.

Code, data, heap en stack
GebiedInhoudGebruik
CodeMachine-instructiesDe CPU haalt hier instructies op.
Statische dataGlobale en statische lokale variabelenDe opslag blijft tijdens de uitvoering van het programma bestaan.
HeapBlokken die tijdens de uitvoering worden aangevraagdHet programma vraagt blokken aan en geeft ze vrij.
StackToestand van functieaanroepen en gewone lokale variabelenAanroepen maken stackframes aan; bij terugkeer komen die vrij.

In een klassieke onderwijsindeling van 16 KB gebruikt code de lage adressen, van 0 tot aan de grens van 1 KB. De heap begint boven de code en groeit omhoog. De stack begint bij de bovengrens en groeit omlaag. De vrije ruimte ertussen geeft beide gebieden ruimte om te groeien. Werkelijke indelingen verschillen; elke thread heeft bijvoorbeeld een eigen stack. De functies van de gebieden blijven ook nuttig als hun posities veranderen.

Volg een pointer naar het juiste geheugen

Een virtueel adres duidt een byte in de adresruimte van een proces aan. Een fysiek adres duidt een byte in de geheugenhardware van de machine aan. Wanneer C-code printf("%p", (void *) &x) afdrukt, wordt een virtueel adres afgedrukt. De afgedrukte pointer onthult niet welke fysieke byte x opslaat.

Stel dat twee processen allebei virtueel adres 1.000 gebruiken. Elk adres wordt geïnterpreteerd binnen de eigen adresruimte van het proces, zodat de toegangen verschillende fysieke bytes kunnen bereiken. Ook hoeft code op virtueel adres 0 niet op fysiek adres 0 te staan. Het besturingssysteem kan die elders plaatsen en hardwarevertaling instellen om die te bereiken.

De processor vertaalt het ophalen van instructies en lees- en schrijfbewerkingen. Het besturingssysteem kiest en beheert de koppelingen en kan daarbij fysieke locaties veranderen terwijl de virtuele adressen van het programma gelijk blijven.

Belangrijkste punten

  • Een adresruimte is het geheugen zoals een proces dat ziet, niet de fysieke plaats ervan.
  • Code, statische data, heap en stack hebben verschillende opslagfuncties.
  • Virtuele adressen worden binnen een proces geïnterpreteerd; gelijke waarden kunnen verschillende fysieke bytes bereiken.
  • Een adresruimte van 16 KB heeft volgens de binaire KB-conventie bytes 0 tot en met 16.383.

1.2 Transparantie, efficiëntie en bescherming

Een geheugensysteem moet meer doen dan een getal correct vertalen. Het moet gewone programma's laten draaien zonder dat die de fysieke plaatsing beheren, de vertaling snel houden en de grenzen handhaven die delen veilig maken. Deze vereisten zijn transparantie, efficiëntie en bescherming.

Behoud het beeld van het programma

Transparantie betekent dat een programma draait alsof het eigen afgeschermd geheugen heeft. Het gebruikt zijn eigen adressen voor code en data zonder bij te houden welke andere processen aanwezig zijn of waar hun bytes liggen. Het besturingssysteem en de hardware behouden dit beeld achter de schermen. Als een proces in het fysieke geheugen wordt verplaatst, zou het zijn pointers niet hoeven te herschrijven.

Voor de illusie is geen afzonderlijke fysieke kopie van elke byte voor elk proces nodig. Beschermde alleen-lezen-code kan bijvoorbeeld worden gedeeld. Het gaat erom dat het delen het gedrag en de toegangsrechten behoudt waarop elk proces recht heeft.

Houd rekening met beide soorten kosten

Elke instructie die wordt opgehaald en elke lees- en schrijfbewerking vereist vertaling. Een routine van het besturingssysteem uitvoeren voor elke toegang zou de normale uitvoering te traag maken. Hardware voert de veelvoorkomende bewerkingen uit; code van het besturingssysteem verzorgt de instelling, wijzigingen en foutafhandeling.

Ruimte-efficiëntie is ook van belang. Een klein, snel vertaalmechanisme kan toch veel geheugen verspillen. Eén gebied met een basis en een grens reserveert de ongebruikte ruimte tussen heap en stack. Segmentatie voorkomt dat voor die ruimte fysiek geheugen nodig is, maar introduceert fysieke gebieden van verschillende grootte en gaten daartussen. Metadata, ongebruikte gereserveerde ruimte en gaten beïnvloeden allemaal hoeveel nuttig werk in het geheugen past.

DoelVraag
TransparantieBlijft het programma zijn eigen adressen gebruiken zonder de plaatsing te beheren?
TijdefficiëntieHoeveel werk voegt elke geheugentoegang toe?
Ruimte-efficiëntieHoeveel geheugen wordt gebruikt door metadata of onbruikbare ruimte?
BeschermingKan het proces alleen gebieden en bewerkingen gebruiken waarvoor het toestemming heeft?
Houd ongeldige toegang tegen bij de grens

Zonder bescherming zou een verdwaalde pointer in een teksteditor een ander proces of de kernel kunnen overschrijven. Schade kan dan veel later in niet-gerelateerde code zichtbaar worden. Als grenzen worden gehandhaafd, wijst de hardware toegang buiten het toegestane gebied af en veroorzaakt die een exceptie. Het besturingssysteem handelt de exceptie af en beëindigt meestal het proces met de fout, vaak met een melding van een segmentatiefout.

Bescherming isoleert processen van elkaar. Ze maakt geheugengebruik in C binnen een toegestaan heapgebied niet veilig. Een schrijfbewerking voorbij een toegewezen blok kan nog steeds een ander blok van hetzelfde proces raken. Procesgrenzen en grenzen van allocatorblokken zijn verschillende grenzen.

Scheid de bewerking van de keuze

Een mechanisme is de manier waarop een bewerking wordt uitgevoerd. De waarde van een basisregister optellen en een grensregister controleren zijn mechanismen. Beleid kiest tussen mogelijke acties: waar een proces wordt geplaatst, welk vrij gat wordt gebruikt of wanneer een segment wordt verplaatst.

Door deze twee te scheiden kan het besturingssysteem zijn plaatsingsstrategie wijzigen terwijl dezelfde hardwarevertaling behouden blijft. Geheugenvirtualisatie begint met dit eigen, beschermde geheugenbeeld; ze wordt niet gedefinieerd door de schijf als extra geheugen te gebruiken.

Belangrijkste punten

  • Transparantie behoudt het geheugenbeeld van het programma wanneer de fysieke plaatsing verandert.
  • Tijdefficiëntie is bij elke geheugentoegang van belang; ruimte-efficiëntie omvat ongebruikte gebieden en metadata.
  • Bescherming isoleert processen, maar handhaaft niet elke grens van een heapblok.
  • Mechanismen voeren bewerkingen uit; beleid kiest tussen alternatieven.
  • Hardware vertaalt gewone toegangen; het besturingssysteem beheert de vertaling en handelt fouten af.
2

Van C-toewijzingen naar gebieden van het besturingssysteem

Een heapaanvraag doorloopt twee lagen van geheugenbeheer. De C-bibliotheek vindt een blok voor het programma, terwijl het besturingssysteem de gebieden levert en beschermt waaruit blokken worden afgesplitst. Als je deze lagen volgt, begrijp je waarom een pointervariabele en het toegewezen geheugen verschillende levensduren hebben, waarom het geheugengebruik van een proces na vrijgave van een blok gelijk kan blijven en waarom succesvolle compilatie weinig zegt over de geldigheid van latere heaptoegangen.

2.1 Blokken aanvragen en rekening houden met hun levensduur

Een pointervariabele en het geheugen waarnaar die wijst, zijn afzonderlijke objecten. Inzicht in hun levensduur is het uitgangspunt voor de geheugen-API van C. Gewone lokale variabelen gebruiken doorgaans automatische stackopslag, heapblokken blijven bestaan totdat ze worden vrijgegeven en globale variabelen en lokale variabelen met static hebben opslag voor de hele uitvoering van het programma.

Volg de toewijzing, niet alleen de pointer
void f(void) {
    int x;
    int *p = malloc(sizeof(int));
}

In de gebruikelijke stackindeling horen x en p bij deze aanroep van f. Het aangevraagde gehele getal hoort bij de heap. Bij terugkeer verdwijnt de lokale pointervariabele; het heapblok wordt niet vrijgegeven. Als er geen kopie van het adres overblijft, heeft het programma de toegang tot nog toegewezen geheugen verloren: een geheugenlek.

malloc(size) vraagt minstens dat aantal bytes aan en geeft een pointer terug, of NULL als niet aan de aanvraag kan worden voldaan. De bytes worden niet voor het programma geïnitialiseerd. Gebruik voor 10 gehele getallen malloc(10 * sizeof(int)); waar een geheel getal 4 bytes groot is, vraagt dit 40 bytes aan. Reserveer voor een string ruimte voor de tekens plus één byte voor het afsluitende nullteken: malloc(strlen(s) + 1).

sizeof(a) meet het object met de naam a. Als a een pointer is, geeft het de grootte van de pointer, niet die van de toewijzing. Een pointer van 8 bytes kan naar een blok van 40 bytes verwijzen.

Weet wat elke bibliotheekbewerking doet
AanroepHoofddoel
mallocEen blok verkrijgen waarvan de bytes niet op nul zijn gezet.
callocEen blok verkrijgen dat met nulbytes is gevuld.
reallocDe grootte van een blok wijzigen en het eventueel verplaatsen.
freeEen toegewezen blok teruggeven aan de allocator.

free krijgt de teruggegeven pointer mee, zonder argument voor de grootte. De allocator bewaart metadata over de grootte, meestal in een header vóór het blok. Geef de teruggegeven pointer van een momenteel toegewezen blok door; een pointer naar een locatie binnen het blok is geen geldig alternatief. free(NULL) is geldig en doet niets. Deze functies zijn routines uit de C-bibliotheek, geen systeemaanroepen.

Herken de fout aan de levensduur of grens

Een pointer zonder geldige toewijzing kan niet worden gebruikt alsof die al naar opslag wijst. Nieuw toegewezen bytes lezen voordat ze zijn geïnitialiseerd, is lezen van niet-geïnitialiseerd geheugen. Voorbij het toegewezen einde schrijven is een bufferoverloop; die kan ontstaan als de byte voor het afsluitende nullteken van een string ontbreekt.

Na free zijn oude pointers naar het blok ongeldig. Toegang via zo'n pointer is gebruik na vrijgave (use-after-free). Het blok opnieuw vrijgeven is een dubbele vrijgave. Een adres vrijgeven dat de allocator niet voor een nog toegewezen blok heeft teruggegeven, is een ongeldige vrijgave. Een blok lekken is anders: het blok blijft toegewezen, maar het programma geeft het niet meer vrij wanneer dat zou moeten.

Begrijp wat de hardware kan controleren

Compilatie kan ondanks al deze fouten slagen. Hardware controleert normaal gesproken procesgebieden en toegangsrechten, niet elke bibliotheektoewijzing. Een blokgrens overschrijden terwijl je binnen de toegestane heap van het proces blijft, kan ongedefinieerd gedrag opleveren zonder directe foutmelding. Het programma kan gegevens beschadigen, later vastlopen, betekenisloze waarden lezen of lijken te werken. Valgrind en AddressSanitizer kunnen veel van zulke fouten tijdens de uitvoering detecteren.

Belangrijkste punten

  • De levensduur van een heapblok staat los van die van de pointervariabele.
  • Gebruik sizeof voor het opgeslagen type; sizeof op een pointer meet niet het blok waarnaar die wijst.
  • malloc, calloc, realloc en free zijn bibliotheekroutines.
  • Een toewijzing voor een string heeft ruimte nodig voor de afsluitende nulbyte.
  • free(NULL) doet niets; een pointer naar een locatie binnen een blok is geen geldige pointer naar een toegewezen blok.
  • Hardwarecontroles van gebieden kunnen geheugenfouten op blokniveau binnen de heap missen.

2.2 Hoe de allocator geheugen verkrijgt

De C-bibliotheek en het besturingssysteem beheren geheugen op verschillende niveaus. Het besturingssysteem legt gebieden in de adresruimte van een proces vast en voorziet die van fysiek geheugen. De allocator verdeelt beschikbaar heapgeheugen in blokken, registreert vrije blokken en gebruikt die opnieuw bij volgende aanroepen.

Verplaats de heapgrens

De heapgrens is het adres direct na het einde van de traditionele heap. brk stelt die grens in op een gekozen adres. sbrk(n) verplaatst de grens met een aantal bytes en geeft bij succes de oude grens terug. sbrk(0) geeft de huidige grens zonder die te verplaatsen.

Stel dat de heapgrens 40.960 is en de allocator sbrk(8192) met succes aanroept. De teruggegeven waarde is 40.960. De nieuwe grens is:

40.960+8.192=49.152

De toegevoegde bytes beslaan de virtuele adressen 40.960 tot en met 49.151. De nieuwe heapgrens, 49.152, ligt direct voorbij het toegevoegde gebied. Als je de teruggegeven waarde met de nieuwe grens verwart, verschuift elke latere plaatsingsberekening.

Toepassingen gebruiken de toewijzingsbibliotheek in plaats van de heapgrens rechtstreeks te verplaatsen. De bibliotheek houdt bij welke delen van het gebied haar toebehoren. Onafhankelijke wijzigingen van die grens kunnen de administratie ongeldig maken.

Verkrijg een afzonderlijke geheugenkoppeling

mmap kan een anoniem gebied aanmaken: geheugen dat niet aan een bestand is gekoppeld en aanvankelijk met nulbytes is gevuld. munmap verwijdert een geheugenkoppeling. Een allocator kan afzonderlijke geheugenkoppelingen voor grote toewijzingen gebruiken en die aan het besturingssysteem teruggeven wanneer ze worden vrijgegeven.

In glibc is de standaarddrempel voor deze aanpak aanvankelijk 128 KB, oftewel 131.072 bytes, en die kan naar boven worden aangepast. Een voldoende grote toewijzing krijgt doorgaans een afzonderlijke geheugenkoppeling als de aanvraag niet uit bestaande vrije ruimte kan worden voldaan. Dit is beleid van de bibliotheek, geen universele scheidslijn in de taal C.

Geef vrij op bibliotheekniveau of op het niveau van het besturingssysteem
GebeurtenisWat verandert
Een klein herbruikbaar blok vrijgevenDe allocator kan er een andere aanvraag mee afhandelen.
Een afzonderlijke geheugenkoppeling verwijderenHet proces beschikt niet meer over dat gekoppelde gebied.
Het proces beëindigenHet besturingssysteem neemt het geheugen van het proces terug.

Een aanroep van free plaatst een klein blok meestal terug in de voorraad van de bibliotheek. Het proces kan daarna dus hetzelfde geheugengebruik melden. Het geheugen is beschikbaar voor hergebruik zonder een nieuwe aanvraag aan het besturingssysteem.

Bij beëindiging van een proces worden zelfs toewijzingen teruggenomen die het programma heeft gelekt. Tijdens de levensduur van een langdurig actieve server blijven herhaalde lekken echter het beschikbare geheugen verbruiken. Terugname bij beëindiging voorkomt die druk tijdens de uitvoering niet.

Verbind heapgroei met vertaling

In het segmentatiemodel is de heap een aaneengesloten fysiek segment. Om te groeien zijn direct erboven vrije fysieke bytes nodig. Als die bytes bezet zijn, kan het besturingssysteem het segment naar een groter gat verplaatsen en de vertaaltoestand bijwerken. Als geen geschikt gebied beschikbaar is, mislukt de groei. Als de allocator niet genoeg ruimte kan verkrijgen, geeft malloc NULL terug.

Belangrijkste punten

  • Het besturingssysteem levert gebieden; de bibliotheek verdeelt die in blokken.
  • Een succesvolle sbrk geeft de oude heapgrens terug, niet de nieuwe.
  • Een anonieme mmap verkrijgt een afzonderlijk met nullen gevuld gebied; munmap verwijdert het.
  • Een blok vrijgeven maakt hergebruik meestal mogelijk zonder de toewijzing van het besturingssysteem aan het proces te verkleinen.
  • Een gesegmenteerde heap heeft aaneengesloten fysieke ruimte nodig om te groeien.
3

Vertaling met een basis en een grens

Met een basis en een grens wordt een adres ten opzichte van een proces met één vergelijking en één optelling omgezet in een fysiek adres. Door de eenvoud is de taakverdeling goed te zien: hardware controleert elke toegang, terwijl het besturingssysteem een plaats kiest, bij het wisselen van processen de vertaaltoestand herstelt en fouten afhandelt. Als je een proces door deze gebeurtenissen volgt, zie je ook de belangrijkste kosten: zelfs ongebruikte adressen tussen heap en stack nemen een deel van de fysieke plaats in.

3.1 Een adres controleren en vertalen

Dynamische relocatie vertaalt adressen terwijl een programma draait. In het model met een basis en een grens neemt één proces één aaneengesloten fysiek gebied in. Begin met even grote adresruimten die in het fysieke geheugen passen; één registerpaar beschrijft dan het gebied van het proces dat op dat moment draait.

Controleer eerst het virtuele adres

Het basisregister bevat het fysieke adres van de eerste byte van het gebied. Het grensregister, of limietregister, bevat de grootte van het gebied in bytes. Voor een niet-negatief virtueel adres geldt:

0≤virtueel adres<grens

Als de controle slaagt:

fysiek adres=basis+virtueel adres

Anders veroorzaakt de hardware een exceptie. Een grootte is een aantal, dus het adres dat gelijk is aan de grens ligt al buiten het gebied. Negatieve virtuele adressen zijn ook ongeldig.

Doorloop de bytegrenzen

Neem een adresruimte van 8 KB met basis 20.480 en grens 8.192. De virtuele bytes lopen van 0 tot en met 8.191. Virtueel adres 1.000 komt door de controle en bereikt fysieke byte 21.480. De laatste toegestane virtuele byte, 8.191, bereikt 28.671. Adres 9.000 komt niet door de controle omdat het minstens 8.192 is; de hardware moet het afwijzen voordat de fysieke toegang plaatsvindt.

Het ophalen van instructies gebruikt dezelfde vertaling als data. Als een instructie op virtueel adres 128 vanaf virtueel adres 3.000 laadt, bereikt het ophalen fysiek adres 20.608 en het laden 23.480. Dit zijn twee geheugentoegangen met twee vertaalde adressen, niet één gedeelde vertaling voor de hele instructie.

Houd de grensconventies uit elkaar
Grensregister bevatWat wordt vergeleken
Grootte van het gebiedHet virtuele adres moet kleiner zijn dan de grootte.
Fysieke eindgrensHet vertaalde adres moet onder die grens liggen.

Hetzelfde gebied van 8 KB heeft fysieke eindgrens 28.672. Beide conventies staan precies de bytes 20.480 tot en met 28.671 toe. Als je fysiek adres 21.480 met grootte 8.192 vergelijkt, haal je de twee conventies door elkaar en wijs je een toegestane toegang ten onrechte af.

Verplaats geheugen zonder pointers te veranderen

De MMU, of geheugenbeheereenheid, voert de controles en de optelling uit. Het besturingssysteem kan een proces onderbreken, zijn gebied naar een andere plaats kopiëren en de basis wijzigen. Het proces blijft dezelfde virtuele adressen gebruiken; daarom is de relocatie dynamisch.

Bij statische relocatie herschrijft een laadprogramma daarentegen de opgenomen adressen bij het laden van code. Een verwijzing van 1.000 naar 21.480 herschrijven legt een fysieke plaatsing vast in het programma. Als je het later verplaatst, moet je opnieuw adressen herschrijven, en herschrijven alleen voorkomt niet dat een programma een adres buiten zijn gebied vormt.

Tel een basis alleen op bij een virtueel adres. Als je die optelt bij een al vertaald fysiek adres, verschuif je de locatie een tweede keer en gaat de koppeling verloren.

Belangrijkste punten

  • Controleer bij een grens die de grootte aangeeft het virtuele adres voordat je de basis optelt.
  • Het toegestane bereik bevat niet het adres dat gelijk is aan de grens.
  • Zowel het ophalen van instructies als toegang tot data wordt vertaald.
  • Een fysieke eindgrens en een grens als grootte in bytes vereisen verschillende vergelijkingen.
  • Dynamische relocatie verandert de plaatsing zonder virtuele pointers te herschrijven.

3.2 Vertaaltoestand instellen en wisselen

De hardware bevat vertaalregisters voor het proces dat op een CPU draait. Het besturingssysteem bewaart de opgeslagen toestand van processen die wachten. Voor bescherming is het nodig dat alleen geprivilegieerde code van het besturingssysteem die toestand kan wijzigen.

Zorg voor de hardwarebewerkingen

De CPU heeft gebruikers- en kernelmodus nodig, een basis-grenspaar in de MMU en schakelingen voor de controle en optelling. Ook zijn geprivilegieerde bewerkingen nodig om het paar te wijzigen en exceptieafhandelaars te installeren. Ongeldige adressen en pogingen om in gebruikersmodus geprivilegieerde instructies uit te voeren moeten excepties veroorzaken.

Als een gebruikersprogramma zijn basis kon wijzigen, zou het zijn adressen naar de kernel of een ander proces kunnen omleiden. Grenscontroles zouden dan het verkeerde gebied beschermen. Het beperken van wijzigingen maakt daarom deel uit van het beschermingsmechanisme en is niet alleen een administratief hulpmiddel.

Maak een proces aan en voer het uit

Bij het opstarten installeert het besturingssysteem zijn trap- en exceptieafhandelaars, start het de interrupttimer en bereidt het de registratie van vrij geheugen voor. Wanneer een proces start, zoekt het besturingssysteem een fysieke plaats voor de adresruimte. Bij even grote plaatsen kan een vrijelijst eenvoudig bijhouden welke plaatsen ongebruikt zijn.

Het besturingssysteem markeert de gekozen plaats als bezet, legt de basis en grens van het proces vast, laadt de registers en gaat naar gebruikersmodus. Het proces draait daarna rechtstreeks op de CPU. Hardware vertaalt gewone toegangen zonder voor elke byte het besturingssysteem aan te roepen.

Herstel het juiste paar bij een contextwisseling

Een timerinterrupt draagt de besturing over aan het besturingssysteem. Dat slaat de registers van het oude proces, inclusief basis en grens, op in het procesbesturingsblok en herstelt daarna de waarden van het volgende proces voordat het terugkeert naar gebruikersmodus.

Stel dat de basis van A 20.480 is en die van B 40.960, beide met grens 8.192. Het virtuele adres 1.000 van A bereikt 21.480. Na de wisseling naar B bereikt hetzelfde virtuele getal 41.960. Als de CPU-registers worden hersteld zonder de vertaaltoestand te herstellen, zou B met zijn pointers toegang krijgen tot het gebied van A.

De CPU bevat het actieve paar; elk proces heeft zijn eigen opgeslagen paar. Stel je dus niet één permanent paar voor de hele machine voor en neem niet aan dat de paren van alle processen tegelijk op één CPU actief zijn.

Verplaatsen, fouten afhandelen en beëindigen

Om A naar fysiek adres 49.152 te verplaatsen haalt het besturingssysteem A van de CPU, kopieert het zijn gebied van 8 KB en werkt het de opgeslagen basis van A bij. Zodra A verdergaat met die basis ingesteld, bereikt virtueel adres 1.000 het adres 50.152. De virtuele pointerwaarden hoeven niet te worden aangepast.

Bij ongeldige toegang veroorzaakt de hardware een exceptie en draagt die de uitvoering in kernelmodus over aan de geregistreerde afhandelaar. Het besturingssysteem beëindigt meestal het proces dat de fout veroorzaakte. Bij beëindiging geeft het de plaats terug aan de vrijelijst en geeft het de procesregistratie vrij.

Belangrijkste punten

  • Alleen geprivilegieerde code kan vertaalregisters wijzigen.
  • De CPU bevat de actieve toestand; procesbesturingsblokken bevatten de opgeslagen toestand.
  • Bij een contextwisseling moeten basis en grens samen met de andere registers worden hersteld.
  • Voor relocatie moet het proces worden onderbroken, het geheugen worden gekopieerd en de opgeslagen basis worden bijgewerkt.
  • Hardware veroorzaakt excepties bij ongeldige toegang; het besturingssysteem handelt die af.
  • Bij beëindiging keert de fysieke plaats terug naar de vrijelijst.

3.3 Waarom een eenvoudige plaats geheugen verspilt

De methode met een basis en een grens bereikt twee doelen tegen lage kosten: de vertaling is transparant en elk adres wordt aan het toegewezen gebied getoetst. De belangrijkste zwakte is de verhouding tussen dat gebied en de bytes die het proces daadwerkelijk gebruikt.

Reserveer het hele bereik

De hardware heeft voor de veelvoorkomende bewerking alleen een optelling en een vergelijking nodig. Een allocator met plaatsen van vaste grootte kan ook snel een vrije plaats kiezen. Geen van beide voordelen betekent dat de plaats vol nuttige data staat.

In de klassieke indeling staan code en heap dicht bij het ene uiteinde en de stack dicht bij het andere. Eén basis-grenspaar vertaalt het hele interval. De ongebruikte ruimte tussen heap en stack neemt net als de nuttige delen fysiek geheugen in.

Voor een adresruimte van 16 KB die 1 KB code, 2 KB heap en 1 KB stack gebruikt:

gebruikt=1+2+1=4 KB ongebruikt=16−4=12 KB ongebruikt aandeel=1216=75%

De verspilling is interne fragmentatie: ongebruikte bytes binnen een gebied dat al aan een proces is toegewezen. Ze ontstaat niet doordat de heapallocator een slecht blok kiest. Zelfs bij een volledig benutte heap van 2 KB blijft het grote gat in het midden gereserveerd.

Onderscheid drie vragen over grootte

De omvang van de adresruimte, de bytes die momenteel worden gebruikt en het beschikbare fysieke geheugen zijn verschillende grootheden. Een 32-bitsadresruimte met byteadressering omvat 232 bytes, oftewel 4 GB. Om die als één fysiek blok te reserveren is de volledige 4 GB nodig, ook als het proces momenteel maar enkele megabytes gebruikt.

BeperkingGevolg
Eén aaneengesloten gebiedAfzonderlijke vrije gaten kunnen niet samen één procesgebied bevatten.
Even grote plaatsenKleine processen verspillen ruimte; grotere passen mogelijk niet.
Een dunbezette adresruimteOngebruikte virtuele gaten verbruiken nog steeds gereserveerd fysiek geheugen.

Plaatsen van verschillende grootte maken neemt de beperking van gelijke grootte weg, maar niet de noodzaak van een aaneengesloten gat. Het levert ook een plaatsingsprobleem op: het besturingssysteem moet kiezen tussen vrije gaten van verschillende grootte. Eén plaats verkleinen kan niet zowel lage codeadressen als een verafgelegen hoog stackadres behouden als het hele bereik binnen dezelfde eenvoudige koppeling geldig moet blijven.

Reloceer de gebieden afzonderlijk

Code, heap en stack hoeven niet naast elkaar in het fysieke geheugen te staan om het geheugenbeeld van het programma te behouden. Door elk gebied een eigen basis en grens te geven kan het besturingssysteem alleen de gebruikte delen toewijzen en het virtuele gat zonder fysiek geheugen laten. Dit is segmentatie, de uitbreiding van één relocatiepaar naar meerdere logische gebieden.

Voor de indeling van 16 KB hierboven hebben de drie gebruikte gebieden samen slechts 4 KB nodig, afgezien van hun eigen beheeroverhead. De ruimtebesparing ontstaat doordat verandert wat als één eenheid wordt gereloceerd, niet doordat de optelling met het basisregister sneller wordt.

Belangrijkste punten

  • Het hele virtuele bereik neemt een aaneengesloten fysieke plaats in.
  • Ongebruikte ruimte binnen die plaats is interne fragmentatie.
  • Even grote plaatsen beperken grote processen en verspillen ruimte voor kleine processen.
  • Segmentatie bespaart ruimte door gebruikte gebieden onafhankelijk van elkaar te reloceren.
4

Vertaling met afzonderlijke segmenten

Eén vertaalpaar reserveert de gaten binnen een adresruimte. Segmentatie geeft code, heap en stack een onafhankelijke fysieke plaats, zodat alleen hun huidige omvang fysiek geheugen nodig heeft. Bij het vertalen van een adres moet nu het segment en de offset worden bepaald, met een extra tekenwisseling voor de naar beneden groeiende stack. De flexibiliteit die zo ontstaat ondersteunt bescherming en het delen van code, terwijl het besturingssysteem aaneengesloten gaten voor gebieden van verschillende grootte moet vinden.

4.1 Elk gebied zijn eigen vertaling geven

Een segment is een aaneengesloten gebied van een adresruimte met één doel. In het klassieke model krijgen code, heap en stack elk een eigen basis en grootte. Hun fysieke gebieden kunnen onafhankelijk van elkaar worden geplaatst, terwijl het proces zijn vertrouwde virtuele indeling behoudt.

Koppel alleen de gebruikte delen

Gebruik een adresruimte van 16 KB met de volgende plaatsing. De groottes gebruiken binaire KB, oftewel KiB.

SegmentVirtueel bereikFysieke basis of bovengrensGrootte
Code0 tot en met 2.047Basis 40.9602.048 bytes
Heap4.096 tot en met 7.167Basis 26.6243.072 bytes
Stack14.336 tot en met 16.383Bovengrens 53.2482.048 bytes

Code en heap groeien naar hogere adressen; de vertaling van de stack gebruikt de bovengrens en een negatieve offset. De drie fysieke gebieden gebruiken samen slechts 7 KB. Voor de virtuele gaten ertussen is geen fysieke opslag nodig. Een segment blijft aaneengesloten; alleen de segmenten hoeven niet meer naast elkaar te liggen.

Vertaal een segment dat omhoog groeit

Bepaal eerst het segment. Bereken vervolgens de offset vanaf het virtuele begin. Controleer of de offset niet-negatief en kleiner dan de huidige grootte is en tel die dan op bij de fysieke basis:

offset=virtueel adres−virtueel begin van segment fysiek adres=segmentbasis+offset

Voor virtueel adres 500 is de codeoffset 500. Die is kleiner dan 2.048, dus de toegang bereikt fysiek adres 41.460.

Voor virtueel adres 5.000 is de heapoffset:

5.000−4.096=904

De groottecontrole slaagt omdat 904 kleiner is dan 3.072. Het resultaat is:

26.624+904=27.528

Als je het volledige virtuele adres bij de heapbasis optelt, krijg je 31.624. Daarmee neem je ten onrechte de virtuele beginpositie van de heap mee in een berekening die alleen de afstand binnen het segment nodig heeft.

Controleer het segment, niet alleen de omvang van de adresruimte

Virtueel adres 7.500 past nog steeds in 14 bits, maar is daarom niet automatisch toegestaan. De heapoffset is 3.404 en ligt daarmee buiten de huidige omvang van 3.072 bytes. De hardware veroorzaakt een exceptie. Een adres kan dus binnen het totale bereik van de adresruimte liggen en toch buiten elk geldig gebied vallen.

De term segmentatiefout ontstond voor ongeldige toegang bij segmentatie en wordt nog steeds gebruikt voor ongeldige toegang op systemen met andere vertaalmethoden. De foutnaam alleen geeft niet aan welk vertaalmechanisme de machine gebruikt.

Belangrijkste punten

  • Elk segment heeft zijn eigen basis en grootte.
  • De offset van een segment dat omhoog groeit, wordt gemeten vanaf het virtuele begin van dat segment.
  • Tel alleen de gecontroleerde offset op bij de fysieke basis.
  • Een adres binnen het totale virtuele bereik kan toch een fout veroorzaken.
  • Ongebruikte virtuele gaten tussen segmenten hebben geen fysiek geheugen nodig.

4.2 Het segment kiezen en de offset bepalen

Voordat hardware de basis en grootte van een segment kan gebruiken, moet die bepalen naar welk segment een toegang verwijst. Een expliciet ontwerp legt die keuze vast in adresbits. Een impliciet ontwerp leidt de keuze af uit de manier waarop de CPU het adres heeft gevormd.

Splits een 14-bitsadres

Gebruik de hoogste twee bits voor het segmentnummer en de laagste twaalf bits voor de offset. Het veld van twee bits heeft vier mogelijke waarden. Gebruik 00 voor code, 01 voor heap en 11 voor stack; laat 10 ongebruikt.

Het offsetveld kan 4.096 verschillende waarden voorstellen, van 0 tot en met 4.095. Het maximale virtuele bereik van elk segment is daarom 4 KB, ook als de huidige geldige omvang van het segment kleiner is. Maximale capaciteit en huidige grootte zijn verschillende grenzen.

Voor virtueel adres 5.000 is de 14-bitsweergave:

01 0011 1000 1000

De voorste 01 kiest de heap. De resterende 0011 1000 1000 is decimaal 904. Bij een heapgrootte van 3.072 en fysieke basis 26.624 komt de offset door de groottecontrole en wordt fysiek adres 27.528 bereikt.

Gebruik een masker en een verschuiving

Dezelfde splitsing kan als code worden uitgedrukt:

segment = (va & 0x3000) >> 12;
offset = va & 0x0FFF;

Het masker 0x3000 behoudt de twee selectiebits; een verschuiving met twaalf brengt die naar de laagste posities en levert zo het segmentnummer op. Het masker 0x0FFF wist de selectiebits en behoudt de offset. Voor va = 0x1388 zijn de resultaten segment 1 en offset 0x388, oftewel 904.

Tel 0x1388 niet rechtstreeks bij de heapbasis op. Die waarde bevat zowel de segmentselector als de offset. De selector kiest de registers; alleen de offset wordt gebruikt voor de vertaling binnen het segment. Het resulterende fysieke adres hoeft het bitpatroon van de selector niet te behouden.

Herken de kosten van de splitsing

Een selector van twee bits maakt vier bereiken. Als 10 ongebruikt blijft, is een kwart van het virtuele bereik van 16 KB niet beschikbaar. Geen segment kan groter worden dan zijn bereik van 4 KB, alleen doordat meer fysiek geheugen vrijkomt. Andere ontwerpen kunnen een andere splitsing gebruiken; als code en heap worden gecombineerd in één segment, kan één selectorbit dat segment van de stack onderscheiden.

Laat in plaats daarvan het type toegang kiezen

In een impliciet ontwerp gebruikt het ophalen van instructies het codesegment, omdat het adres uit de programmateller komt. Verwijzingen via de stackpointer of framepointer gebruiken het stacksegment. Andere toegangen gebruiken in dit vereenvoudigde model het heapsegment.

SelectiemethodeWaar de keuze vandaan komt
ExplicietEen segmentveld binnen het virtuele adres
ImplicietHet register of type toegang waarmee het adres is gevormd

Belangrijkste punten

  • Selectiebits kiezen de vertaaltoestand; offsetbits bepalen de plaats van een byte binnen het bereik.
  • Twaalf offsetbits maken een maximaal segmentbereik van 4.096 bytes mogelijk.
  • Maskeren en verschuiven scheiden de velden zonder selectiebits mee te nemen in de optelling bij de basis.
  • Impliciete selectie gebruikt de herkomst van een adres, zoals de programmateller of stackpointer.

4.3 De stack vertalen en toegangsrechten handhaven

De stack groeit naar lagere adressen. Voor de vertaling zijn naast een basis en grootte ook een richtingsbit nodig. In dit model staat 1 voor groei omhoog en 0 voor groei omlaag. Toegangsrechten vormen nog een onafhankelijke controle: een byte kan binnen de grenzen liggen terwijl de gevraagde bewerking toch verboden is.

Behandel de stackbasis als bovengrens

Bij een segment dat omhoog groeit, duidt de basis de eerste fysieke byte aan. Bij een segment dat omlaag groeit, duidt de basis de grens direct boven de hoogste fysieke byte aan. In de doorlopende indeling omvatten stackbasis 53.248 en grootte 2.048 de fysieke bytes 51.200 tot en met 53.247.

Voor het stackbereik van 4 KB dat door 11 wordt geselecteerd, zet je het offsetveld van twaalf bits om in een negatieve verplaatsing:

verplaatsing=offsetveld−4.096

Het veld loopt van 0 tot en met 4.095, dus deze verplaatsing is altijd negatief. Ze is geldig als haar absolute waarde niet groter is dan de huidige stackgrootte. Tel daarna de verplaatsing met teken bij de basis op.

Werk een toegestane stacktoegang uit

Virtueel adres 15.500 selecteert de stack. Het bereik begint virtueel op 12.288, dus het offsetveld is 3.212. Zet het veld om:

3.212−4.096=−884

De diepte 884 valt binnen grootte 2.048. De vertaling geeft:

53.248−884=52.364

Als je de positieve waarde 3.212 bij de basis optelt, wijs je boven de stack. Het veld is nog niet de verplaatsing die voor een segment nodig is dat omlaag groeit.

Virtueel adres 13.000 geeft daarentegen veld 712 en verplaatsing −3.384. De diepte is groter dan 2.048, dus veroorzaakt de hardware een exceptie. Als het besturingssysteem de stack met succes laat groeien, kunnen door de grotere omvang meer lage adressen geldig worden.

Neem het onderste eindpunt mee

Een verplaatsing van −2.048 bereikt de laagste byte van de stack, 51.200, en is toegestaan. Een verplaatsing van −2.049 ligt erbuiten. De controle voor een segment dat omlaag groeit, staat dus ook een absolute waarde toe die gelijk is aan de grootte. Dit komt overeen met het aantal bytes bij de regel voor groei omhoog, hoewel die een offset gelijk aan de grootte uitsluit: de basis bij groei omhoog is een byte, terwijl de basis bij groei omlaag een eindgrens is.

Controleer de gevraagde bewerking

Beschermingsbits leggen lees-, schrijf- en uitvoerrechten vast. Code heeft doorgaans lees- en uitvoerrecht; heap en stack hebben doorgaans lees- en schrijfrecht. Schrijven naar code met lees- en uitvoerrecht veroorzaakt een exceptie, ook als de offset geldig is. Data uitvoeren veroorzaakt ook een exceptie als uitvoerrecht ontbreekt.

Alleen-lezen-code kan worden gedeeld. Het besturingssysteem kan de codesegmenten van twee processen naar hetzelfde fysieke gebied laten wijzen en schrijven voor beide verbieden. De instructiebytes nemen één fysieke kopie in, terwijl elk proces een afzonderlijke heap en stack houdt.

Belangrijkste punten

  • De basis van een segment dat omlaag groeit, markeert de bovengrens, geen opgeslagen byte.
  • Trek de maximale grootte van het bereik af van het offsetveld om de negatieve verplaatsing te krijgen.
  • De laagste byte van de stack is toegestaan als de absolute waarde van de verplaatsing gelijk is aan de huidige grootte.
  • Zowel de grens als de gevraagde bewerking moet door de hardwarecontroles komen.
  • Gedeelde alleen-lezen-code bespaart fysiek geheugen terwijl eigen beschrijfbare gebieden gescheiden blijven.

4.4 Fysieke segmenten van verschillende grootte beheren

Segmentatie vervangt één groot gebied door meerdere kleinere gebieden. Daardoor is geen fysiek geheugen nodig voor lege virtuele gaten, maar moet het besturingssysteem nu gebieden van verschillende grootte plaatsen en laten groeien terwijl het de vertaaltoestand van elk proces behoudt.

Sla elk onderdeel van de koppeling op

Bij een contextwisseling zijn basis en grootte alleen niet meer voldoende. Het besturingssysteem slaat de basis, grootte, groeirichting en toegangsrechten van elk segment op en herstelt die. Een stack met de verkeerde richting of code met de verkeerde toegangsrechten herstellen zou de betekenis van verder identieke adressen veranderen.

Als een allocator meer heapruimte nodig heeft, moet het besturingssysteem het fysieke heapsegment uitbreiden. Vrije bytes direct erboven maken directe groei mogelijk. Anders kan het besturingssysteem het segment naar een geschikt groter gat verplaatsen en de basis bijwerken. Als het geen geschikt gebied kan verkrijgen, mislukt de groei.

Kies de granulariteit
MethodeIndelingGevolg voor het beheer
Grofmazige segmentatieEnkele gebieden zoals code, heap en stackEen klein aantal segmentregisters beschrijft het proces.
Fijnmazige segmentatieVeel gebieden, misschien één per gegevensstructuurEen segmenttabel in het geheugen biedt meer mogelijkheden voor delen en beschermen.

Multics gebruikte fijnmazige segmentatie. Meer segmenten maken kleinere beheereenheden mogelijk, maar vereisen meer vertaalmetadata en beheer.

Zoek een voldoende groot gat

Fysieke segmenten van verschillende grootte laten vrije gaten van verschillende grootte achter wanneer processen starten, groeien en eindigen. Externe fragmentatie ontstaat wanneer in totaal genoeg bytes vrij zijn, maar geen afzonderlijk gat het aangevraagde segment kan bevatten.

Stel dat de vrije gaten 8 KB, 6 KB en 10 KB groot zijn. Samen is dat 24 KB. Een heapsegment van 12 KB past nog steeds niet: het grootste beschikbare gat is slechts 10 KB. De gaten op papier samenvoegen zorgt er niet voor dat hun fysieke adressen naast elkaar liggen.

Geheugencompactie kan deze indeling herstellen. Het besturingssysteem onderbreekt processen, kopieert segmenten naast elkaar en werkt hun bases bij. Virtuele adressen blijven werken omdat vertaling de fysieke verplaatsingen verborgen houdt. Het resultaat is een groot aaneengesloten vrij gebied, maar het kopiëren is kostbaar en nieuwe toewijzingen kunnen het geheugen opnieuw fragmenteren.

Plaatsingsbeleid zoals het eerste passende blok en het kleinst passende blok probeert ongunstige resten te beperken zonder te kopiëren. Geen plaatsingsbeleid voor blokken van verschillende grootte neemt externe fragmentatie voor elke reeks aanvragen weg. Ook kan één groot segment ruimte binnen zijn eigen omvang verspillen wanneer slechts verspreide delen worden gebruikt.

Herken het model in moderne systemen

Paginering verdeelt geheugen in stukken van vaste grootte en voorkomt dat elk logisch gebied één fysiek gat moet innemen. Het segmentatiemodel blijft nuttig om gebieden, bescherming en gedeeld gebruik te begrijpen. In de 64-bitsmodus van x86-64 gedragen de gewone segmentbases voor code, data en stack zich als nul en worden hun grenzen niet gecontroleerd; FS en GS behouden bruikbare bases voor gegevens per thread of per CPU. Een melding van ongeldige toegang die segmentatiefout heet, betekent niet dat het klassieke model met drie segmenten actief is.

Belangrijkste punten

  • Bij contextwisselingen worden naast bases en groottes ook richtingen en toegangsrechten hersteld.
  • Fijnmazige segmentatie biedt meer onafhankelijke gebieden via een segmenttabel.
  • Externe fragmentatie hangt af van de grootte van afzonderlijke gaten, niet alleen van hun totaal.
  • Geheugencompactie verplaatst fysieke segmenten en werkt bases bij, terwijl virtuele pointers blijven werken.
  • Plaatsingsbeleid vermindert fragmentatie zonder te garanderen dat die verdwijnt.
  • Gewone vertaling op x86-64 verschilt van klassieke segmentatie.
5

Vrije blokken en hun kosten beheren

Een allocator moet weten welke bytes vrij zijn en een blok kiezen dat elke aanvraag kan bevatten. Opsplitsen en samenvoegen veranderen de vrijelijst; plaatsingsbeleid verandert welke gaten voor latere aanvragen overblijven. Headers, uitlijning en afronding op machten van twee brengen eigen kosten mee. Door deze veranderingen te volgen kun je mislukte toewijzingen verklaren, beleid vergelijken en zien waarom gespecialiseerde caches en buddyallocatie flexibiliteit inruilen voor snelheid.

5.1 Verspilling binnen of tussen blokken vinden

Beheer van vrije ruimte registreert beschikbaar geheugen en kiest waar elke aanvraag terechtkomt. Voor even grote aanvragen kan een lijst van uitwisselbare blokken worden gebruikt. Verschillende groottes zijn moeilijker: zowel een heapallocator als een besturingssysteem dat segmenten plaatst, moet een aaneengesloten blok vinden dat groot genoeg is voor de volgende aanvraag.

Vind externe fragmentatie

Neem een gebied van 60 bytes met vrije bytes op 0–19, een toegewezen blok op 20–39 en vrije bytes op 40–59. Er zijn veertig bytes vrij, maar geen van beide vrije gaten kan een aanvraag van 25 bytes bevatten. Het nog toegewezen middelste blok verhindert dat die gaten als één gebied worden behandeld.

Dit is externe fragmentatie: er is capaciteit vrij buiten toegewezen blokken, maar door de indeling is die onbruikbaar voor een bepaalde aaneengesloten aanvraag. De vrije bytes zijn niet verdwenen. Ze kunnen nog steeds kleinere aanvragen bedienen of bruikbaar worden wanneer tussenliggende blokken worden vrijgegeven.

Vind interne fragmentatie

Een allocator die aanvragen afrondt op veelvouden van 16, geeft voor een aanvraag van 20 bytes een blok van 32 bytes. De 12 extra bytes zitten binnen een al uitgegeven toewijzing. Die verspilling is interne fragmentatie.

De ongebruikte ruimte tussen heap en stack binnen een plaats met een basis en een grens is een ander voorbeeld. Buddyallocatie veroorzaakt dezelfde soort verspilling wanneer die afrondt op machten van twee. Het beheerniveau verschilt, maar de plaats van de ongebruikte ruimte is het bepalende kenmerk.

VerspillingWaar die zitWaarom die kostbaar is
Interne fragmentatieBinnen een toegewezen gebiedEr zijn meer bytes gereserveerd dan de nuttige inhoud nodig heeft.
Externe fragmentatieIn afzonderlijke vrije gatenGeen afzonderlijk gat past bij de aangevraagde omvang.

Eén allocator kan van beide last hebben. Een aanvraag afronden kan bytes binnen het blok verspillen, terwijl elders andere vrije blokken gescheiden blijven.

Voeg vrije aangrenzende blokken samen zonder gebruikte data te verplaatsen

Samenvoegen van aangrenzende vrije blokken verenigt fysiek aangrenzende vrije blokken. Als het middelste blok in het gebied van 60 bytes wordt vrijgegeven, kunnen alle drie de stukken één gat van 60 bytes vormen. Als het middelste blok toegewezen blijft, kan het samenvoegen niet over dat blok heen gaan. Samenvoegen vermindert externe fragmentatie, maar garandeert niet voor elke aanvraag een voldoende groot gat.

Meer geheugen aan een heap toevoegen kan de druk verlichten, maar verandert de adressen van bestaande toegewezen blokken niet. Hun plaatsing kan nog steeds onbruikbare kleine gaten achterlaten.

Leg uit waarom het besturingssysteem segmenten kan comprimeren

Het besturingssysteem kan fysieke segmenten kopiëren en hun bases bijwerken. Programma's behouden virtuele adressen, zodat de koppeling die verplaatsingen kan verbergen. Een algemene heapallocator voor C mist een vertaallaag tussen teruggegeven pointers en locaties binnen de heap. Een programma kan een pointer naar veel objecten hebben gekopieerd en de allocator kan niet elke kopie vinden en herschrijven.

Als de allocator zelfstandig een toegewezen heapblok zou verplaatsen, zouden die pointers nog naar de oude locatie wijzen. Daarom houdt gewoon malloc-beheer toegewezen blokken op hun teruggegeven adres totdat ze worden vrijgegeven. Het moet fragmentatie beheersen door plaatsing, hergebruik en het opsplitsen en samenvoegen van vrije ruimte.

Belangrijkste punten

  • Interne verspilling ligt binnen toewijzingen; externe fragmentatie ligt in gescheiden vrije gaten.
  • De totale vrije capaciteit bewijst niet dat een aaneengesloten aanvraag past.
  • Samenvoegen verenigt aangrenzende vrije blokken zonder toegewezen blokken te verplaatsen.
  • Het besturingssysteem kan bij het verplaatsen van segmenten pointers via vertaling behouden; gewone compactie van de C-heap kan dat niet.

5.2 Headers, opsplitsen en samenvoegen volgen

Een vrijelijst registreert vrije blokken op adres en grootte. Bij toewijzing wordt een blok opgesplitst of van de lijst verwijderd; bij vrijgave keert een blok terug en wordt het mogelijk met aangrenzende blokken samengevoegd. De grootteconventie is van belang: een geregistreerde grootte kan de bruikbare gegevensruimte betekenen of het hele blok inclusief metadata.

Splits eenvoudige bereiken op en voeg ze samen

Laat headers eerst buiten beschouwing. In een gebied van 60 bytes met vrije vermeldingen (0, 20) en (40, 20) geeft een aanvraag van 8 bytes die aan het begin wordt geplaatst adres 0 terug. De resterende vermeldingen zijn (8, 12) en (40, 20).

Begin opnieuw met de oorspronkelijke indeling en geef de middelste toegewezen bytes 20–39 vrij. Zonder samenvoegen kunnen de drie vermeldingen van 20 bytes afzonderlijk nog steeds geen aanvraag van 30 bytes afhandelen. Door aangrenzende bereiken samen te voegen ontstaat (0, 60), dat wel groot genoeg is. Adresvolgorde helpt de allocator aangrenzende blokken te herkennen; naast elkaar op de lijst staan is op zichzelf niet voldoende, tenzij hun fysieke bereiken elkaar raken.

Vind de header via de gebruikerspointer

free(ptr) ontvangt geen grootte. Een eenvoudige allocator slaat direct vóór de bruikbare gegevensruimte een header met de grootte op, soms met een controlewaarde of herkenningsgetal. Door de headerlengte af te trekken vind je de metadata.

Met een header van 16 bytes neemt een aanvraag van 96 bytes in totaal 112 bytes in. Het programma ontvangt een pointer 16 bytes na het begin van het blok. Bij vrijgave komt het hele bereik van 112 bytes, inclusief header, terug voor toekomstig beheer. Uitlijning kan extra afronding toevoegen; de groottes in dit voorbeeld voldoen al aan uitlijning op 16 bytes.

Volg een ingebedde vrijelijst

Stel dat een heap van 4.096 bytes begint op 32.768. Een vrije knoop gebruikt 16 bytes en registreert bruikbare bytes na de knoop. Aanvankelijk registreert die 4.080 bruikbare bytes.

Drie aanvragen van 96 bytes verbruiken elk 112 bytes:

AanvraagHeaderadresTeruggegeven pointer
Eerste32.76832.784
Tweede32.88032.896
Derde32.99233.008

De resterende vrije knoop begint op 33.104. De bruikbare grootte is 3.744 bytes. De telling is:

336+16+3.744=4.096

Bij vrijgave van pointer 32.896 wordt de header op 32.880 gevonden. Dat blok wordt een vrije knoop met 96 bruikbare bytes. Het kan niet met de laatste knoop op 33.104 worden samengevoegd, omdat de derde toewijzing ertussen ligt. Wanneer alle drie de toewijzingen zijn vrijgegeven en samengevoegd, beschrijft één knoop weer 4.080 bruikbare bytes. Door de oude headers in het midden op te nemen, komen hun bytes beschikbaar binnen het samengevoegde bereik.

Houd de administratie binnen het beheerde gebied

Ingebedde lijstknopen staan in het vrije geheugen zelf, dus voor het beheer van de lijst is geen afzonderlijke toewijzing voor elke vermelding nodig. De knoop bevat een grootte en een verwijzing naar het volgende vrije blok. Als geen blok past, kan de allocator met sbrk of mmap meer geheugen aanvragen; als niet genoeg geheugen kan worden verkregen, leidt dat tot NULL.

Een overloop kan een aangrenzende header of knoop overschrijven. Dat verklaart waarom de zichtbare fout kan optreden tijdens een latere malloc of free, na de schrijfbewerking die de lijst beschadigde.

Belangrijkste punten

  • Onderscheid de bruikbare grootte van de totale omvang inclusief metadata.
  • Door een header van 16 bytes verbruikt een aanvraag van 96 bytes 112 bytes.
  • Vind een toewijzingsheader door de grootte ervan van de teruggegeven pointer af te trekken.
  • Opsplitsen behoudt een bruikbare rest; samenvoegen vereist aangrenzende vrije bereiken.
  • Ingebedde knopen slaan lijstmetadata op in de vrije blokken zelf.
  • Een tussenliggend toegewezen blok verhindert samenvoegen.
  • Administratie overschrijven kan fouten veroorzaken bij latere aanroepen van de allocator.

5.3 Een vrij blok kiezen

Plaatsingsbeleid kiest tussen blokken die groot genoeg zijn voor een aanvraag. Verschillende keuzes laten verschillende gaten achter voor toekomstige aanvragen. Naast fragmentatie is de zoektijd van belang en geen beleid wint voor elke werklast.

Vergelijk de zoekregels
BeleidKeuzeBelangrijkste afweging
Kleinst passend blokKleinste blok dat pastEen volledige zoekactie in een eenvoudige lijst kan kleine snippers achterlaten.
Grootst passend blokGrootste blokEen volledige zoekactie in een eenvoudige lijst kan een waardevol groot gat gebruiken.
Eerste passende blokEerste passende blok in lijstvolgordeStopt vroeg, maar kleine resten hopen zich vooraan op.
Volgende passende blokEerste passende blok vanaf een opgeslagen zoekpositieVerspreidt zoekacties over de lijst en begint zo nodig weer vooraan.

Voor het kleinst en grootst passende blok is bij een gewone ongesorteerde lijst een volledige zoekactie nodig. Andere structuren kunnen sneller geschikte groottes vinden. Het eerste passende blok is het eerste in de gekozen lijstvolgorde; dat hoeft niet het laagste adres te zijn, tenzij de lijst op adres is gesorteerd.

Volg de eerste aanvraag

Neem vrije blokken van 30, 12, 50 en 20 bytes in adresvolgorde. Laat headers buiten beschouwing en neem aan dat opsplitsen elke rest kan behouden. Een aanvraag van 18 bytes verandert de lijst als volgt:

  • Het kleinst passende blok gebruikt 20 en laat 30, 12, 50, 2 over.
  • Het grootst passende blok gebruikt 50 en laat 30, 12, 32, 20 over.
  • Het eerste passende blok gebruikt 30 en laat 12, 12, 50, 20 over.
  • Het volgende passende blok begint bij het vierde blok, gebruikt 20 en laat 30, 12, 50, 2 over.

Voor het volgende passende blok is een startpositie nodig om de keuze te bepalen. De naam alleen betekent niet dat bij de eerste vermelding van de lijst wordt begonnen. Bij het volgen van aanvragen moet je die zoektoestand tussen aanvragen bewaren.

Zie waarom de volgende aanvraag het oordeel verandert

Een volgende aanvraag vraagt om 45 bytes. Het kleinst passende blok en het eerste passende blok hebben beide het blok van 50 bytes behouden, dus slagen beide. Bij het grootst passende blok is het grootste resterende blok 32 bytes, dus mislukt de aanvraag ondanks 94 vrije bytes in totaal:

30+12+32+20=94

Deze mislukking is externe fragmentatie. De eerdere beslissing heeft het enige voldoende grote gat opgesplitst. Omgekeerd liet het kleinst passende blok een snipper van 2 bytes achter die mogelijk te klein is voor bruikbare toekomstige aanvragen. Een directe kleine rest bewijst niet dat beleid over de hele reeks aanvragen goed met ruimte omgaat.

Weeg beleid en gegevensstructuur af

Duizenden vermeldingen doorzoeken kan kostbaar zijn, ook als elke plaatsing goed is. Praktische allocators groeperen blokken op grootte of gebruiken doorzoekbare structuren zoals gebalanceerde bomen. Een lijst op adresvolgorde ondersteunt ook het samenvoegen, doordat fysiek aangrenzende blokken gemakkelijker te vinden zijn.

Het toewijzingsmechanisme: zoeken, opsplitsen en metadata bijwerken, kan gelijk blijven terwijl het beleid verandert. Om beleid eerlijk te vergelijken, volg je dezelfde aanvragen en vrijgaven, houd je de regels voor overhead gelijk en houd je rekening met zowel de ontstane gaten als de hoeveelheid zoekwerk.

Belangrijkste punten

  • Het kleinst passende blok kiest het kleinste voldoende grote blok; het grootst passende blok kiest het grootste.
  • Het eerste passende blok hangt af van de lijstvolgorde; het volgende passende blok ook van de opgeslagen zoekpositie.
  • Een keuze die één aanvraag afhandelt, kan een latere grotere aanvraag verhinderen.
  • Geen plaatsingsbeleid is het beste voor elke werklast.
  • Gegevensstructuren beïnvloeden de zoekkosten onafhankelijk van de selectieregel.

5.4 Groottes, objecten en partnerblokken hergebruiken

Algemeen zoeken in een vrijelijst is flexibel, maar kan kostbaar zijn. Gespecialiseerde allocators maken veelvoorkomende aanvragen voorspelbaar door groottes te groeperen, herbruikbare objecten te behouden of blokgroottes te beperken tot machten van twee.

Hergebruik veelvoorkomende groottes en geïnitialiseerde objecten

Gescheiden vrijelijsten houden afzonderlijke vrijelijsten bij voor veelvoorkomende groottes, met een algemene allocator voor andere aanvragen. Een veelvoorkomende grootte kan rechtstreeks een blok uit de bijbehorende lijst krijgen. Even grote blokken veroorzaken onderling geen externe fragmentatie, maar de verdeling van capaciteit over lijsten is een beleidskeuze: vrije blokken van de ene grootte zijn mogelijk niet bruikbaar voor een andere grootte.

Een slaballocator houdt een objectcache bij voor een terugkerend type kernelobject, zoals een inode, vergrendeling of procesdescriptor. Een slab is verdeeld in objecten van dat type. De cache verkrijgt zo nodig meer slabs en kan een volledig vrije slab aan een algemene allocator teruggeven. Jeff Bonwick ontwierp deze aanpak voor Solaris.

De cache houdt vrijgegeven objecten in een geïnitialiseerde toestand, zodat herhaald instellen en vernietigen wordt vermeden. Dat bespaart naast het zoeken zelf ook tijd.

Splits een buddygebied

Een binaire buddyallocator begint met een gebied waarvan de grootte een macht van twee is en rondt elke aanvraag af op een blokgrootte die een macht van twee is. De allocator splitst een vrij blok herhaaldelijk in gelijke helften totdat een helft precies groot genoeg is. De twee helften van één splitsing zijn partnerblokken.

Rond voor een aanvraag van 5 KB in een gebied van 64 KB 5 KB af op 8 KB. Splits 64 in twee blokken van 32 KB, vervolgens de gekozen 32 in twee blokken van 16 KB en daarna de gekozen 16 in twee blokken van 8 KB. Als het eerste blok van 8 KB wordt teruggegeven, blijven vrije partnerblokken over op offsets 8 KB, 16 KB en 32 KB, met respectievelijk groottes van 8 KB, 16 KB en 32 KB.

De toewijzing verspilt 3 KB binnen haar blok van 8 KB. Dit is interne fragmentatie, die wordt geaccepteerd in ruil voor regelmatig opsplitsen en samenvoegen.

Vind de enige toegestane samenvoegpartner

Met offsets gemeten vanaf het begin van het beheerde gebied:

offset partnerblok=blokoffset⊕blokgrootte

De exclusieve of keert de bit om die overeenkomt met de blokgrootte. Voor een blok van 8 KB op offset 0 ligt het partnerblok op offset 8.192. Voor een blok van 16 KB op offset 16.384 ligt het partnerblok op 0.

Wanneer het eerste blok van 8 KB wordt vrijgegeven, wordt het samengevoegd met zijn vrije partnerblok van 8 KB. Het resulterende blok van 16 KB kan met zijn vrije partnerblok worden samengevoegd, waarna het resulterende blok van 32 KB opnieuw kan worden samengevoegd. Het samenvoegen stopt als het vereiste even grote partnerblok in gebruik is. Aangrenzend en vrij zijn is niet voldoende als twee blokken geen partnerblokken van dezelfde splitsing zijn.

Een aanvraag van 20 KB krijgt 32 KB, waardoor 12 KB, oftewel 37,5% van het blok, wordt verspild. Linux combineert buddyallocatie van fysiek geheugen met objectcaches volgens het slabprincipe. Allocators voor meerdere threads gebruiken ook lokale caches of meerdere arena's om minder te hoeven wachten op één gedeelde toewijzingsvergrendeling; glibc, jemalloc en tcmalloc gebruiken varianten van deze ideeën.

Belangrijkste punten

  • Gescheiden vrijelijsten versnellen aanvragen van veelvoorkomende groottes.
  • Slabcaches hergebruiken terugkerende objecttypen en kunnen herhaalde initialisatie vermijden.
  • Buddyallocatie rondt af op machten van twee en splitst in gelijke helften.
  • Je vindt het partnerblok met de gebiedsrelatieve offset XOR de blokgrootte.
  • Op elk niveau kan alleen een vrij partnerblok van dezelfde grootte worden samengevoegd.
  • Afronden op machten van twee ruilt interne fragmentatie in voor eenvoudig beheer.

Adresruimten en adresvertaling: voorbeelden

5 Walkthroughs

1

Volg een pointer door een eigen geheugenbeeld

8 stappen
Verbind de procesindeling met vertaling, isolatie en efficiënte uitvoering.
  1. 1
    IntroductieEén machine, meerdere geheugenbeelden

    Meerdere processen kunnen in het fysieke geheugen blijven terwijl de CPU tussen die processen wisselt. Elk proces heeft een stabiel beeld van zijn eigen instructies en data nodig, ook wanneer andere processen starten, stoppen of worden verplaatst.

    Een adresruimte biedt dat beeld. De pointer die een proces gebruikt, hoort bij dit beeld; het besturingssysteem en de hardware bepalen welke fysieke byte de toegang bereikt.

  2. 2
    UitlegPlaats de inhoud van het programma

    Code slaat instructies op, statische data bevat globale en statische lokale variabelen, de heap bevat aangevraagde blokken en de stack bevat de toestand van functieaanroepen.

    In de klassieke indeling groeit de heap omhoog en de stack omlaag, in een gat ertussen. Bij binaire groottes betekent 1 KB 1.024 bytes, ook 1 KiB genoemd. Een ruimte van 16 KB heeft bytes 0 tot en met 16.383; de bovengrens is zelf geen byte in de ruimte.

  3. 3
    VoorbeeldGeef hetzelfde getal twee betekenissen

    Proces A en proces B gebruiken allebei virtueel adres 1.000. De vertaling van A kan het naar de ene fysieke byte sturen en die van B naar een andere. Het getal van de pointer alleen duidt geen gedeelde opslag aan.

    Ook als je &x afdrukt, zie je een virtueel adres. Het verplaatsen van de onderliggende fysieke opslag hoeft de pointerwaarde die het programma ziet niet te veranderen.

  4. 4
    UitdagingInterpreteer twee afgedrukte pointers

    Twee processen drukken dezelfde pointerwaarde af. Moeten ze dezelfde fysieke byte lezen? Leg uit wat de bestemming bepaalt.

    ---reveal---

    Nee. Elke afgedrukte pointer wordt geïnterpreteerd binnen de adresruimte van het eigen proces. De actieve koppeling bepaalt de fysieke bestemming, dus gelijke virtuele getallen kunnen verschillende bytes bereiken. Voor dezelfde fysieke byte zijn koppelingen nodig die daadwerkelijk opslag delen.

  5. 5
    UitlegVertaal snel en handhaaf grenzen

    Transparantie behoudt het eigen geheugenbeeld van het programma. Tijdefficiëntie houdt vertaling goedkoop bij elke instructie die wordt opgehaald en elke lees- en schrijfbewerking. Ruimte-efficiëntie beperkt metadata en verspilde capaciteit. Bescherming houdt ongeoorloofde toegang tegen.

    Hardware verzorgt gewone vertaling. Het besturingssysteem configureert de koppelingen, kiest plaatsingen en neemt de besturing over wanneer een toegang een exceptie veroorzaakt.

  6. 6
    UitdagingScheid de keuze van de bewerking

    Een geheugenbeheerder stapt over van het kiezen van het eerste geschikte gat op het kiezen van het kleinste geschikte gat. De hardware controleert nog steeds de grens en telt een basis op. Is het mechanisme of het beleid veranderd?

    ---reveal---

    Het plaatsingsbeleid is veranderd: het maakt nu een andere keuze tussen gaten. Het vertaalmechanisme is ongewijzigd. Dezelfde hardware kan een gebied vertalen en beschermen, ongeacht welk geschikt gat het besturingssysteem kiest.

  7. 7
    UitdagingVerbind verplaatsing met bescherming

    Een besturingssysteem verplaatst een onderbroken proces naar een nieuw fysiek gebied, maar behoudt de pointerwaarden. Waarom vereist dat zowel vertaling als controle over wie de koppeling mag wijzigen?

    ---reveal---

    Vertaling leidt de ongewijzigde virtuele pointers naar de gekopieerde bytes. Alleen geprivilegieerde code van het besturingssysteem mag de nieuwe koppeling instellen; anders zou een proces zichzelf kunnen omleiden naar een ander proces of de kernel. Stabiele pointers bieden transparantie, terwijl gecontroleerde koppelingen isolatie behouden.

  8. 8
    SamenvattingLees de pointer binnen zijn proces

    Een adresruimte ordent de code en data van een proces onafhankelijk van de fysieke plaatsing. Een virtuele pointer krijgt betekenis via de koppeling van het actieve proces.

    Beoordeel een ontwerp op het geheugenbeeld dat het behoudt, de tijd en ruimte die het kost en de toegangsgrenzen die het handhaaft. Beleid kiest plaatsingen; mechanismen voeren vertaling en controles uit.

2

Volg een heapaanvraag door bibliotheek en besturingssysteem

12 stappen
Volg de levensduur van blokken, bibliotheekaanroepen, groei van de heapgrens en afzonderlijke geheugenkoppelingen.

Sla deze les op om elke Walkthrough stap voor stap te volgen.

  1. 1
    IntroductieHoud de twee eigenaren in beeld
  2. 2
    VoorbeeldOnderscheid een pointer van zijn toewijzing
  3. 3
    UitlegVraag voldoende bytes aan
  4. 4
    UitdagingVoorspel wat na terugkeer blijft bestaan
  5. 5
    UitlegGeef alleen een toegewezen blok vrij
  6. 6
    KernpuntEen toegestaan gebied kan ongeldige toegang tot een object bevatten
  7. 7
    UitlegLaat een gebied groeien en verdeel het daarna
  8. 8
    UitdagingBepaal waar de nieuw toegevoegde bytes liggen
  9. 9
    VerbandGeef een blok vrij of verwijder een geheugenkoppeling
  10. 10
    UitdagingVerklaar een gelijkblijvend geheugengebruik
  11. 11
    UitdagingVolg groei bij segmentatie
  12. 12
    SamenvattingHoud levensduur en eigenaarschap afzonderlijk bij
3

Voer een proces met een basis en een grens uit en verplaats het

13 stappen
Vertaal toegangen, herstel de juiste koppeling en bereken de verspilde gereserveerde ruimte.

Sla deze les op om elke Walkthrough stap voor stap te volgen.

  1. 1
    IntroductieBeschrijf één fysieke plaats
  2. 2
    UitlegPas de grootteconventie toe
  3. 3
    VoorbeeldVertaal het ophalen en het laden
  4. 4
    UitdagingControleer de laatste byte
  5. 5
    TipHerken de andere vorm van het grensregister
  6. 6
    UitlegBescherm de vertaalregisters
  7. 7
    VoorbeeldWissel het geheugenbeeld samen met de CPU-toestand
  8. 8
    UitdagingZoek een ontbrekend herstel
  9. 9
    VerbandVerplaats een proces zonder pointers te herschrijven
  10. 10
    VoorbeeldMeet het ongebruikte bereik
  11. 11
    UitdagingKies de eenheid van relocatie
  12. 12
    UitdagingBehoud de grens na een verplaatsing
  13. 13
    SamenvattingHoud zowel coördinaten als kosten uit elkaar
4

Vertaal code, heap en een stack die omlaag groeit

17 stappen
Bepaal segmentvelden, controleer exacte eindpunten en verbind gedeeld gebruik met fysieke plaatsing.

Sla deze les op om elke Walkthrough stap voor stap te volgen.

  1. 1
    IntroductieVerdeel het proces in logische gebieden
  2. 2
    UitlegStel de voorbeeldindeling in
  3. 3
    VoorbeeldBepaal de heapoffset
  4. 4
    UitdagingControleer een byte voorbij de heap
  5. 5
    UitlegGebruik selectiebits om registers te kiezen
  6. 6
    VoorbeeldBepaal beide velden
  7. 7
    UitdagingOnderscheid capaciteit van huidig gebruik
  8. 8
    VerbandLaat de toegang een segment kiezen
  9. 9
    UitlegMeet omlaag vanaf een bovengrens
  10. 10
    VoorbeeldBereken een stackverplaatsing met teken
  11. 11
    UitdagingNeem de laagste byte van de stack mee
  12. 12
    KernpuntControleer het recht na het vinden van een geldige locatie
  13. 13
    UitlegHerstel meer dan een basis
  14. 14
    UitdagingTel gaten afzonderlijk
  15. 15
    VerbandBegrijp de beperkingen van geheugencompactie
  16. 16
    UitdagingVerplaats een gedeeld segment veilig
  17. 17
    SamenvattingBepaal het gebied vóór de fysieke byte
5

Volg vrije blokken en kies toewijzingsbeleid

18 stappen
Volg metadata, vergelijk plaatsingsverlopen en splits partnerblokken op en voeg ze samen.

Sla deze les op om elke Walkthrough stap voor stap te volgen.

  1. 1
    IntroductieVraag of één blok past
  2. 2
    VoorbeeldBepaal waar de ongebruikte capaciteit zit
  3. 3
    UitdagingOnderzoek wat samenvoegen kan bereiken
  4. 4
    VerbandLeg uit waarom pointers naar toegewezen blokken heapcompactie verhinderen
  5. 5
    UitlegHoud rekening met de header
  6. 6
    VoorbeeldPlaats drie blokken
  7. 7
    VoorbeeldControleer het resterende bereik
  8. 8
    UitdagingVind een header en bepaal het bereik
  9. 9
    UitlegLaat het beleid het blok kiezen
  10. 10
    VoorbeeldVergelijk de eerste keuze
  11. 11
    UitdagingKijk vooruit naar de volgende aanvraag
  12. 12
    VerbandMaak veelvoorkomende aanvragen voorspelbaar
  13. 13
    VoorbeeldRond een buddygebied af en splits het op
  14. 14
    UitlegVind het bijbehorende partnerblok
  15. 15
    UitdagingVolg de samenvoegniveaus
  16. 16
    KernpuntBetaal voor eenvoud binnen het blok
  17. 17
    UitdagingOnderscheid plaatsing van samenvoegen
  18. 18
    SamenvattingVolg zowel de indeling als de administratie

Adresruimten en adresvertaling: oefenvragen

50 Oefenvragen in 5 sets

Set 1: Adresruimten, controles en eerste toewijzingen10 Oefenvragen

Vraag 1 van 10

Twee processen drukken elk een pointer af met de getalswaarde 2.400. Wat zegt dit over hun fysieke opslag?
  1. Hun bytes moeten hetzelfde fysieke geheugenadres innemen.
  2. Hun koppelingen kunnen de bytes op verschillende fysieke adressen plaatsen.
  3. Hun bytes moeten op dat virtuele adres dezelfde inhoud hebben.
  4. Hun virtuele adressen moeten veranderen voordat een proces draait.
Toon antwoordVerberg antwoord
Antwoord: B
Elke pointer wordt geïnterpreteerd binnen de adresruimte van het eigen proces, dus gelijke virtuele waarden kunnen verschillende fysieke bytes bereiken. Gelijke getallen bewijzen geen gedeelde opslag. Daarvoor moeten de koppelingen naar hetzelfde onderliggende gebied verwijzen.

Vraag 2 van 10

Een besturingssysteem verandert hoe het een vrije procesplaats kiest, maar behoudt dezelfde hardware voor grenscontrole. Wat is veranderd?
  1. De privilegeregel voor gebruikersmodus is veranderd.
  2. Het plaatsingsbeleid is veranderd.
  3. De adresbreedte van het proces is veranderd.
  4. Het relocatiemechanisme is veranderd.
Toon antwoordVerberg antwoord
Antwoord: B
Het beleid kiest een plaats uit de beschikbare alternatieven. Het mechanisme controleert nog steeds de grens en telt de gekozen basis net als voorheen op. Als je dit een nieuw relocatiemechanisme noemt, verwar je de plaatsingsbeslissing met de bewerkingen die die plaatsing handhaven.

Vraag 3 van 10

Een lokale pointer is de enige bruikbare verwijzing naar een toegewezen blok. De functie keert terug zonder het blok vrij te geven of de pointer op te slaan. Welke geheugenfout ontstaat?
  1. Een geheugenlek door een onbereikbare toewijzing.
  2. Gebruik na vrijgave door de terugkeer uit de functie.
  3. Een bufferoverloop naar het volgende heapblok.
  4. Een dubbele vrijgave van het voormalige blok van de pointer.
Toon antwoordVerberg antwoord
Antwoord: A
De heaptoewijzing blijft bestaan nadat de lokale pointer is verdwenen. Zonder opgeslagen verwijzing kan het programma dat blok niet via het toewijzingsadres vrijgeven of hergebruiken. Terugkeren uit een functie geeft heapopslag niet vanzelf vrij, dus dit is geen gebruik na vrijgave.

Vraag 4 van 10

Een programma wijst opslag toe voor 12 gehele getallen van elk 4 bytes. Het pointertype neemt 8 bytes in. Hoeveel bytes geeft sizeof(p) als p het toewijzingsadres bevat?
  1. 4 bytes
  2. 48 bytes
  3. 12 bytes
  4. 8 bytes
Toon antwoordVerberg antwoord
Antwoord: D
De operand van sizeof(p) is het pointerobject, waarvan de grootte 8 bytes is. De toewijzing bevat 48 bytes, maar sizeof volgt een pointer niet om een heapblok te meten. Als je hier de grootte van de toewijzing gebruikt, verwar je de pointer met het doel ervan.

Vraag 5 van 10

Een proces heeft basis 18.000 en een grens als grootte van 3.000. Wat gebeurt er als het vanaf virtueel adres 2.750 laadt?
  1. Het leest fysieke byte 2.750.
  2. Het veroorzaakt een exceptie omdat 20.750 groter is dan 3.000.
  3. Het leest fysieke byte 20.750.
  4. Het leest fysieke byte 15.250.
Toon antwoordVerberg antwoord
Antwoord: C
Virtueel adres 2.750 ligt onder de grens van 3.000 bytes, dus de toegang is toegestaan. Als je basis 18.000 optelt, krijg je fysiek adres 20.750. Als je dat fysieke resultaat met de grens als grootte in bytes vergelijkt, wijs je een adres ten onrechte af terwijl de virtuele offset past.

Vraag 6 van 10

Wat gebeurt er bij basis 24.000 en een grens als grootte van 4.500 met een toegang op virtueel adres 4.500?
  1. De hardware vergroot het gebied met één byte.
  2. De hardware benadert fysieke byte 28.500.
  3. De hardware wijst de toegang buiten de grens af.
  4. De hardware benadert fysieke byte 28.499.
Toon antwoordVerberg antwoord
Antwoord: C
Een gebied van 4.500 bytes bevat virtuele bytes 0 tot en met 4.499. Het virtuele adres dat gelijk is aan de grootte is de eerste byte daarbuiten, dus veroorzaakt de hardware een exceptie. De basis optellen voordat de controle slaagt, maakt die uitgesloten grens geen toegestane byte.

Vraag 7 van 10

Een heap die omhoog groeit begint virtueel op 2.048, heeft grootte 1.536 en fysieke basis 30.000. Naar welk adres wordt virtueel adres 2.900 vertaald?
  1. Fysieke byte 31.536.
  2. Fysieke byte 30.852.
  3. Fysieke byte 27.952.
  4. Fysieke byte 32.900.
Toon antwoordVerberg antwoord
Antwoord: B
De heapoffset is 852, berekend door virtueel begin 2.048 van adres 2.900 af te trekken. Die is kleiner dan grootte 1.536, dus als je de offset bij basis 30.000 optelt, krijg je 30.852. Als je het volledige virtuele adres optelt, neem je ten onrechte het virtuele begin mee in de relocatie.

Vraag 8 van 10

Een gesegmenteerd adres gebruikt twee hoge selectiebits en tien lage offsetbits. Wat is het maximale bereik in bytes van één segment?
  1. 1.024 bytes
  2. 1.023 bytes
  3. 4.096 bytes
  4. 256 bytes
Toon antwoordVerberg antwoord
Antwoord: A
Tien offsetbits stellen 1.024 byteposities voor, genummerd van 0 tot en met 1.023. De twee selectiebits kiezen een segment in plaats van het offsetbereik te vergroten. Als je alle twaalf bits gebruikt om 4.096 te krijgen, verwar je de volledige adresruimte met het bereik van één segment.

Vraag 9 van 10

Een heap heeft vrije gaten van 22 en 34 bytes, gescheiden door een toegewezen blok. Headers blijven buiten beschouwing. Waarom kan een aaneengesloten toewijzing van 40 bytes mislukken?
  1. Geen van beide vrije gaten kan alleen 40 bytes bevatten.
  2. Beide gaten moeten vóór hergebruik worden weggegooid.
  3. De aanvraag is groter dan alle vrije capaciteit samen.
  4. De 56 vrije bytes liggen binnen toegewezen blokken.
Toon antwoordVerberg antwoord
Antwoord: A
De gaten zijn samen 56 bytes, maar de allocator heeft één ononderbroken bereik van 40 bytes nodig. Het grootste gat is slechts 34 bytes en het toegewezen blok verhindert samenvoegen over dat blok heen. Dit is externe fragmentatie; de vrije bytes liggen buiten toewijzingen en zijn geen interne verspilling.

Vraag 10 van 10

Een heap van 512 bytes begint op 16.000. Elke toewijzing heeft een header van 16 bytes, zonder afronding. De strategie van het eerste passende blok wijst vanaf de lage kant eerst 48 en daarna 64 bytes bruikbare gegevensruimte toe. Het eerste blok wordt vrijgegeven. Welke pointer wordt teruggegeven voor een nieuwe bruikbare gegevensruimte van 56 bytes?
  1. 16.144
  2. 16.016
  3. 16.080
  4. 16.160
Toon antwoordVerberg antwoord
Antwoord: D
De eerste twee blokken nemen 64 en 80 bytes in, dus begint het vrije resterende deel op 16.144. Het vrijgegeven eerste blok heeft in totaal slechts 64 bytes en kan geen bruikbare gegevensruimte van 56 bytes plus header bevatten. Het nieuwe blok gebruikt het resterende deel en geeft 16.160 terug; 16.144 is het adres van de header.
Set 2: Proceswisselingen en plaatsingsbeslissingen10 Oefenvragen

Sla deze les op om elk antwoord te zien en elke set te oefenen.

Vraag 1 van 10

Welk procesgebied bevat in de gebruikelijke indeling het retouradres van een gewone functieaanroep?
  1. Het codegebied.
  2. De heap.
  3. De stack.
  4. Het statische-datagebied.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 2 van 10

De heapgrens is 57.344. Een succesvolle sbrk(4096) breidt de heap uit. Wat zijn de teruggegeven waarde en de nieuwe grens?
  1. Teruggegeven 61.440; nieuwe grens 61.440.
  2. Teruggegeven 57.344; nieuwe grens 53.248.
  3. Teruggegeven 57.344; nieuwe grens 61.440.
  4. Teruggegeven 4.096; nieuwe grens 61.440.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 3 van 10

Een server geeft enkele kleine blokken vrij, maar zijn geheugengebruik zoals gemeten door het besturingssysteem blijft gelijk. Hoe kan dat normaal zijn?
  1. De bibliotheek bewaart de gebieden voor toekomstige blokaanvragen.
  2. De pointers blijven geldig omdat het gemeten geheugengebruik gelijk blijft.
  3. Het besturingssysteem stelt hergebruik van de blokken uit tot het proces eindigt.
  4. De vrijgegeven blokken moeten elk nog een actieve toewijzing bevatten.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 4 van 10

Proces R gebruikt basis 12.000 en proces S basis 28.000, beide met grens 2.000. Na een wisseling naar S bereikt een toegestane toegang op virtueel adres 640 het adres 12.640. Welke opgeslagen toestand is niet correct hersteld?
  1. De stackinhoud van het vertrekkende proces.
  2. Het basisregister van het inkomende proces.
  3. De virtuele adresbreedte van het inkomende proces.
  4. De grensgrootte van het inkomende proces.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 5 van 10

Een procesplaats van 32 KB bevat 3 KB code, 5 KB heap en 4 KB stack. Welk percentage van de gereserveerde plaats is ongebruikt?
  1. 62,5%
  2. 37,5%
  3. 75%
  4. 20%
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 6 van 10

Een stack die omlaag groeit heeft een selectorbereik van 4.096 bytes, fysieke basis 60.000 en huidige grootte 1.500. Het offsetveld is 3.200. Wat gebeurt er bij een leesbewerking?
  1. Die veroorzaakt een exceptie omdat 3.200 groter is dan 1.500.
  2. Die bereikt fysieke byte 63.200.
  3. Die bereikt fysieke byte 58.500.
  4. Die bereikt fysieke byte 59.104.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 7 van 10

Twee processen delen een codesegment met lees- en uitvoerrecht op dezelfde fysieke basis. Een van beide probeert binnen de grens naar het segment te schrijven. Wat moet gebeuren?
  1. De code van beide processen verandert op die byte.
  2. Alleen de eigen codekopie van de schrijver verandert.
  3. Een exceptie voor toegangsrechten blokkeert het schrijven.
  4. Het schrijven slaagt omdat de offset geldig is.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 8 van 10

Vrije gaten zijn in adresvolgorde 44, 18, 70 en 32 bytes groot. Headers blijven buiten beschouwing; elke toewijzing neemt het lage uiteinde. Welk beleid handelt aanvragen van eerst 30 en dan 65 bytes af als tussen de aanvragen geen blok wordt vrijgegeven: het eerste, kleinst of grootst passende blok?
  1. Het eerste en grootst passende blok slagen; het kleinst passende blok faalt.
  2. Het kleinst en grootst passende blok slagen; het eerste passende blok faalt.
  3. Alle drie de strategieën handelen beide aanvragen af.
  4. Het eerste en kleinst passende blok slagen; het grootst passende blok faalt.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 9 van 10

Het volgende passende blok ziet gaten van 16, 48, 24 en 40 bytes. Het zoeken begint bij het vierde gat en begint zo nodig weer vooraan. Headers blijven buiten beschouwing. Welk gat bedient een aanvraag van 30 bytes?
  1. Het derde gat van 24 bytes.
  2. Het tweede gat van 48 bytes.
  3. Het eerste gat van 16 bytes.
  4. Het vierde gat van 40 bytes.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 10 van 10

Een buddyallocator begint met één vrij gebied van 32 KB en laat headers buiten beschouwing. De allocator wijst twee aanvragen van 6 KB toe vanaf de laagste beschikbare offsets en geeft daarna de eerste vrij. Wat is direct daarna het grootste beschikbare blok?
  1. 24 KB
  2. 16 KB
  3. 32 KB
  4. 8 KB
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Set 3: Grenzen en allocatortoestand volgen10 Oefenvragen

Sla deze les op om elk antwoord te zien en elke set te oefenen.

Vraag 1 van 10

Een systeem controleert elk virtueel adres correct, maar gaat bij elke toegestane leesbewerking naar kernelcode. Welk virtualisatiedoel wordt het meest direct verzwakt?
  1. Transparantie van de plaatsing.
  2. Ruimte-efficiëntie.
  3. Procesisolatie.
  4. Tijdefficiëntie.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 2 van 10

Een heapblok van 16 bytes wordt vrijgegeven. Daarna wordt een oude pointer gebruikt om binnen de nog gekoppelde heap van hetzelfde proces te schrijven, zonder directe foutmelding. Wat beschrijft de schrijfbewerking het best?
  1. Een dubbele vrijgave omdat het adres opnieuw wordt gebruikt.
  2. Een geldige schrijfbewerking omdat de heap gekoppeld blijft.
  3. Gebruik na vrijgave met ongedefinieerd gedrag.
  4. Een lek omdat het blok nooit is vrijgegeven.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 3 van 10

In een segmentatiemodel beslaat een heap de fysieke bytes 10.000 tot en met 13.999. De volgende 1.000 fysieke bytes zijn bezet. Elders zijn vrije gaten van 3.000 en 4.500 bytes. De allocator moet deze heap laten groeien tot 5.000 bytes. Kan directe uitbreiding of relocatie hieraan voldoen?
  1. Relocatie werkt in het grootste gat van 4.500 bytes.
  2. Geen van beide manieren heeft een geschikt aaneengesloten bereik.
  3. Directe uitbreiding werkt omdat 1.000 extra bytes nodig zijn.
  4. Relocatie werkt omdat de gaten samen 7.500 bytes zijn.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 4 van 10

Een proces met een grens als grootte beslaat de fysieke bytes 36.000 tot en met 40.095. Een instructie op virtueel adres 3.900 probeert vanaf virtueel adres 4.096 te laden. Wat gebeurt er?
  1. Het ophalen slaagt op 39.900; het laden veroorzaakt een exceptie.
  2. Beide toegangen veroorzaken een exceptie; beide overschrijden de grootte.
  3. Beide toegangen slagen binnen het toegewezen gebied.
  4. Het ophalen slaagt op 39.900; het laden gebruikt 40.096.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 5 van 10

Een besturingssysteem kopieert een onderbroken proces van basis 22.000 naar basis 47.000 zonder de grens te veranderen. Waar moet zijn virtuele pointer 960 na hervatting uitkomen?
  1. Fysieke byte 22.960.
  2. Fysieke byte 69.960.
  3. Fysieke byte 25.960.
  4. Fysieke byte 47.960.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 6 van 10

Een virtueel adres van 14 bits gebruikt twee selectiebits en twaalf offsetbits. Selector 01 duidt een heap aan die omhoog groeit, met basis 52.000 en grootte 900. Wat gebeurt er bij een leesbewerking op virtueel adres 0x1380?
  1. Die veroorzaakt een exceptie omdat 0x1380 groter is dan grootte 900.
  2. Die bereikt fysieke byte 52.896.
  3. Die bereikt fysieke byte 52.900.
  4. Die bereikt fysieke byte 56.992.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 7 van 10

Een besturingssysteem heeft vrije gaten van 5 KB, 11 KB en 7 KB, gescheiden door toegewezen segmenten. Het moet een segment van 13 KB plaatsen zonder toegewezen segmenten te verplaatsen. Waarom kan de aanvraag mislukken?
  1. Elk segment moet dezelfde plaats van vaste grootte gebruiken.
  2. Het grootste bestaande gat is slechts 11 KB.
  3. De vrije gaten bieden samen minder dan 13 KB.
  4. Het segment moet eerst het kleinste gat gebruiken.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 8 van 10

Een heap van 1.024 bytes op 8.000 gebruikt toewijzingsheaders van 16 bytes en vrije knopen van 16 bytes. Elke vrije knoop registreert de bruikbare bytes na zichzelf. Vanaf de lage kant worden twee bruikbare gegevensruimten van 80 bytes toegewezen. Wat zijn het adres en de bruikbare grootte van de resterende vrije knoop?
  1. Adres 8.192; bruikbare grootte 816 bytes.
  2. Adres 8.192; bruikbare grootte 832 bytes.
  3. Adres 8.160; bruikbare grootte 848 bytes.
  4. Adres 8.224; bruikbare grootte 800 bytes.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 9 van 10

Een kernel wijst herhaaldelijk hetzelfde objecttype toe en het initialiseren van dat type is kostbaar. Welk ontwerp ondersteunt direct het hergebruik van geïnitialiseerde objecten?
  1. Een slabobjectcache.
  2. Een zoekpositie voor het volgende passende blok.
  3. Een grensregister met de grootte.
  4. Een statisch relocatieprogramma.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 10 van 10

Wat is in een buddygebied de offset van het partnerblok van een blok van 8 KB op de gebiedsrelatieve offset 24 KB?
  1. 8 KB
  2. 0 KB
  3. 16 KB
  4. 32 KB
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Set 4: Mislukkingen verklaren en koppelingen behouden10 Oefenvragen

Sla deze les op om elk antwoord te zien en elke set te oefenen.

Vraag 1 van 10

Een functie bevat een statische lokale teller en een gewone automatische lokale teller. De opslag van welke teller blijft tussen opeenvolgende aanroepen bestaan?
  1. Die van beide lokale tellers.
  2. Die van geen van beide lokale tellers.
  3. Die van de statische lokale teller.
  4. Die van de automatische lokale teller.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 2 van 10

Een C-string bevat 23 zichtbare tekens van elk één byte. Een programma wijst precies 23 bytes toe en kopieert de tekens gevolgd door een afsluitend nullteken. Wat gaat er mis?
  1. Het eerste teken wordt niet-geïnitialiseerd gelezen.
  2. De pointer zelf heeft 24 bytes opslag nodig.
  3. De allocator ontvangt een ongeldige vrijgaveaanvraag.
  4. Het afsluitende nullteken wordt voorbij het blok geschreven.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 3 van 10

Twee processen reserveren elk een plaats van 24 KB met een basis en een grens. Elk proces gebruikt 2 KB code, 3 KB heap en 1 KB stack. Hoeveel fysieke opslag verbruiken hun gereserveerde plaatsen samen?
  1. 12 KB
  2. 48 KB
  3. 24 KB
  4. 36 KB
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 4 van 10

Een fysieke geheugenvoorraad van 48 KB bevat drie processen. Elk heeft een virtueel bereik van 16 KB, maar gebruikt momenteel aaneengesloten code-, heap- en stackgebieden van samen 5 KB. Een vierde identiek proces meldt zich. Kunnen een basis en een grens voor de hele ruimte en afzonderlijke segmentatie het toelaten als je metadata en fragmentatie buiten beschouwing laat?
  1. Een basis en een grens kunnen dat niet; segmentatie wel.
  2. Beide methoden kunnen het vierde proces toelaten.
  3. Segmentatie kan dat niet; een basis en een grens wel.
  4. Geen van beide methoden kan het vierde proces toelaten.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 5 van 10

Een heap die omhoog groeit begint virtueel op 8.192, met grootte 2.000 en fysieke basis 40.000. Wat gebeurt er bij een leesbewerking op virtueel adres 10.192?
  1. Die bereikt fysieke byte 50.192.
  2. Die bereikt fysieke byte 41.999.
  3. Die veroorzaakt een exceptie op de uitgesloten eindgrens van het segment.
  4. Die bereikt fysieke byte 42.000.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 6 van 10

Een heap die omhoog groeit begint virtueel op 4.096 en heeft grootte 1.500. De fysieke basis verandert na relocatie van 20.000 naar 46.000. Een overzicht laat daarna zien dat virtueel adres 5.300 fysiek adres 51.300 bereikt. Welke correctie is nodig?
  1. Gebruik fysiek adres 47.204 na aftrek van het virtuele heapbegin.
  2. Gebruik fysiek adres 21.204 door de oorspronkelijke basis te herstellen.
  3. Behoud fysiek adres 51.300 omdat relocatie het volledige adres verandert.
  4. Gebruik fysiek adres 50.096 door de offset door het begin te vervangen.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 7 van 10

Een adres van 14 bits gebruikt twee selectiebits en twaalf offsetbits. Selector 11 duidt een stack aan die omlaag groeit, met fysieke basis 70.000 en huidige grootte 1.024. Lezen is toegestaan. Wat gebeurt er op virtueel adres 15.360?
  1. De toegang bereikt fysiek adres 73.072 door het positieve veld op te tellen.
  2. De toegang bereikt de laagste stackbyte, fysiek adres 68.976.
  3. De toegang veroorzaakt een exceptie omdat de absolute verplaatsing gelijk is aan de grootte.
  4. De toegang bereikt fysiek adres 68.975 als laatste toegestane byte.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 8 van 10

Een allocator rondt elke aanvraag voor bruikbare gegevensruimte af op een veelvoud van 32 bytes en laat headers buiten beschouwing. Welke soort en hoeveelheid verspilling veroorzaakt een aanvraag van 70 bytes?
  1. 32 bytes externe fragmentatie.
  2. 6 bytes interne fragmentatie.
  3. 26 bytes externe fragmentatie.
  4. 26 bytes interne fragmentatie.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 9 van 10

Een heap van 100 bytes heeft toegewezen blokken op bytes 20–39 en 60–79; alle andere bytes zijn vrij. Het eerste toegewezen blok wordt vrijgegeven en aangrenzende vrije blokken worden samengevoegd. Kan een aanvraag van 65 bytes daarna slagen als je metadata buiten beschouwing laat?
  1. Nee; het grootste vrije bereik is 40 bytes.
  2. Ja; er zijn in totaal 80 bytes vrij.
  3. Ja; door één blok vrij te geven wordt de hele heap samengevoegd.
  4. Nee; het grootste vrije bereik is 60 bytes.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 10 van 10

Gaten zijn in adresvolgorde 26, 58 en 42 bytes groot. Headers blijven buiten beschouwing. Het eerste en het kleinst passende blok wijzen elk eerst 24 en daarna 40 bytes toe, zonder vrijgaven. Welk beleid kan daarna een aanvraag van 55 bytes afhandelen?
  1. Geen van beide kan de aanvraag van 55 bytes afhandelen.
  2. Het eerste passende blok kan dat; het kleinst passende blok niet.
  3. Het kleinst passende blok kan dat; het eerste passende blok niet.
  4. Beide kunnen de aanvraag van 55 bytes afhandelen.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Set 5: Gecombineerd redeneren over vertaling en toewijzing10 Oefenvragen

Sla deze les op om elk antwoord te zien en elke set te oefenen.

Vraag 1 van 10

Een ontwerp geeft twee processen één fysiek alleen-lezen-codegebied en afzonderlijke beschrijfbare gebieden. Aan welke virtualisatiedoelen kan dit voldoen terwijl het ruimte bespaart?
  1. Transparantie vereist voor beide beschrijfbare gedeelde code.
  2. Ruimte-efficiëntie vereist dat alle toegangscontroles verdwijnen.
  3. Zowel transparantie als isolatie kan behouden blijven.
  4. Isolatie blijft alleen behouden met afzonderlijke codekopieën.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 2 van 10

Een gesegmenteerde heap beslaat de fysieke bytes 20.000 tot en met 23.999, gevolgd door bezet geheugen. De heapgrens is virtueel 10.000. Het besturingssysteem verplaatst de heap naar een vrij gebied van 6.000 bytes op fysiek adres 40.000 en kent sbrk(1500) met succes toe. Wat geeft sbrk terug en waar staat de eerste bestaande byte van de heap nu?
  1. Teruggegeven 11.500; bestaande eerste byte op 40.000.
  2. Teruggegeven 10.000; bestaande eerste byte op 40.000.
  3. Teruggegeven 41.500; bestaande eerste byte op 40.000.
  4. Teruggegeven 10.000; bestaande eerste byte op 20.000.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 3 van 10

Een programma in gebruikersmodus probeert zijn basisregister in te stellen op het fysieke begin van de kernel. Wat moet de processor doen?
  1. De gevraagde basis als een gewone virtuele pointer behandelen.
  2. De basis instellen en vertrouwen op de bestaande groottecontrole.
  3. Een exceptie veroorzaken voor de geprivilegieerde bewerking.
  4. De basis alleen voor de volgende leesbewerking van dit programma instellen.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 4 van 10

Een adres van 14 bits heeft twee selectiebits en twaalf offsetbits. Selector 01 duidt een heap aan die omhoog groeit, met basis 26.000 en grootte 1.200. De grootte groeit later naar 1.400. Hoe verandert een leesbewerking op virtueel adres 0x1500?
  1. Die verandert van een exceptie in toegang tot fysieke byte 27.280.
  2. Die blijft toegestaan op fysieke byte 27.280.
  3. Die blijft een exceptie veroorzaken omdat de selector verandert.
  4. Die verandert van een exceptie in toegang tot fysieke byte 31.376.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 5 van 10

Welke koppelingsgegevens moet het besturingssysteem corrigeren voor verplaatste segmenten nadat het processen heeft onderbroken en hun fysieke segmenten heeft gecompacteerd?
  1. Hun fysieke bases.
  2. Hun virtuele pointers.
  3. Hun toegangsrechten.
  4. Hun codeoffsets.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 6 van 10

Het fysieke geheugen bevat toegewezen segment A op bytes 0 tot en met 3.999, een vrij gat op bytes 4.000 tot en met 5.999, toegewezen segment B op bytes 6.000 tot en met 8.999 en een vrij gat op bytes 9.000 tot en met 11.999. B mag worden verplaatst. Waarheen kan B worden verplaatst zodat daarna een nieuw segment van 4.500 bytes past?
  1. Verplaats B naar bytes 5.000 tot en met 7.999.
  2. Verplaats B naar bytes 8.000 tot en met 10.999.
  3. Verplaats B naar bytes 7.000 tot en met 9.999.
  4. Verplaats B naar bytes 4.000 tot en met 6.999.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 7 van 10

Een heap van 640 bytes begint op 24.000. Toewijzingen hebben headers van 16 bytes en worden niet afgerond. Vanaf de lage kant worden achtereenvolgens bruikbare gegevensruimten van 64, 96 en 64 bytes toegewezen. De eerste twee worden vrijgegeven en samengevoegd. Daarna handelt het eerste passende blok een aanvraag voor 144 bytes bruikbare gegevensruimte af. Welke pointer en welke totale vrije rest binnen dat samengevoegde blok ontstaan?
  1. Pointer 24.016; rest 32 bytes.
  2. Pointer 24.016; rest 48 bytes.
  3. Pointer 24.096; rest 32 bytes.
  4. Pointer 24.000; rest 48 bytes.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 8 van 10

Gaten zijn in adresvolgorde 36, 64 en 48 bytes groot. Headers blijven buiten beschouwing. Eerst komt een aanvraag van 32 bytes, daarna een aanvraag van 60 bytes. Het volgende passende blok begint de eerste zoekactie bij het tweede gat en gaat verder bij de rest van dat gat. Welk beleid kan beide aanvragen afhandelen: het kleinst passende blok of dit volgende passende blok?
  1. Geen van beide kan beide aanvragen afhandelen.
  2. Het kleinst passende blok kan dat; het volgende passende blok niet.
  3. Beide kunnen beide aanvragen afhandelen.
  4. Het volgende passende blok kan dat; het kleinst passende blok niet.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 9 van 10

Een buddyallocator laat overhead buiten beschouwing in een gebied van 32 KB. De allocator wijst 7 KB toe op offset 0, nog eens 7 KB op offset 8 KB en 12 KB op offset 16 KB. Beide toewijzingen van 7 KB worden vrijgegeven. Waarom kan de allocator niet aan een nieuwe aanvraag van 20 KB voldoen?
  1. De twee vrijgegeven toewijzingen leveren slechts 14 KB en kunnen dus geen blok van 16 KB vormen.
  2. Het vereiste blok van 32 KB kan niet ontstaan zolang het bovenste partnerblok van 16 KB is toegewezen.
  3. Het beschikbare blok van 16 KB komt slechts 4 KB tekort voor de vereiste blokgrootte.
  4. De onderste vrije blokken blijven gescheiden omdat samenvoegen een nieuwe splitsing vereist.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 10 van 10

Een proces met een basis en een grens heeft fysieke basis 11.500. Welk fysiek adres hoort bij zijn toegestane virtuele adres 700?
  1. 10.800
  2. 700
  3. 11.500
  4. 12.200
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Kom je niet uit je eigen opgave? Huiswerkhulp

Kernbegrippen

73 Kernbegrippen, elk met een definitie

A

Aaneengesloten geheugengebied
Een aaneengesloten geheugengebied is een ononderbroken interval van aangrenzende byteadressen, dat voor een volledig proces nodig is bij de eenvoudige methode met een basis en een grens.
Afzonderlijke fysieke gaten kunnen samen niet één gebied bevatten dat aaneengesloten moet zijn.
Adresruimte
Een adresruimte is het geheugenbeeld dat beschikbaar is voor één actief proces, inclusief gebieden voor instructies, data, heapblokken en functieaanroepen.
Twee processen kunnen dezelfde adresruimte-indeling gebruiken terwijl hun bytes verschillende fysieke gebieden innemen.
Afronding van de toewijzingsgrootte
Afronding van de toewijzingsgrootte verhoogt een aangevraagde grootte tot een ondersteunde grootte of uitlijning, zodat eventuele overtollige capaciteit binnen het toegewezen blok blijft.
Als je 21 bytes afrondt op een blok van 32 bytes, blijven 11 bytes interne verspilling over.
Anonieme geheugenkoppeling
Een anonieme geheugenkoppeling is een met nullen gevuld virtueel geheugengebied dat wordt aangemaakt zonder de opslag van het gebied aan een bestand te koppelen.
Een allocator kan via een anonieme mmap-aanvraag een groot afzonderlijk gebied verkrijgen.
Arena
Een arena is een afzonderlijk beheerd allocatorgebied dat naast andere arena's wordt gebruikt om concurrentie om één gedeelde toewijzingsvergrendeling te verminderen.
Threads die verschillende arena's gebruiken, kunnen veel aanvragen afhandelen zonder op dezelfde allocatorvergrendeling te wachten.

B

Basisregister
Een basisregister bevat bij gewone relocatie omhoog het fysieke beginadres van een gebied, waarbij geldige virtuele offsets worden opgeteld.
Bij fysieke basis 12.000 bereikt virtuele offset 200 na een succesvolle controle fysieke byte 12.200.
Beheer van vrije ruimte
Beheer van vrije ruimte houdt beschikbare blokken bij en kiest waar aanvragen terechtkomen, op de schaal van een procesheap of fysieke gebieden van het besturingssysteem.
Een allocator moet één voldoende groot blok vinden, ook wanneer het totale aantal vrije bytes groter is dan de aanvraag.
Beleid
Beleid is een regel om tussen mogelijke acties te kiezen, zoals welk vrij fysiek gebied een nieuw aangemaakt proces moet bevatten.
Het kleinste voldoende grote gat kiezen is plaatsingsbeleid dat door een geheugenbeheerder wordt toegepast.
Beschermingsbits
Beschermingsbits geven aan welke bewerkingen op een gebied zijn toegestaan, zoals lezen, schrijven of uitvoeren, en worden afzonderlijk van de grenzen gecontroleerd.
Een geldige codeoffset veroorzaakt toch een exceptie als het proces probeert te schrijven naar opslag met lees- en uitvoerrecht.
Bitmasker
Een bitmasker selecteert gekozen bitposities met een bitsgewijze bewerking, zodat hardware of code adresvelden kan scheiden.
De toepassing van va & 0x0FFF behoudt twaalf lage bits en wist de twee segmentbits van een adres van veertien bits.
brk
brk stelt de eindgrens van de traditionele heap in op een opgegeven adres, zodat de allocator de grootte van dat gebied kan wijzigen.
De allocator beheert de administratie van de heapgrens, dus moet toepassingscode blokken via de bibliotheek aanvragen.
Bruikbare gegevensruimte
De bruikbare gegevensruimte is het deel van een toegewezen blok dat beschikbaar is voor het programma, exclusief de header en andere administratie van de allocator.
Een bruikbare gegevensruimte van 96 bytes met een header van zestien bytes neemt minstens 112 bytes van het beheerde gebied in.
Buddyallocator
Een buddyallocator beheert blokken met een macht van twee als grootte, splitst ze in gelijke helften en voegt een vrijgegeven blok alleen samen met het bijbehorende vrije partnerblok.
Een aanvraag van 10 KB krijgt een blok van 16 KB, zodat 6 KB binnen die toewijzing ongebruikt blijft.
Bufferoverloop
Een bufferoverloop is een schrijfbewerking voorbij het toegewezen einde van een buffer, die aangrenzende data of de administratie van de allocator kan beschadigen.
Een string kopiëren naar ruimte zonder byte voor het afsluitende nullteken kan de buffer doen overlopen.

C

calloc
calloc is een toewijzingsfunctie uit de C-bibliotheek die opslag gevuld met nulbytes levert, anders dan de niet op nul gezette opslag die malloc teruggeeft.
Een buffer die met calloc is verkregen, begint met nulbytes voordat het programma data schrijft.
Concurrentie om vergrendelingen
Concurrentie om vergrendelingen ontstaat wanneer gelijktijdige threads wachten op toegang tot dezelfde beschermde allocatortoestand, waardoor de voortgang van parallelle toewijzing wordt beperkt.
Lokale caches en meerdere arena's verminderen het aantal toewijzingen waarvoor één gemeenschappelijke vergrendeling nodig is.
Contextwisseling
Een contextwisseling vervangt de actieve CPU-toestand van het actieve proces door de opgeslagen toestand van een ander proces, inclusief de waarden voor geheugenvertaling.
Als de algemene registers van het volgende proces worden hersteld zonder de basis ervan, blijft het verkeerde geheugenbeeld actief.

D

Delen van code
Delen van code laat processen één fysieke kopie van onveranderlijke instructies uitvoeren terwijl hun beschrijfbare procestoestand gescheiden blijft.
Twee processen kunnen dezelfde alleen-lezen-codebasis gebruiken met verschillende heap- en stackbases.
Dubbele vrijgave
Een dubbele vrijgave is een poging om dezelfde toewijzing opnieuw vrij te geven nadat die al is vrijgegeven, in strijd met de eigendomsregels van de allocator.
Tweemaal free aanroepen via gekopieerde pointers naar één blok kan de toestand van de toewijzingsbibliotheek beschadigen.
Dunbezette adresruimte
Een dunbezette adresruimte heeft grote ongebruikte virtuele gaten tussen gebruikte gebieden, waardoor fysieke toewijzing van het hele bereik ruimte verspilt.
Door heap en stack in onafhankelijke segmenten te scheiden voorkom je dat het lege gat ertussen wordt gereserveerd.
Dynamische relocatie
Dynamische relocatie vertaalt adressen tijdens de uitvoering, zodat het besturingssysteem fysieke opslag kan verplaatsen terwijl virtuele pointerwaarden behouden blijven.
Door een onderbroken proces te verplaatsen en de basis te wijzigen, bereiken de bestaande pointers de gekopieerde bytes.

E

Eerste passende blok
De strategie van het eerste passende blok kiest het eerste voldoende grote blok in lijstvolgorde en stopt met zoeken, zodat de plaatsing afhangt van de volgorde van die lijst.
Bij gaten van 60, 28 en 44 bytes in adresvolgorde gebruikt een aanvraag van 25 bytes het gat van 60 bytes.
Exceptieafhandelaar
Een exceptieafhandelaar is code van het besturingssysteem die wordt uitgevoerd nadat hardware een gebeurtenis zoals een ongeldig geheugenadres of een verboden instructie detecteert.
Een grensoverschrijding draagt de besturing over aan de geregistreerde afhandelaar, die het proces meestal beëindigt.
Externe fragmentatie
Bij externe fragmentatie blijft vrij geheugen achter in afzonderlijke gaten die te klein zijn voor een aaneengesloten aanvraag, ondanks voldoende totale vrije capaciteit.
Gaten van 7 KB en 9 KB kunnen niet één segment van 12 KB bevatten, hoewel ze samen 16 KB zijn.

F

Fijnmazige segmentatie
Fijnmazige segmentatie verdeelt een adresruimte in veel kleinere, onafhankelijk beschermde gebieden die via een segmenttabel worden beschreven.
Een afzonderlijke gegevensstructuur kan in een fijnmazig ontwerp eigen regels voor delen en toegang hebben.
free
free is een C-bibliotheekfunctie die een nog toegewezen blok teruggeeft aan de allocator; NULL doorgeven is toegestaan en heeft geen effect.
De allocator kan een vrijgegeven blok hergebruiken, ook als het geheugengebruik van het proces zoals gemeten door het besturingssysteem gelijk blijft.
Fysiek adres
Een fysiek adres duidt een locatie in de geheugenhardware aan die na vertaling van een virtuele geheugentoegang van een proces wordt bereikt.
Het virtuele adres 800 van twee processen kan op dezelfde machine naar verschillende fysieke adressen worden vertaald.

G

Geheugenbeheereenheid
De geheugenbeheereenheid is processorhardware die virtuele adressen vertaalt en toegangsregels controleert met een door het besturingssysteem ingestelde toestand.
De MMU vertaalt het ophalen van een instructie zonder voor elke instructie een routine van het besturingssysteem aan te roepen.
Geheugencompactie
Geheugencompactie verplaatst gebruikte fysieke gebieden naast elkaar en werkt hun koppelingen bij om verspreide vrije capaciteit samen te brengen in een groter gat.
Het besturingssysteem kopieert segmenten en wijzigt hun bases terwijl programma's dezelfde virtuele adressen blijven gebruiken.
Geheugenlek
Een geheugenlek ontstaat wanneer toegewezen opslag niet meer wordt vrijgegeven wanneer dat nodig is, vaak doordat het programma de laatste bruikbare pointer ernaar verliest.
Een functie die terugkeert zonder haar enige heappointer te bewaren of het blok vrij te geven, laat een onbereikbaar blok achter.
Geprivilegieerde instructie
Een geprivilegieerde instructie is een bewerking die alleen in kernelmodus is toegestaan, zodat gebruikersprogramma's beschermde machinetoestand niet kunnen wijzigen.
Een poging om vanuit gebruikersmodus het basisregister bij te werken veroorzaakt een exceptie in plaats van de koppeling te wijzigen.
Gescheiden vrijelijsten
Gescheiden vrijelijsten houden afzonderlijke voorraden bij voor geselecteerde blokgroottes, zodat aanvragen van veelvoorkomende groottes zonder algemene zoekactie kunnen worden afgehandeld.
Een voorraad blokken van 64 bytes handelt herhaalde aanvragen uit die grootteklasse snel af.
Grensregister
Een grensregister begrenst een procesgebied en bevat in dit model de grootte ervan in bytes; geldige virtuele adressen moeten strikt kleiner zijn dan die grootte.
Grens 4.096 staat virtuele byte 4.095 toe, maar wijst toegang op virtueel adres 4.096 af.
Groeirichting
De groeirichting van een segment legt vast of het geldige gebied omhoog vanaf een eerste byte of omlaag vanaf een bovengrens loopt.
De richting van de stack verandert hoe hardware het lage adresveld interpreteert voordat de basis wordt opgeteld.
Grofmazige segmentatie
Grofmazige segmentatie verdeelt een adresruimte in enkele grote gebieden, doorgaans code, heap en stack, met een afzonderlijke vertaaltoestand.
Een kleine groep segmentregisterparen kan de klassieke procesindeling met drie gebieden beschrijven.
Grootst passend blok
De strategie van het grootst passende blok kiest het grootste vrije blok om een bruikbare rest over te houden, maar kan een gat gebruiken dat nodig is voor latere grote aanvragen.
Een kleine aanvraag die in het enige grote gat wordt geplaatst, kan de volgende grotere toewijzing laten mislukken.

H

Heap
De heap is een procesgebied voor blokken die tijdens de uitvoering worden aangevraagd en waarvan de levensduur door toewijzing en vrijgave wordt beheerd.
Een object op de heap kan langer bestaan dan de functie die de opslag oorspronkelijk aanvroeg.
Heapgrens
De heapgrens is de virtuele grens direct na het einde van de traditionele heap, die wordt verplaatst wanneer dat heapgebied wordt uitgebreid of verkleind.
Als de heapgrens 30.000 is, ligt byte 30.000 buiten de heap totdat de grens omhoog wordt verplaatst.

I

Impliciete segmentselectie
Impliciete segmentselectie kiest de vertaaltoestand op basis van de manier waarop een adres is gevormd, zoals het ophalen van een instructie of gebruik van de stackpointer.
Het ophalen van een instructie gebruikt codevertaling zonder dat een expliciet segmentnummerveld in het adres nodig is.
Ingebedde vrijelijstknoop
Een ingebedde vrijelijstknoop slaat de grootte en verwijzingen van een vrij blok in het blok zelf op en hergebruikt zo beheerd geheugen voor de administratie.
Na het opsplitsen van een vrij blok bevatten de eerste bytes van de vrije rest de knoop, in plaats van een afzonderlijke toewijzing buiten de heap.
Interne fragmentatie
Interne fragmentatie is ongebruikte capaciteit binnen een toegewezen gebied, doordat meer ruimte is gereserveerd dan de nuttige inhoud nodig heeft.
Een procesplaats van 16 KB met 4 KB nuttige inhoud verspilt 12 KB binnen de toewijzing.
Isolatie
Isolatie is de afgedwongen scheiding tussen processen, zodat ongeoorloofde toegang een ander proces of de kernel niet kan lezen of beschadigen.
Hardware wijst toegang van een teksteditor buiten het toegestane gebied af voordat die een ander proces beschadigt.

K

Kleinst passend blok
De strategie van het kleinst passende blok kiest het kleinste vrije blok dat groot genoeg is voor een aanvraag. Dit beperkt de directe rest, maar creëert soms kleine snippers.
Bij gaten van 60, 28 en 44 bytes neemt een aanvraag van 25 bytes bij het kleinst passende blok het gat van 28 bytes.

L

Lees- en uitvoerrecht
Lees- en uitvoerrecht staat toe dat de bytes van een gebied worden gelezen en als instructies worden uitgevoerd, maar verbiedt schrijfbewerkingen die ze zouden wijzigen.
Een gedeeld codesegment staat het ophalen van instructies toe, maar wijst een poging af om naar de bytes te schrijven.
Lezen van niet-geïnitialiseerd geheugen
Bij lezen van niet-geïnitialiseerd geheugen worden opgeslagen data gebruikt voordat het programma de waarde ervan heeft vastgesteld, bijvoorbeeld bij het lezen van niet op nul gezette bytes die malloc teruggeeft.
Voldoende ruimte toewijzen voor een geheel getal geeft dat getal geen betekenisvolle beginwaarde.

M

malloc
malloc is een C-bibliotheekfunctie die een blok met een grootte in bytes aanvraagt en het adres ervan teruggeeft, of NULL bij mislukking, zonder de inhoud op nul te zetten.
Een aanvraag voor zes gehele getallen gebruikt malloc(6 * sizeof(int)) om rekening te houden met de elementgrootte.
Mechanisme
Een mechanisme is de implementatie die een bewerking uitvoert, zoals hardware die bij geheugentoegang de grens controleert en een basis optelt.
De regel voor het kiezen van een gat veranderen vereist niet dat het vertaalmechanisme van de hardware wordt vervangen.
munmap
munmap verwijdert een gekoppeld gebied uit de adresruimte van een proces, anders dan wanneer een klein blok voor hergebruik aan een voorraad van de bibliotheek wordt teruggegeven.
Als een grote, afzonderlijk gekoppelde toewijzing wordt vrijgegeven, kan de allocator mogelijk de onderliggende geheugenkoppeling verwijderen.

N

Negatieve verplaatsing
Een negatieve verplaatsing meet een toegang tot een segment dat omlaag groeit vanaf de bovengrens en wordt verkregen door de volledige bereikgrootte af te trekken.
Een veld van 3.000 in een stackbereik van 4.096 bytes geeft een verplaatsing van −1.096.
Nog niet vrijgegeven geheugentoewijzing
Een nog niet vrijgegeven geheugentoewijzing is een blok dat nog van het programma is en niet is vrijgegeven, waarvan een gewone C-allocator het teruggegeven adres moet behouden.
Een toegewezen blok tussen vrije gaten verhindert dat de allocator die gaten over het blok heen samenvoegt.

O

Offsetveld
Een offsetveld is het deel van een gesegmenteerd adres dat de plaats van een byte binnen een selectorbereik bepaalt, vóór een eventuele aanpassing voor groei omlaag.
Een veld van twaalf bits staat 4.096 posities toe, ook als het gekozen segment momenteel minder bytes gebruikt.
Ongeldige pointer naar verlopen opslag
Een ongeldige pointer naar verlopen opslag is een pointer naar opslag waarvan de levensduur is geëindigd, zoals een heapblok dat al aan de allocator is teruggegeven.
Lezen via een oude pointer nadat het blok is vrijgegeven, is een fout door gebruik na vrijgave.
Opsplitsen van vrije blokken
Bij opsplitsen van vrije blokken wordt een vrij blok verdeeld in een toegewezen deel en een resterend vrij deel, zodat de rest voor latere aanvragen behouden blijft.
Een aanvraag van 24 bytes uit een blok van 80 bytes laat 56 bytes over als je headers buiten beschouwing laat.

P

Partnerblok
Een partnerblok is de even grote partner die ontstaat door één ouderblok te splitsen; je vindt het door de offset van de partner met XOR te combineren met de blokgrootte.
Twee aangrenzende blokken van 8 KB kunnen alleen worden samengevoegd als ze de partners van één splitsing van 16 KB zijn.
Procesbesturingsblok
Een procesbesturingsblok is een registratie van het besturingssysteem met de opgeslagen uitvoeringstoestand van een proces, inclusief vertaalwaarden wanneer het proces inactief is.
Het besturingssysteem herstelt de opgeslagen basis en grens van het volgende proces vanuit het procesbesturingsblok.

R

realloc
realloc is een C-bibliotheekfunctie die de grootte van een toegewezen blok wijzigt en de inhoud kan verplaatsen naar een blok op een ander adres.
Een groeiende buffer kan worden verplaatst wanneer direct na het huidige blok geen ruimte beschikbaar is.

S

Samenvoegen van aangrenzende vrije blokken
Samenvoegen van aangrenzende vrije blokken verenigt aangrenzende vrije blokken tot een groter vrij blok zonder toegewezen blokken te verplaatsen, zodat minder afzonderlijke vrijelijstvermeldingen overblijven.
Door een tussenliggend blok vrij te geven kunnen twee aangrenzende gaten mogelijk één bruikbaar toewijzingsbereik vormen.
sbrk
sbrk verandert de heapgrens met een aangevraagd aantal bytes en geeft bij succes de oude grens terug; een wijziging met nul geeft de huidige grens.
Een succesvolle sbrk(1024) bij heapgrens 20.000 geeft 20.000 terug en laat de nieuwe grens op 21.024 achter.
Segment
Een segment is een aaneengesloten logisch gebied van een adresruimte met een onafhankelijke vertaaltoestand, zoals een code-, heap- of stackgebied.
Het heapsegment kan worden verplaatst zonder dat het codesegment naar dezelfde fysieke omgeving hoeft te verhuizen.
Segmentatie
Segmentatie vertaalt logische gebieden onafhankelijk van elkaar met een toestand per segment, zodat de fysieke plaatsing kan verschillen van de virtuele indeling.
Een virtuele ruimte van 16 KB kan voor de drie momenteel gebruikte segmenten slechts 7 KB fysiek geheugen gebruiken.
Segmentatiefout
Een segmentatiefout is een gemelde ongeldige geheugentoegang; de naam blijft in gebruik, ook wanneer de machine geen klassieke segmentatie gebruikt.
Een schending van toegangsrechten kan een segmentatiefout opleveren, ook als de offset binnen het gebied ligt.
Segmentoffset
Een segmentoffset bepaalt de plaats van een byte ten opzichte van de virtuele oorsprong van het segment; bij vertaling omhoog wordt de gecontroleerde offset bij de fysieke basis opgeteld.
Virtuele byte 5.100 in een heap die op 4.096 begint, heeft vóór fysieke relocatie offset 1.004.
Segmentselector
Een segmentselector bepaalt welke vertaaltoestand van een segment geldt voor een expliciet virtueel adres, los van het offsetveld.
Bij een splitsing van veertien bits kunnen de voorste bits 01 de heap kiezen, terwijl de laagste twaalf bits de byte daarin bepalen.
Segmenttabel
Een segmenttabel slaat vertaal- en beschermingsinformatie voor veel segmenten op en ondersteunt zo meer gebieden dan enkele vaste registerparen.
Bij fijnmazige segmentatie worden de basis, grootte en toegangsregels van elk geselecteerd gebied in een tabel opgezocht.
Slaballocator
Een slaballocator houdt caches van terugkerende objecttypen in slabs bij, zodat objecten snel kunnen worden hergebruikt en minder herhaalde initialisatie nodig is.
Een kernel kan een volgende procesdescriptor uit zijn objectcache halen in plaats van een nieuwe op te bouwen.
Stack
Een stack is een gebied voor de toestand van functieaanroepen, waaronder retouradressen en gewone lokale variabelen in het gebruikelijke uitvoeringsmodel.
Bij terugkeer uit een functie komt het stackframe vrij, maar niet een heapblok dat de functie heeft toegewezen.
Statisch geheugen
Statisch geheugen is opslag voor globale en statische lokale variabelen die gedurende de hele uitvoering van het programma blijft bestaan, onafhankelijk van afzonderlijke aanroepen.
Een statische lokale teller behoudt zijn waarde tussen aanroepen in plaats van bij elk stackframe te verdwijnen.
Statische relocatie
Statische relocatie herschrijft adressen bij het laden van een programma zodat ze bij de fysieke plaatsing passen, zonder zelf bescherming van geheugentoegang af te dwingen.
Als de laadlocatie verandert, moet het laadprogramma opgenomen adressen voor de nieuwe positie herschrijven.

T

Toewijzingsheader
Een toewijzingsheader is metadata vóór een teruggegeven bruikbare gegevensruimte, waarin meestal de grootte staat zodat de allocator een latere free kan verwerken.
Met een header van zestien bytes leidt een pointer naar de bruikbare gegevensruimte op 8.016 terug naar metadata op 8.000.
Transparantie
Transparantie is de eigenschap waardoor een programma zijn eigen geheugenbeeld kan gebruiken zonder de achterliggende fysieke plaatsing of het delen te beheren.
Een proces behoudt dezelfde virtuele pointers nadat het besturingssysteem zijn fysieke geheugen heeft gereloceerd.

V

Virtueel adres
Een virtueel adres duidt een byte aan in het geheugenbeeld van een proces en wordt vertaald voordat de processor fysiek geheugen benadert.
Een pointer die een C-programma afdrukt, toont een virtueel adres, ook wanneer het besturingssysteem de fysieke opslag verplaatst.
Volgende passende blok
De strategie van het volgende passende blok zoekt vanaf een opgeslagen positie naar een voldoende groot blok en begint zo nodig weer vooraan in plaats van telkens bij het begin te starten.
Als de zoekactie bij het derde gat van een lijst begint in plaats van bij het eerste, kan de keuze veranderen, ook als de vrije groottes gelijk zijn gebleven.
Vrijelijst
Een vrijelijst registreert beschikbare blokken en hun groottes, met verwijzingen of een andere structuur waarmee de allocator vermeldingen kan vinden en bijwerken.
Na het opsplitsen van een blok blijft de ongebruikte rest op de vrijelijst als die een bruikbare vrije knoop kan bevatten.

Over deze les

Door StudeliFout melden

Maak je eigen Studiemateriaal

Maak van je aantekeningen, slides en documenten Leermodules, Oefenvragen, Flashcards en 6 andere tools.

Aan de slag