Hovedlager

Ved hovedlageret på en computer forstås en digital hukommelse, der er direkte tilgængelig for læsning og evt. skrivning for maskinens cpu. Hovedlageret, der på engelsk ofte benævnes memory eller (main) storage, adskiller sig fra baggrundslageret, der er indirekte tilgængeligt, og normalt (men ikke altid) fra cpu'ens registre (nogle maskinarkitekturer har cpu'ens registre som en del af hovedlageret, f.eks. på UNIVAC 1100, hvor cpu'ens registre (som der ret usædvanligt for den tid er 128 af) ligger på de laveste adresser i lageret). I dag benyttes ofte betegnelsen RAM, random access memory, men dette er strengt taget betegnelsen for bestemte halvlederteknologier til opbygning af hovedlageret. Førhen har andre teknologier være benyttet, hvor især ferritkernelager var meget benyttet. På den tid var hovedlageret ofte betegnet som core memory, et navn der siges at leve videre i filer med filendelsen COM, der skal stå for COre iMage (disse filer indeholder et computerprogram, der uden videre kan læses ind og køres i modsætning til andre programmer, der skal modificeres først). Andre opfatter COM som en forkortelse af COMmand, da filerne kan køres som en kommando via kommandofortolkeren i MS-DOS, men det kan BAT og EXE-filer også.

Anvendelse
På de første computere blev hovedlageret udelukkende benyttet til de vigtigste af de data, der skulle arbejdes på. Som mellemlager for de oplysninger, der ikke kunne være i computerens akkumulator eller øvrige registre, men som skulle opdateres/regnes på. Større datamængder (efter datidens målestok) ville typisk findes på hulstrimmel, hulkort eller anden databærer. Det program, som maskinen fulgte, var sat op på en eller anden form for koblingstavle, et kontaktpanel, eller på f.eks. en hulstrimmel, der kørte i en løkke. 

Da John von Neumann foreslog en computer, hvor computerens program fandtes i lageret (von Neumann-arkitektur eller stored program computer) ved siden af de data, der skulle behandles, hvilket ville øge hastigheden og give mulighed for mere fleksibel programafvikling (bl.a. ville hop og løkker i udførelsen blive enklere), steg behovet for at få et større hovedlager.

Historisk/teknisk
Der har historisk været benyttet adskillige teknikker til opbygningen af computeres lager. I begyndelsen var prisen for at lagre én bit meget stor, men prisen er løbende faldet. Samtidig er hastigheden for lageret øget (dvs. den tid det tager at læse eller skrive er blevet mindre). Behovet er vokset tilsvarende. Hvor en computer førhen måtte klare sig med måske 1000 celler i lageret, er det nu almindeligt med flere milliarder til en moderne computer (der er stor variation).
	På tidlige maskiner bestod hovedlageret, der var ganske lille, af kredsløb, såkaldte flip-flops, baseret på radiorør. Også telefonrelæer har været benyttet. Begge dele fyldte meget fysisk og brugte en del strøm.
	Data blev på nogle maskiner lagret i forsinkelsesled, i de første udgaver var de enkelte bit lagret som lydbølger, der bevægede sig gennem et kviksølvfyldt rør fra en lydgiver til en lydmodtager. Efterhånden som bittene nåede frem til modtageren, skulle signalet genskabes (renses) og sendes tilbage til lydgiveren i den anden ende. Teknikken var udviklet til radarsystemer til at fjerne ekkoer fra stillestående genstande som bakker, huse og træer. Senere blev forsinkelsesled baseret på lyd i en spiralformet kraftig ståltråd benyttet.
	Williamsrør var store katodestrålerør, hvor hver bit kunne skrives som en plet med en elektrisk ladning på rørets fosforbelægning. Disse bit skulle aflæses og genopfriskes i en hurtig rækkefølge.  
	Ferritkernelager har været nævnt. Dette lager bevarer sit indhold, selv om maskinen bliver slukket, da de enkelte bit er lagret som en magnetisering i små ringe af ferrit. Til gengæld vil enhver læsning af en bit medføre ødelæggelsen af denne bit (destructive memory read-out), da magnetiseringen skal vendes. Den skal derfor genskrives umiddelbart derefter (det sker automatisk af særlige kredsløb i forbindelse med lageret). Ferritkernelagre var meget anvendte i en lang periode.
	Magnetisk boblehukommelse var en teknologi, som man i 1980'erne stillede store forventninger til. Den slog dog aldrig an, heller ikke som baggrundslager. 
	Efterhånden udviklede man meget pålidelige og prisbillige hukommelser baseret på halvlederchips. Disse betegnes under et som RAM, Random Access Memory. Data kan lagres som et skifte i et antal flip-flop kredsløb, andre typer kan have data i en ladning i en kondensator. Nogle RAM-typer kræver en hyppig opfriskning af indholdet, da indholdet ellers forsvinder. Andre er stabile, så længe der er strøm på kredsløbende. Endelig er der typer, flashram, der kan holde indholdet i mange år. Denne type benyttes mest til data, der ikke skal ændres hyppigt.
	En særlig form for lager, der findes som en del af hovedlageret på stort set alle moderne computere, er forskellige former for ROM-lager. Det står for Read-Only Memory, og indeholder f.eks. programkode til initialisering af maskinen efter den lige er blevet tændt og andre rutiner til forskellige typer hardware (f.eks. BIOS). Instruktioner i en ROM-kreds kan skrives ved at ”brænde” dem (de enkelte bit kan være små sikringer, der kan brændes over med en overspænding eller på anden måde forårsage en permanent ændring af de enkelte celler). Mange ROM-kredse kan trods navnet overskrives. Nogle tidligere anvendte skulle nulstilles med ultraviolet lys gennem et særligt vindue i chippen, andre kan overskrives elektrisk. Dette er ikke en normal foreteelse, men kan være nødvendig for at opdatere visse typer af systemsoftware.
	Et lager i en computer lagrer data som en sekvens af bit, hvis betydning er beskrevet for det aktuelle dataformat. Grunden til, at der benyttes binære tal, er teknisk. Det er nemmere at lave pålidelige elektroniske kredsløb, hvis de kun skal kunne skelne mellem to mulige tilstande, i forhold til at lave kredsløb, der kan skelne mellem f.eks. 10 forskellige tilstande.

Adressering
Lageret i en computer adresseres med et tal, adressen, der går fra 0 og op til et maksimum for den pågældende maskine. Der kan være forskel på, hvor mange bit, der er i en adresse internt i en cpu, og det antal adresselinjer, der går ud af cpu'en. Adressen udpeger en bestemt celle i lageret. Hvis der er afsat f.eks. 16 bit til hver adresse, som det var tilfældet i 8-bit maskiner, kan der adresseres fra adresse 0 til 2n -1, altså fra 0 - 65535. Er der afsat 32 bit, kan der adresseres 4 gigabyte celler.

Byte eller ord
Nogle computere adresserer de enkelte byte i lageret, andre adresserer ord, dvs. flere byte samlet under et, svarende til  størrelsen på cpu'en registre. Der har endda eksisteret maskiner, hvor de enkelte bit blev adresseret. Dvs. en celle i lageret bestod af én bit. Et ord behøver dog ikke være et multiplum af 8 bit. Nogle arkitekturer kan adressere såvel ord som enkelte bytes. Der kan så være forskel på, hvor effektiv adresseringen fungerer, alt efter hvor de ønskede bytes er placeret i forhold til ordgrænserne. 

Udviklingen af de forskellige maskinarkitekturer til at kunne håndtere større ord i et register, har tit gjort det noget kompliceret at adressere celler i lageret.

Segmentering
På nogle maskiner består en adresse af indholdet af et segmentregister, der indeholder de mest betydende bit af adressen, kombineret med et tal, der udgør de mindst betydende bit af adressen. Dette gør det nemmere at flytte programmer rundt i hukommelsen, da systemet så blot skal ændre indholdet af et eller flere segmentregistre, ikke rette alle adresser nævnt i programmet. Dette benævnes relokering.

Indirekte adressering
En instruktion for en computer kan have en eller flere adresser som argument. Dvs. adressen står direkte i eller sammen med instruktionen. Hvis man skriver programmer i maskinkode, vil man normalt benytte en symbolsk assembler, og skrive en label i stedet for den direkte adresse. Assembleren vil så holde regnskab med de dannede adresser. Man kan også anvende indirekte adressering. Dvs. instruktionen vil i stedet for en adresse pege på et register, hvis indhold så udgør adressen på det tidspunkt, hvor programmet kører. Et sådant register benævnes ofte et indeksregister. 

Nogle computere har en indirection bit, der kan sættes enten på indholdet af en celle i lageret eller på indholdet af et register. Hvis denne bit er sat, vil en reference til cellen eller registret i stedet medføre, at den celle, der udpeges af registret/cellen, refereres.

Cache-lager
En cpus registre er de hukommelseselementer, det er hurtigst at få fat i. Der er få af dem, så der kan ofres penge på at fremstille ekstremt hurtige elektroniske kredsløb. Desuden er den fysiske afstand meget kort. Ved de hastigheder, som en moderne computer arbejder med, betyder forsinkelsen på at hente eller skrive data flere cm væk en hel del.

Mange moderne processorer benytter derfor en form for cachelager indskudt mellem hovedlageret og selve cpu'en. Hovedlageret opdeles i blokke, og nogle af disse blokke med data, der benyttes eller forventes at skulle benyttes, kopieres til cachen. Det er så betydeligt hurtigere for cpu'en at få fat i data i cachen. Ændres data i cachen, skal de på et passende tidspunkt også ændres i hovedlageret. Administrationen af cachen foretages af mikroprogrammet i cpu'en.

Hvis der er flere kerner eller flere processorer i en computer, er det vigtigt, at systemet kan holde rede i, hvilke data der er de aktuelle, og hvilke processorer, der har lov til at ændre bestemte data.

Cachehukommelse kan forekommer i flere niveauer, hvor de niveauer, der er lavest, er nærmest cpu'en og er de hurtigste.

Virtuelt lager
Lageret i en computer kan hurtigt blive en knap ressource, ikke mindst når en computer skal afvikle flere programmer samtidigt (multitasking. Man har derfor udviklet teknikker til at lade programmerne benytte et større lager, end der aktuelt er til rådighed. De dele af lageret, der aktuelt er mindst brug for, skrives ud på et baggrundslager (som f.eks. en harddisk eller i tidligere tid et tromlelager). De kan så efter behov læses ind i hovedlageret igen, mens andre dele af hovedlageret skrives ud på baggrundslageret.

På mange tidlige computere var det programmørens ansvar at styre dette. Man kaldte en funktion, der skrev en række celler ud på et angivet spor på tromlen, eller læste et spor ind fra tromlen til en angivet række celler. Programmøren skulle altså dele programmet, måske både data og programinstruktioner op i overlays og holde styr på, hvilke der aktuelt skulle være i lageret. Dette var en mulig kilde til alvorlige fejl, og ville ikke fungere i et miljø med flere samtidige brugere eller programmer.

Omkring 1961 begyndte man at eksperimentere med at lade maskinen selv styre dette, usynligt for programmørerne. Et virtuelt lager blev en del af operativsystemet, hvorved det kom til at fungere, uden at programmøren behøvede gøre sig de store overvejelser i den anledning.

Adresserummet, det virtuelle lager, blev delt op i sider (pages). Når et program refererer en adresse, skal maskinens hardware først finde ud af, om den pågældende side er i lageret. Til dette formål vedligeholdes en page table. Hvis den er det, vil den virtuelle adresse blive ændret til en fysisk adresse, da siden i virkeligheden godt kan ligge på en helt anden adresse, end den som programmet arbejder med. Er siden ikke til stede i lageret, udløses en page fault og operativsystemet skal læse siden ind fra baggrundslageret, evt. efter at der først er skaffet plads til den ved at skrive en anden side ud på baggrundslageret.

Processen med at flytte sider mellem hovedlageret og baggrundslageret benævnes paging eller swapping, og tager forholdsvis lang tid i forhold til, når den ønskede side allerede er i lageret. Forskellige algoritmer vil derfor søge at minimere behovet for paging. Når hyppigheden af paging bliver stor, f.eks. fordi nogle programmer bruger meget lagerplads, vil computeren begynde at arbejde langsomt. Dette kaldes ofte for trashing.

De instruktioner, der benyttes til at vedligeholde page table og til at flytte sider mellem hovedlager og baggrundslager, er priviligerede instruktioner. De kan kun udføres, når computeren kører i en særlig tilstand, der er forbeholdt centrale dele af operativsystemet.

Memory controller
Det er i dag almindeligt, at en cpu ikke har direkte forbindelse til lageret, men at alle adresser går igennem en memory management unit. Dens vigtigste opgave er at oversætte virtuelle adresser til fysiske adresser og i øvrigt at administrere det fysiske lager.

Områder reserveret til systemet
Dele af hovedlagerets adresserum kan være reserverede til særlige formål. Ud over at bestemte rutiner kan være anbragt på bestemte adresser (normalt har man startadressen på hver rutine anbragt et fast sted, dette betgenes en vektor), så kan porte til ydre enheder være anbragt i maskinens adresserum. Dvs. et program kan læse fra eller skrive til en bestemt enhed ved at skrive til en tilsyneladende ordinær adresse i lageret. 

Desuden kan bestemte dele af lageret være afsat til skærmbilleder, så der kan skrives på skærmen ved at skrive til bestemte adresser.

Kilder og henvisninger
 
 Structured Computer Organization, afsnit 2.2 og 6.4, Andrew S. Tanenbaum, 2. udgave, 1984

Computerhukommelse
Digitale hukommelser