20Aug

Kui palju mälu-aadresse saab mu arvuti mälus hoida?

Somedays on lõbus vaadata arvuti taseme pinna taset ja muudel päevadel on lõbus sukelduda otse sisemise töösse. Täna vaatleme arvuti mälu struktuuri ja seda, kui palju asju saab mäluseadmesse pakkida.

Tänane küsimus &Vastuste seanss tuleb meile viisakalt SuperUseriga - Q & A veebisaitide kogukonnapõhise grupi Stack Exchange jagunemisest.

Küsimus

SuperUser lugeja Johan Smohan võitleb, kuidas protsessoritüüp ja mälu suurus töötavad koos, et saada koguarv aadresse. Ta kirjutab:

. Kui palju mälukaarte saame 32-bitise protsessoriga ja 1 GB raamistikuga ja kui palju on 64-bitise protsessoriga?

Ma arvan, et see on midagi sellist:

1GB ram, mis on jagatud 32-bitiste 4 bittidega( ?), Et saada mäluaadresside arv?

Ma lugesin Wikipedias, et 1 mälu aadress on 32-bitine lai või 4 oktetit( 1 oktett = 8 bitti) võrreldes 64-bitisse protsessoriga, kus 1 mälupesa või 1 täisarv on 64-bitine lai või 8 okteet. Kuid ei tea, kas ma ka aru andsin.

Need on küsimused, mis võivad öelda uudishimulikku geeki. Mitu aadressi on Johanni hüpoteetilistes süsteemides saadaval?

Vastus

SuperUseri kaastöötaja Gronostaj annab mõningast ülevaadet selle kohta, kuidas RAMi jagatakse ja kasutatakse:

Lühike vastus: Saadaval olevate aadresside arv võrdub väiksematega neist:

  • Mälu suurus baitides
  • Suurim allkirjastatud täisarv, mida saab salvestadaCPU masin sõna

Pikk vastus ja selgitus ülaltoodud:

mälu koosneb baitidest( B).Iga bait koosneb 8 bitti( b).

1 B = 8 b

1 GB RAM on tegelikult 1 GiB( gibibyte, mitte gigabaidi).Erinevus on järgmine:

1 GB = 10 ^ 9 B = 1 000 000 000 B 1 GiB = 2 ^ 30 B = 1 073 741 824 B

Igal mälu baitil on oma aadress, ükskõik kui suur on CPU masin sõna. Näiteks. Intel 8086 protsessor oli 16-bitine ja see tegeleti mälu baitidega, nii et ka kaasaegsed 32-bitised ja 64-bitised protsessorid. See on esimese piiri põhjus - sul ei ole rohkem aadresse kui mälu baidid.

Mälu aadress on vaid mitu baiti, mida CPU peab vahele jätma mälu algusest, et jõuda soovitud juurde.

  • Esimese baidi avamiseks peab see vahele jätma 0 baiti, nii et esimene baidi aadress on 0.
  • Selle teise baidi juurde pääsemiseks peab see 1 baiti jätma, nii et selle aadress on 1.
  • ( ja nii edasi. ..)
  • Viimane bait, CPU jätab 1073741823 baiti, nii et selle aadress on 1073741823.

Nüüd peate teadma, mida tegelikult tähendab 32-bitine. Nagu ma varem mainisin, on masinakirja suurus.

Masin sõna on mälu protsessor, mida CPU kasutab numbrite hoidmiseks( RAM, vahemälu või sisemised registrid).32-bitise protsessoriga kasutatakse numbrite hoidmiseks 32 biti( 4 baiti).Mälu aadressid on ka numbrid, nii et 32-bitisel CPU mälu aadress koosneb 32 bitti.

Nüüd mõtle sellele: kui teil on üks natuke, võite salvestada kaks väärtust: 0 või 1. Lisage veel natuke ja sul on neli väärtust: 0, 1, 2, 3. Kolmel bitidel võite salvestada kaheksaväärtused: 0, 1, 2. .. 6, 7. See on tegelikult binaarne süsteem ja see töötab järgmiselt:

binaarne kümnendik 0 0000 1 0001 2 0010 3 0011 4 0100 5 0101 6 0110 7 0111 8 1000 9 1001 10 1010 111011 12 1100 13 1101 14 1110 15 1111

See töötab täpselt nagu tavaline lisamine, kuid maksimaalne arv on 1, mitte 9. Decimal 0 on 0000, siis lisate 1 ja saada 0001, lisa veel üks ja sul on 0010. MisSiin on happendant koos kümnendkohaga 09 ja selle lisamisega: muutute 9 kuni 0 ja lisandub järgmine number.

Eespool toodud näitel näete, et alati on maksimumväärtus, mida saate hoida numbris, kus on püsikoguste arv - sest kui kõik bittid on 1 ja proovite väärtust 1 suurendada, siis kõik bittid muutuvad 0-ga, mistõttu purunevadnumber. Seda nimetatakse täisarvuliseks ülevooluks ja tekitab nii kasutajatele kui ka arendajatele palju ebameeldivaid probleeme.

11111111 = 255 + 1 ----------- 100000000 = 0( siin on 9 bitti, nii et 1 on lõigatud)
  • 1 biti suurim väärtus on 1,
  • 2 bitti - 3,
  • 3 bitti -7,
  • 4 bitti - 15

Suurim võimalik number on alati 2 ^ N-1, kus N on bittide arv. Nagu ma varem ütlesin, on mäluaadress number ja sellel on ka maksimaalne väärtus. Sellepärast on masinakirja suurus samuti saadavalolevate mälukaartide arvu piirang - mõnikord ei saa teie protsessor lihtsalt töödelda mälusse pöördumiseks piisavalt suuri numbreid.

Nii et 32 ​​bitti saate hoida numbreid 0 kuni 2 ^ 32-1 ja see on 4 294 967 295. See on rohkem kui suurim aadress 1 GB RAM, nii et teie konkreetsel juhul suurus RAM on piirav tegur.

32-bitise CPU raadiosagedusala on teoreetiliselt 4 GB( 2 ^ 32) ja 64 bitise CPU puhul on see 16 EB( exabytes, 1 EB = 2 ^ 30 GB).Teisisõnu, 64-bitiste CPU-d võiks kogu Internetti kasutada. .. 200 korda;)( hinnanguliselt WolframAlpha).

Kuid reaalsetes operatsioonisüsteemides võivad 32-bitised protsessorid saata umbes 3 GiB RAM-i. Operatsioonisüsteemi sisemise arhitektuuri tõttu on mõned aadressid reserveeritud muuks otstarbeks. Te võite lugeda Wikipedias seda nn 3 GB piirangut. Seda limiiti saate tõsta füüsilise aadressi laiendusega.

Mälu adresseerimise osas on vähe asju, mida ma peaksin mainima: virtuaalmälu , segmentimine ja lehitsemine .

Virtuaalne mälu

Nagu @ Daniel R Hicks märkis teises vastuses, kasutavad operatsioonisüsteemid virtuaalset mälu. Mida tähendab see, et rakendused tegelikult ei tööta tõeliste mälukaartidega, vaid need, mida pakub OS.

See meetod võimaldab operatsioonisüsteemil viia mõned andmed RAMist nn Pagefile( Windows) või Swap( * NIX).HDD on mõnevõrra magnituudi, mis on aeglasem kui RAM, kuid see ei ole harva ligipääsuga andmetele tõsine probleem ning see võimaldab operatsioonisüsteemil pakkuda rakendustele rohkem RAM kui olete tegelikult installinud.

lehitsemine

Mida me seni räägime nimetatakse korteriotsingukavaks.

Paging on alternatiivne aadressikava, mis võimaldab lahendada rohkem mälu, mida tavaliselt võiksite ühe masinakirjaga tasasel mudelil.

Kujutage ette 4-täheliste sõnadega täidetud raamatut. Oletame, et igal lehel on 1024 numbrit. Numbrile vastamiseks peate teadma kahte asja:

  • Lehe number, millele see sõna on trükitud.
  • Milline sellel lehel olev sõna on see, mida otsite.

Nüüd on just see, kuidas kaasaegsed x86-protsessorid mälu kasutavad. See on jagatud nelja KiB-le( igaüks 1024 masintõlget) ja neil lehtedel on numbrid.(tegelikult lehed võivad olla ka 4 MiB suured või 2 MiB koos PAE-ga).Kui soovite mälukaarti aadressil, peate selle lehe lehe numbri ja aadressi. Pange tähele, et iga mälu-lahtriga on viidatud täpselt ühe numbrite paariga, see ei tähenda segmenteerimist.

segmentimine

Noh, see on päringule sarnane. Seda kasutati Intel 8086-s, ainult ühe näitena. Aadressirühmad nimetatakse nüüd mälusegmentideks, mitte lehtedeks. Erinevus segmentide vahel võib kattuda ja nad kattuvad palju. Näiteks 8086-l oli enamus mälukaid 4096 erinevast segmendist.

Näide:

Oletame, et meil on 8 baiti mälu, kõik nullid, välja arvatud 4. bait, mis võrdub 255-ga.

illustratsioon lame mälu mudelile:

_____ |0 ||0 ||0 ||255 ||0 ||0 ||0 ||0 |-----

illustratsioon sissetuleva mälu jaoks koos 4-baitiliste lehtedega:

PAGE0 _____ |0 ||0 ||0 |PAGE1 |255 |_____ ----- |0 ||0 ||0 ||0 |-----

Illustratsioon segmenteeritud mälu jaoks 4-baidise segmendiga nihutatud 1:

SEG 0 _____ SEG 1 |0 |_____ SEG 2 |0 ||0 |_____ SEG 3 |0 ||0 ||0 |_____ SEG 4 |255 ||255 ||255 ||255 |_____ SEG 5 ----- |0 ||0 ||0 ||0 |_____ SEG 6 ----- |0 ||0 ||0 ||0 |_____ SEG 7 ----- |0 ||0 ||0 ||0 |_____ ----- |0 ||0 ||0 ||0 |----- ----- ----- -----

Nagu näete, saab neljandat baiti käsitleda neljas suunas:( aadressiga 0)

  • segmendi 0, nihe 3
  • segmendi 1,nihutab 2
  • segmendi 2, nihe 1
  • segmenti 3, nihe 0

See on alati sama mälupulk.

Reaalsetes rakendustes segmente nihutatakse üle 1 baidi( 8086 puhul oli see 16 baiti).

Segmenteerimisel on halb, et see on keeruline( aga ma arvan, et te juba seda teate); on hea, et saate modulaarsete programmide loomiseks kasutada mõnda nutikat tehnikat.

Näiteks võite laadida mõnda moodulit segmenti, siis teeme ettekujutuse, et segment on väiksem kui see on tõesti( ainult piisavalt väike mooduli hoidmiseks), siis vali esimene segment, mis ei kattu selle pseudo-väiksema ja koormusjärgmine moodul ja nii edasi. Põhimõtteliselt on see, mida saate sellisel viisil, erineva suurusega lehed.

Kas teil on seletamiseks midagi lisada? Helistage kommentaarides. Kas soovite lugeda rohkem vastuseid teistelt tech-savvy Stack Exchange'i kasutajatelt? Tutvu täieliku arutelu teemaga siit.