Minneshantering

En aktiv process (ett exekverande program) kräver utrymme i datorns primärminne, eftersom programinstruktioner och data måste befinna sig i arbetsminnet (eller i processorregister) vid bearbetningen av datorns processor(er).

Ett effektivt fungerande datasystem förutsätter en effektiv och säker minneshantering. Det är t ex slöseri med processortid att låta processorn vara overksam i väntan på in- och utmatning, eftersom processorn då skulle kunna utföra något annat (exekvera en annan process). Minneshanteringen åligger normalt operativsystemet, ofta tillsammans med speciell hårdvara.

Minneshanteringssystem finns av två slag: Sådana som förflyttar processer (eller delar av processer) mellan datorns arbetsminne och sekundärminne (vanligen diskar) och system som inte gör detta.

Minneshantering utan användning av sekundärminne

Det säger sig nästan självt att minneshantering som enbart inbegriper primärminne är betydligt mindre komplicerad än minneshantering som även utnyttjar sekundärminne. Så länge som allt ryms i primärminnet är minneshanteringen också effektiv (i betydelsen snabb).

Den allra mest primitiva typen av minneshantering påträffar vi i enkla operativsystem som MS-DOS, där en process i taget exekveras (monoprogrammering) och där den aktuella processen normalt får utnyttja allt ledigt primärminne (förutom det som behövs av själva operativsystemet). Denna typ av minneshantering, som snart tillhör historien, har främst förekommit i enanvändarsystem, såsom persondatorer.

I större datorer har dock monoprogrammering knappast existerat sedan 1960. I sådana datorer, och i synnerhet fleranvändarsystem, dominerar i stället multiprogrammering, med flera processer samtidigt i primärminnet.

Minneshantering med användning av sekundärminne

Med stora program eller med många processer aktiva samtidigt nås förr eller senare en punkt där arbetsminnet inte räcker till för alla processer och om datorn skall klara även sådana situationer, då måste sekundärminne utnyttjas som hjälpminne. Att lösa detta praktiskt är dock inte enkelt, ty sekundärminne är mycket långsammare än primärminne och därför krävs förfinade tekniker för att få goda prestanda. Det finns heller ingen minneshanteringsteknik som är bäst under alla omständigheter: En variant som ger ypperliga prestanda i ett visst sammanhang, kan fungera uselt i ett annat. Därför har det utvecklats flera olika tekniker och det pågår ständigt forskning och arbete med att förbättra och vidareutveckla dessa tekniker. Mer avancerade operativsystem utnyttjar också ofta två eller flera tekniker för att uppnå bästa möjliga prestanda under olika förhållanden.

Överlagring

Överlagring gör det möjligt att köra ett program som är för stort för att i sin helhet rymmas i primärminnet genom att programmet delas upp i mindre delar, s k overlayer, som läses in i arbetsminnet vid behov. De överlagringsmoduler som inte behövs får ligga kvar på sekundärminnet.

Bytet mellan overlayer hanteras av programmet självt och därför måste en del av programmet (i synnerhet den som hanterar själva överlagringsförfarandet) ligga kvar i primärminnet. En speciellt reserverad del av primärminnet används som overlayarea, som således måste kunna rymma den största av overlayerna, vilka hämtas in till detta minnesutrymme vid behov.

Eftersom det är applikationen själv (inte operativsystemet) som hanterar överlagringen, måste programkonstruktörerna lösa de problem som hänger samman med överlagringen. För att få en "optimal" overlayindelning kan det krävas mycket analys och praktiska tester, men många gånger faller det sig också ganska naturligt, t ex att i en ordbehandlare sammanföra utskriftsrutiner till en overlay, rutiner för att skapa sakregister i en annan osv.

Överlagringstekniken fungerar bra i enanvändarsystem där enbart en applikation i taget körs, vilket gäller operativsystemet MS-DOS och dess föregångare CP/M. System där flera processer utnyttjar en dators resurser kräver mer sofistikerad minneshantering, som dessutom bör åligga operativsystemet och inte de enskilda applikationerna.

Minnesbyte (swapping)

Denna teknik innebär att en hel process kastas ("swappas") mellan arbets- och sekundärminnet, där ofta en reserverad plats ("swap area") utnyttjas för att lagra de undansparade processerna. Minnesbytet hanteras av operativsystemet som kan ha olika kriterier (algoritmer) för att avgöra när en viss process ska stoppas och lagras på sekundärminnet.

Många s k batchsystem och de tidiga tidsdelande fleranvändarsystemen använde sig av minnesbyte och används även i moderna operativsystem, även om man där först och främst utnyttjar modernare och effektivare tekniker.

Virtuellt minne

Detta är en samlingsbeteckning för flera olika minneshanteringstekniker. Gemensamt för dem alla är att ett program kan utnyttja ett betydligt större primärminne än det som finns fysiskt tillgängligt och att minneshanteringen helt och hållet hanteras av operativsystemet och datorns hårdvara. Applikationsprogrammen behöver inte alls befatta sig med minneshanteringen (man säger att minneshanteringen är "transparent" eller "genomskinlig" för programmet). De virtuella adresser som programmen använder översätts till fysiska adresser av speciell hårdvara (en s k MMU = Memory Management Unit, som vanligen är inbyggd i centralprocessorn) och/eller operativsystemet.

De två vanligaste teknikerna att åstadkomma virtuellt minne är sidindelning (paging) och segmentering.

Vid sidindelning delas det virtuella minnet (program och data) in i lika stora sidor med fast storlek (t ex 4 KB). De virtuella sidorna numreras och sidnumren utnyttjas som ett slags index i sidtabeller som håller reda på kopplingen mellan de virtuella sidorna och arbetsminnet (dvs vilka sidor som finns i primärminnet och var). När ett s k sidfel inträffar, dvs när en sidgräns överskrids och den nya sidan inte ligger i arbetsminnet, sparas en "gammal" sida undan på sekundärminnet och den önskade sidan läses in.

Vid segmentering delas program och data in i logiskt sammanhörande block, som kan vara olika stora. Segmentering underlättar hantering av datastrukturer vars storlek är föränderlig (dvs ökar och/eller minskar). Det underlättar också delning av data eller rutiner mellan olika processer, bl a i form av dynamiskt länkade/delade bibliotek (DLL:er som de brukar kallas i Windows 95/NT).

Moderna operativsystem utnyttjar ofta båda teknikerna.

Vid virtuell minneshantering finns flera problem som måste lösas för att primärminnet skall utnyttjas på bästa sätt:

  1. När skall nästa programavsnitt eller data hämtas till primärminnet?
  2. Var skall inkommande programavsnitt eller data placeras i primärminnet?
  3. Vilken sida eller vilket segment skall bytas ut när man behöver plats för en annan sida/segment?

Vi skall här bara kortfattat beröra andra och tredje punkten.

I ett sidindelat system är placeringen av inkommande block relativt enkelt att hantera eftersom alla sidor är lika stora och man placerar sidan där det är ledigt (med hänsyn till punkt 3). Vid segmentering är det betydligt mer komplicerat. Eftersom segmenten kan vara olika stora, erhålls lätt minnesfragmentering. För att minimera dessa problem är minnesplaceringen av segment av stor vikt. Det kan också bli nödvändigt att då och då avfragmentera (kompaktera) minnet. Vi ska dock här inte tränga närmare in i dessa problem.

Det finns flera olika s k utbytesalgoritmer med olika för- och nackdelar. Några exempel (benämningarna beskriver den grundläggande princip som utnyttjas):

Thrashing

För att processer ska exekveras effektivt måste de sidor/segment som är aktiva befinna sig i arbetsminnet. Om så inte är fallet kan ett fenomen som kallas för trashing uppstå. Trashing innebär att operativsystemet ständigt måste hämta nya sidor/segment från sekundärminnet, vilket yttrar sig i en drastisk försämring av datorns prestanda. Om operativsystemet inte hanterar problemet på ett vettigt sätt kan det t o m bli så att nästan all tid går åt till att byta sidor/segment. Moderna operativsystem brukar försöka begränsa problemet genom att lägga hela processer på sekundärminnet (swapping) och där får processerna stanna kvar tills någon av de fortfarande exekverande processerna avslutats och primärminne frigjorts. Inte heller detta är dock en riktigt tillfredsställande lösning och det enda sättet att bli kvitt problemet är att bygga ut datorns primärminne.


Copyright © 1998 Martin Fahlgren

martin@1-1-7-46a.ghn.gbg.bostream.se

[Till början av dokumentet] [Till artikelförteckningen]