Ordadressering - Word addressing
I computer arkitektur, ord adressering betyder, at adresser på hukommelse på en computer entydigt at identificere ord hukommelse. Det bruges normalt i kontrast til byte -adressering , hvor adresser entydigt identificerer bytes . Næsten alle moderne computerarkitekturer bruger byte -adressering, og ordadressering er stort set kun af historisk interesse. En computer, der bruger ordadressering, kaldes undertiden en ordmaskine .
Grundlæggende
Overvej en computer, der leverer 524.288 (2 19 ) bits hukommelse. Hvis denne hukommelse er arrangeret i et byte-adresserbart fladt adresserum ved hjælp af 8-bit bytes, så er der 65.536 (2 16 ) gyldige adresser, fra 0 til 65.535, der hver betegner uafhængige 8 bits hukommelse. Hvis det i stedet er arrangeret i et ordadresserbart fladt adresserum ved hjælp af 32-bit ord, så er der 16.384 (2 14 ) gyldige adresser, fra 0 til 16.383, der hver betegner en uafhængig 32 bit.
Mere generelt er den minimum adresserbare enhed (MAU) en egenskab ved en bestemt hukommelsesabstraktion. Forskellige abstraktioner inden for en computer kan bruge forskellige MAU'er, selv når de repræsenterer den samme underliggende hukommelse. For eksempel kan en computer bruge 32-bit adresser med byte-adressering i sit instruktionssæt , men CPU'ens cachesammenhængssystem fungerer muligvis kun med hukommelse ved en granularitet på 64-byte cachelinjer , hvilket tillader, at en bestemt cachelinje kun identificeres med en 26-bit adresse og faldende overhead af cachen.
Adresseoversættelsen udført af virtuel hukommelse påvirker ofte strukturen og bredden af adresserummet, men det ændrer ikke MAU.
Afvejninger af forskellige minimum adresserbare enheder
Størrelsen af den mindste adresserbare hukommelsesenhed kan have komplekse afvejninger. Ved at bruge en større MAU kan den samme mængde hukommelse dækkes med en mindre adresse, hvilket kan reducere hukommelseskravene til et program betydeligt. Brug af en mindre MAU gør det imidlertid lettere at arbejde effektivt med små data.
Antag, at et program ønsker at gemme et af de 12 traditionelle tegn på vestlig astrologi . Et enkelt tegn kan gemmes i 4 bits. Hvis et tegn er gemt i sin egen MAU, vil 4 bits blive spildt med byte-adressering (50% effektivitet), mens 28 bits vil blive spildt med 32-bit ordadressering (12,5% effektivitet). Hvis et tegn er "pakket" ind i en MAU med andre data, kan det være relativt dyrere at læse og skrive. For eksempel for at skrive et nyt tegn i en MAU, som andre data er blevet pakket ind i, skal computeren læse MAU's aktuelle værdi, overskrive bare de relevante bits og derefter gemme den nye værdi tilbage. Dette vil være særligt dyrt, hvis det er nødvendigt for programmet at tillade andre tråde at samtidig ændre de andre data i MAU.
Et mere almindeligt eksempel er en tekststreng . Almindelige strengformater såsom UTF-8 og ASCII gemmer strenge som en sekvens af 8-bit kodepunkter. Med byte-adressering kan hvert kodepunkt placeres i sin egen uafhængigt adresserbare MAU uden omkostninger. Med 32-bit ordadressering ville anbringelse af hvert kodepunkt i en separat MAU øge hukommelsesforbruget med 300%, hvilket ikke er levedygtigt for programmer, der arbejder med store mængder tekst. Pakning af tilstødende kodepunkter i et enkelt ord undgår denne omkostning. Imidlertid foretrækker mange algoritmer til at arbejde med tekst at kunne adressere kodepunkter uafhængigt; For at gøre dette med pakkede kodepunkter skal algoritmen bruge en "bred" adresse, som også gemmer forskydningen af tegnet i ordet. Hvis denne brede adresse skal gemmes andre steder i programmets hukommelse, kan det kræve mere hukommelse end en almindelig adresse.
For at evaluere disse effekter på et komplet program skal du overveje en webbrowser, der viser en stor og kompleks side. Nogle af browserens hukommelse vil blive brugt til at gemme simple data som f.eks. Billeder og tekst; browseren vil sandsynligvis vælge at gemme disse data så effektivt som muligt, og det vil optage omtrent den samme hukommelse uanset størrelsen på MAU. Anden hukommelse repræsenterer browserens model af forskellige objekter på siden, og disse objekter vil indeholde mange referencer: til hinanden, til billed- og tekstdata og så videre. Mængden af hukommelse, der er nødvendig for at gemme disse objekter, vil i høj grad afhænge af computerens adressebredde.
Antag, at hvis alle adresserne i programmet var 32-bit, ville denne webside optage omkring 10 Gigabyte hukommelse.
- Hvis webbrowseren kører på en computer med 32-bit adresser og byte-adresserbar hukommelse, dækker adresserummet 4 Gigabyte hukommelse, hvilket er utilstrækkeligt. Browseren vil enten ikke være i stand til at vise denne side, eller den skal være i stand til opportunistisk at flytte nogle af dataene til langsommere lagring, hvilket i væsentlig grad vil skade dens ydeevne.
- Hvis webbrowseren kører på en computer med 64-bit adresser og byte-adresserbar hukommelse, vil det kræve betydeligt mere hukommelse for at gemme de større adresser. Den nøjagtige overhead vil afhænge af, hvor meget af de 10 gigabyte, der er simple data, og hvor meget der er objektlignende og tæt med referencer, men et tal på 40% er ikke usandsynligt, for i alt 14 gigabyte kræves. Dette er naturligvis godt inden for mulighederne i et 64-bit adresserum. Imidlertid vil browseren generelt vise en værre lokalitet og gøre dårligere brug af computerens hukommelsescacher i computeren, forudsat at der er lige ressourcer med alternativerne.
- Hvis webbrowseren kører på en computer med 32-bit adresser og 32-bit-ord-adresserbar hukommelse, vil det sandsynligvis kræve ekstra hukommelse på grund af suboptimal pakning og behovet for et par brede adresser. Denne effekt vil sandsynligvis være relativt lille, da browseren vil bruge pakning og ikke-brede adresser til de vigtigste formål, og brwoser vil passe komfortabelt inden for det maksimale adresserbare område på 16 Gigabyte. Der kan dog være en betydelig runtime overhead på grund af den udbredte brug af pakkede data til billeder og tekst. Endnu vigtigere er 16 gigabyte en relativt lav grænse, og hvis websiden vokser betydeligt, vil denne computer udtømme sit adresserum og begynde at have nogle af de samme vanskeligheder som den byte-adresserede computer.
- Hvis webbrowseren kører på en computer med 64-bit adresser og 32-bit-ord-adresserbar hukommelse, vil den lide under begge ovenstående runtime-omkostninger: det kræver betydeligt mere hukommelse for at rumme de større 64-bit adresser, hvilket gør ondt lokalitet, mens den også pådrager sig runtime -omkostningerne ved at arbejde med omfattende pakning af tekst- og billeddata. Ordadressering betyder, at programmet teoretisk kan adressere op til 64 Exabyte hukommelse i stedet for kun 16 Exabyte, men da programmet ikke er i nærheden af at have brug for så meget hukommelse (og i praksis er ingen rigtig computer i stand til at levere det), giver dette ingen fordel .
Således tillader ordadressering en computer at adressere væsentligt mere hukommelse uden at øge dens adressebredde og medføre den tilsvarende store stigning i hukommelsesforbrug. Dette er dog kun værdifuldt inden for et relativt snævert område af arbejdssætstørrelser, og det kan indføre betydelige driftstidsomkostninger afhængigt af applikationen. Programmer, der udfører relativt lidt arbejde med byte-orienterede data som billeder, tekst, filer og netværkstrafik, kan være til gavn for de fleste.
Adgang til underord og brede adresser
Et program, der kører på en computer, der bruger ordadressering, kan stadig arbejde med mindre hukommelsesenheder ved at efterligne en adgang til den mindre enhed. For en belastning kræver dette indlæsning af det omsluttende ord og derefter udtrækning af de ønskede bits. For en butik kræver dette indlæsning af det omsluttende ord, flytning af den nye værdi på plads, overskrivning af de ønskede bits og derefter lagring af det omsluttende ord.
Antag, at fire på hinanden følgende kodepunkter fra en UTF-8-streng skal pakkes ind i et 32-bit ord. Det første kodepunkt kan optage bit 0–7, det andet 8-15, det tredje 16–23 og det fjerde 24–31. (Hvis hukommelsen var byte-adresserbar, ville dette være en lille endian byte rækkefølge.)
For klart at belyse den kode, der er nødvendig for adgang til underord uden at binde eksemplet for tæt på en bestemt ordadresseret arkitektur, bruger de følgende eksempler MIPS- samling. I virkeligheden er MIPS en byte-adresseret arkitektur med direkte understøttelse af indlæsning og lagring af 8-bit og 16-bit værdier, men eksemplet vil foregive, at det kun giver 32-bit belastninger og lagre, og at det forskydes inden for et 32-bit ord skal gemmes adskilt fra en adresse. MIPS er valgt, fordi det er et simpelt montagesprog uden specialiserede faciliteter, der ville gøre disse operationer mere bekvemme.
Antag, at et program ønsker at læse det tredje kodepunkt ind i register r1fra ordet på en adresse i registeret r2. I mangel af anden støtte fra instruktionssættet, skal programmet indlæse hele ordet, højreskifte med 16 for at slippe de to første kodepunkter og derefter maskere det fjerde kodepunkt:
ldw $r1, 0($r2) # Load the full word srl $r1, $r1, 16 # Shift right by 16 andi $r1, $r1, 0xFF # Mask off other code points
Hvis forskydningen ikke kendes statisk, men i stedet gemmes en bit-offset i registret r3, kræves en lidt mere kompleks tilgang:
ldw $r1, 0($r2) # Load the full word srlv $r1, $r1, $r3 # Shift right by the bit offset andi $r1, $r1, 0xFF # Mask off other code points
Antag i stedet, at programmet ønsker at tildele kodepunktet i register r1til det tredje kodepunkt i ordet på adressen i r2. I mangel af anden understøttelse fra instruktionssættet skal programmet indlæse det fulde ord, maskere den gamle værdi af dette kodepunkt, flytte den nye værdi på plads, flette værdierne og gemme hele ordet tilbage:
sll $r1, $r1, 16 # Shift the new value left by 16 lhi $r5, 0x00FF # Construct a constant mask to select the third byte nor $r5, $r5, $zero # Flip the mask so that it clears the third byte ldw $r4, 0($r2) # Load the full word and $r4, $r5, $r4 # Clear the third byte from the word or $r4, $r4, $r1 # Merge the new value into the word stw $r4, 0($r2) # Store the result as the full word
Igen, hvis forskydningen i stedet lagres i r3, kræves en mere kompleks tilgang:
sllv $r1, $r1, $r3 # Shift the new value left by the bit offset llo $r5, 0x00FF # Construct a constant mask to select a byte sllv $r5, $r5, $r3 # Shift the mask left by the bit offset nor $r5, $r5, $zero # Flip the mask so that it clears the selected byte ldw $r4, 0($r2) # Load the full word and $r4, $r5, $r4 # Clear the selected byte from the word or $r4, $r4, $r1 # Merge the new value into the word stw $r4, 0($r2) # Store the result as the full word
Denne kodesekvens antager, at en anden tråd ikke kan ændre andre bytes i ordet samtidigt. Hvis samtidig ændring er mulig, kan en af ændringerne gå tabt. For at løse dette problem skal de sidste par instruktioner omdannes til en atomær sammenligningsbytningsløjfe, så en samtidig ændring simpelthen får den til at gentage operationen med den nye værdi. Der kræves ingen hukommelsesbarrierer i dette tilfælde.
Et par af en ordadresse og en forskydning i ordet kaldes en bred adresse (også kendt som en fed adresse eller en fed markør ). (Dette bør ikke forveksles med andre anvendelser af brede adresser til lagring af andre former for supplerende data, f.eks. Grænserne for en matrix.) Den lagrede forskydning kan enten være en bit offset eller en byte offset. Kodesekvenserne ovenfor drager fordel af, at forskydningen er denomineret i bits, fordi de bruger den som et skifttal; en arkitektur med direkte støtte til valg af bytes foretrækker måske bare at gemme en byte -offset.
I disse kodesekvenser skulle den ekstra forskydning gemmes ved siden af basisadressen, hvilket effektivt fordobler de samlede lagerkrav for en adresse. Dette er ikke altid rigtigt på tekstmaskiner, primært fordi adresserne selv ofte ikke er pakket med andre data for at gøre adgangene mere effektive. F.eks. Bruger Cray X1 64-bit ord, men adresser er kun 32 bit; når en adresse er gemt i hukommelsen, gemmes den i sit eget ord, og så kan byte -forskydningen placeres i de øvre 32 bit af ordet. Ineffektiviteten ved at bruge brede adresser på det system er bare al den ekstra logik til at manipulere denne forskydning og udtrække og indsætte bytes i ord; det har ingen indvirkning på brug af hukommelse.
Relaterede begreber
Den mindste adresserbare enhed på en computer er ikke nødvendigvis den samme som den mindste størrelse på hukommelsesadgang på computerens instruktionssæt. For eksempel kan en computer bruge byte -adressering uden at give nogen instruktioner til direkte at læse eller skrive en enkelt byte. Det forventes, at programmer efterligner disse operationer i software med bitmanipulationer, ligesom eksemplets kodesekvenser ovenfor gør. Dette er relativt almindeligt i 64-bit computerarkitekturer designet som efterfølgere til 32-bit supercomputere eller minicomputere, såsom DEC Alpha og Cray X1 .
De C-standard stater, der forventes en pegepind til at have den sædvanlige repræsentation af en adresse. C tillader også, at der dannes en markør til ethvert objekt undtagen et bitfelt; dette inkluderer hvert enkelt element i en række bytes. C -kompilatorer til computere, der bruger ordadressering, bruger ofte forskellige repræsentationer for pointer til forskellige typer afhængigt af deres størrelse. En markør til en type, der er stor nok til at fylde et ord, vil være en simpel adresse, mens en markør som char*eller void*vil være en bred markør: et par af et ords adresse og forskydningen af en byte inden for det ord. Konvertering mellem markørtyper er derfor ikke nødvendigvis en triviel handling og kan miste oplysninger, hvis de gøres forkert.
Fordi størrelsen på en C structikke altid er kendt, når man beslutter repræsentationen af en markør til det struct, er det ikke muligt pålideligt at anvende ovenstående regel. Kompilatorer skal muligvis justere starten på en, structså den kan bruge en mere effektiv markørrepræsentation.
Eksempler
- Den ERA 1103 anvendelser ord adressering med 36-bit ord. Kun adresser 0-1023 refererer til tilfældig adgangshukommelse; andre er enten ikke tilknyttet eller henviser til tromlehukommelse.
- Den PDP-10 bruger ordet adressering med 36-bit-ord og 18-bit adresser.
- De fleste Cray- supercomputere fra 1980'erne og 1990'erne bruger ordadressering med 64-bit ord. Den Cray-1 og Cray X-MP bruger 24-bit adresser, mens de fleste andre bruger 32-bit adresser.
- De Cray X1 anvendelser byte-adressering med 64-bit adresser. Det understøtter ikke direkte hukommelsesadgang mindre end 64 bit, og sådanne adganger skal emuleres i software. C-kompilatoren til X1 var den første Cray-kompilator, der understøttede emulering af 16-bit-adgang.
- Den December Alpha bruger byte-adressering med 64-bit adresser. Tidlige Alpha-processorer giver ikke nogen direkte understøttelse af 8-bit og 16-bit hukommelsesadgang, og programmer er nødvendige for f.eks. At indlæse en byte ved at indlæse det indeholdende 64-bit ord og derefter separat udtrække byte. Fordi Alpha bruger byte -adressering, er denne forskydning stadig repræsenteret i de mindst signifikante bits i adressen (snarere end separat som en bred adresse), og Alpha giver bekvemt indlæsning og lagring af ikke -justerede instruktioner (
ldq_uogstq_u), der ignorerer disse bits og ganske enkelt indlæser og gem det indeholdende justerede ord. De senere byte-ordudvidelser til arkitekturen (BWX) tilføjede 8-bit og 16-bit belastninger og lagre, startende med Alpha 21164a. Igen var denne udvidelse mulig uden alvorlig software -uforenelighed, fordi Alpha altid havde brugt byte -adressering.