Koduleht » kuidas » Kui palju mälu aadresse saab arvutis hoida mälus?

    Kui palju mälu aadresse saab arvutis hoida mälus?

    Mõnikord on lõbus vaadata arvutustehnika kogemust ja muudel päevadel on lõbus otse sisemusse. Täna vaatame arvuti mälu struktuuri ja seda, kui palju asju saab RAM-i mälupulgale panna.

    Tänane küsimuste ja vastuste seanss saabub meiega kohtades, kus on SuperUser-Stack Exchange'i alajaotis, kogukondlikult juhitav Q&A veebisaitide rühmitus.

    Küsimus

    SuperUser-lugeja Johan Smohan püüab sellega, kuidas protsessori tüüp ja mälu suurus töötavad koos, et saada kogu aadresside arv. Ta kirjutab:

    Mitu mälu aadressi saab 32-bitise protsessori ja 1 GB RAM-i ja 64-bitise protsessoriga?

    Ma arvan, et see on midagi sellist:

    1 GB ram jagatud kas 32 bitti 4 bitti (?) Mälu aadresside arvu saamiseks?

    Lugesin Wikipedias, et 1 mälu aadress on 32 bitti lai või 4 oktetti (1 oktett = 8 bitti), võrreldes 64-bitise protsessoriga, kus 1 mälu aadress või 1 täisarv on 64 bitti või 8 oktetti. Aga kas ma ei tea, kas ma sellest aru sain.

    Need on sellised küsimused, mis võivad öösel hoida uudishimulikku geeki. Mitu aadressi on saadaval iga Johani hüpoteetilise süsteemi alusel?

    Vastus

    SuperUser'i toetaja Gronostaj pakub mõningast teavet selle kohta, kuidas RAM jagatakse ja kasutatakse:

    Lühike vastus: Olemasolevate aadresside arv võrdub väiksemate aadressidega:

    • Mälu suurus baitides
    • Suurim allkirjastamata täisarv, mida saab salvestada CPU masinale

    Ülalmainitud pikk vastus ja selgitus:

    Mälu koosneb baitidest (B). Iga bait koosneb 8 bitist (b).

    1 B = 8 b 

    1 GB RAM on tegelikult 1 GiB (gibibüüt, mitte gigabait). Erinevus on:

    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, olenemata sellest, kui suur on CPU masina sõna. Nt. Intel 8086 CPU oli 16-bitine ja see käsitles mälu baitide abil, nii et kaasaegsed 32-bitised ja 64-bitised protsessorid. See on esimese piirangu põhjus - sa ei saa olla rohkem aadresse kui mälu baiti.

    Mälu aadress on vaid mitu baiti, mida protsessor peab mälu algusest vahele jätma, et saada otsitavale.

    • Esimese baidi juurde pääsemiseks peab see 0 baiti vahele jätma, seega on esimese byte aadressiks 0.
    • Teise baiti avamiseks peab see 1 baiti vahele jätma, seega on selle aadress 1.
    • (ja nii edasi… )
    • Viimase baiti avamiseks jätab CPU vahele 1073741823 baiti, nii et selle aadress on 1073741823.

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

    Masinatähis on mälu CPU, mida kasutatakse numbrite hoidmiseks (RAM, vahemälu või siseregistrites). 32-bitine CPU kasutab numbrite hoidmiseks 32 bitti (4 baiti). Mälu aadressid on ka numbrid, nii et 32-bitisel CPU-l on mäluaadress 32 bitti.

    Nüüd mõtle sellele: kui teil on üks bit, võite salvestada kaks väärtust: 0 või 1. Lisada veel üks bit ja teil on neli väärtust: 0, 1, 2, 3. Kolmel bitil on võimalik salvestada kaheksa väärtust : 0, 1, 2… 6, 7. See on tegelikult binaarne süsteem ja see toimib nii:

    Binary Decimal 0 0000 1 0001 2 0010 3 0011 4 0100 5 0101 6 0110 7 0111 8 1000 9 1001 10 1010 11 1011 12 1100 13 1101 14 1110 15 1111 

    See toimib täpselt nagu tavaliselt, kuid maksimaalne number on 1, mitte 9. Decimal 0 on 0000, siis lisate 1 ja saad 0001, lisage veel üks ja sul on 0010. See, mis siin toimub, on nagu koma 09 ja lisades ühe: muudate 9 kuni 0 ja suurendate järgmise numbri.

    Ülaltoodud näites näete, et alati on maksimaalne väärtus, mida saate hoida arvul, millel on pidev bittide arv - sest kui kõik bitid on 1 ja proovite väärtust suurendada 1-ga, muutuvad kõik bitid 0-ks, rikkudes seega number. Seda nimetatakse täisarvu ülevooluks ja see põhjustab nii kasutajatele kui arendajatele palju ebameeldivaid probleeme.

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

    Suurim võimalik arv on alati 2 ^ N-1, kus N on bittide arv. Nagu ma varem ütlesin, on mälu aadress number ja see on ka maksimaalne väärtus. Sellepärast on masina sõna suurus ka vabade mäluaadresside arvu piiriks - mõnikord ei saa CPU lihtsalt töödelda piisavalt suured numbrid, et rohkem mälu kasutada.

    Nii et 32 ​​bitil on võimalik numbreid hoida vahemikus 0 kuni 2 ^ 32-1 ja see on 4 294 967 295. See on rohkem kui suurim aadress 1 GB RAM-is, nii et teie konkreetsel juhul on RAM-i kogus piiravaks teguriks.

    32-bitiste protsessorite RAM-i piirmäär on teoreetiliselt 4 GB (2 ^ 32) ja 64-bitise CPU puhul 16 EB (exabytes, 1 EB = 2 ^ 30 GB). Teisisõnu, 64-bitine CPU võiks käsitleda kogu Internetti… 200 korda;) (hinnanguliseltWolframAlpha).

    Reaalsetes operatsioonisüsteemides võivad 32-bitised protsessorid siiski tegeleda umbes 3 GiB-ga. Selle põhjuseks on operatsioonisüsteemi sisemine arhitektuur - mõned aadressid on reserveeritud muudel eesmärkidel. Selle nn 3 GB barjääri kohta saate rohkem teavet Wikipedias. Selle limiidi saate tühistada füüsilise aadressilaiendusega.

    Mälestuse käsitlemisest rääkides on vähe asju, mida ma peaksin mainima: Virtuaalne mälusegmenteerimine ja otsing.

    Virtuaalne mälu

    Nagu @Daniel R Hicks märkis teises vastuses, kasutavad OS-id virtuaalset mälu. See tähendab, et rakendused tegelikult ei tööta tegelikel mälu aadressidel, vaid need, mida pakub OS.

    See meetod võimaldab operatsioonisüsteemil mõningaid andmeid teisaldada RAM-ist nn Pagefaili (Windows) või Swap (* NIX). HDD on vähesel määral aeglasem kui RAM, kuid see ei ole tõsine probleem harva ligipääsetavate andmetega ning see võimaldab OS-il pakkuda rakendustele rohkem RAM-i, kui olete tegelikult installinud.

    Piipar

    Seda, mida me siiani räägime, nimetatakse kindla adresseerimise skeemiks.

    Piipar on alternatiivne adresseerimisskeem, mis võimaldab käsitleda rohkem mälu, mida saate tavaliselt ühe masinaga ühe kindla mudeliga.

    Kujutage ette raamatut, mis on täis neljakohalist sõna. Oletame, et igal lehel on 1024 numbrit. Numbrile adresseerimiseks peate teadma kahte asja:

    • Lehekülgede arv, millele see sõna trükitakse.
    • Milline sõna sellel lehel on see, mida otsite.

    Nüüd on täpselt nii kaasaegne x86 protsessor kui mälu. See on jagatud neljaks KiB-leheküljeks (iga 1024 masina sõna) ja nendel lehekülgedel on numbrid. (tegelikult võivad leheküljed olla ka 4 MiB või 2 MiB PAE-ga). Kui soovite mäluseadme aadressiga pöörduda, peate sellel lehel olema lehekülje number ja aadress. Pange tähele, et iga mälu lahtrit viitab täpselt üks paari numbreid, mis ei ole segmenteerimise puhul.

    Segmentimine

    Noh, see on päris sarnane otsinguga. Seda kasutati Intel 8086-s, lihtsalt ühe näite nimetamiseks. Aadressi rühmi nimetatakse nüüd mälusegmentideks, mitte lehtedeks. Erinevus on segmendid, mis võivad kattuda, ja need kattuvad palju. Näiteks 8086-l olid enamik mäluseadmeid saadaval 4096 erinevast segmendist.

    Näide:

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

    Lame mälu mudeli illustratsioon:

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

    Peidetud mälu illustratsioon 4-baidise lehekülgedega:

     PAGE0 _____ | 0 | | 0 | | 0 | LEHEKÜLG 1 | 255 | _____ ----- | 0 | | 0 | | 0 | | 0 | ----- 

    Segmenteeritud mälu illustratsioon 4-baidise segmendiga, mis on nihutatud 1-ga:

     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 4. baiti käsitleda neljal viisil: (aadressil 0)

    • Segment 0, nihke 3
    • Segment 1, nihke 2
    • Segment 2, nihutamine 1
    • Segment 3, nihke 0

    See on alati sama mälu.

    Reaalse elu rakendustes nihutatakse segmente rohkem kui 1 baidiga (8086 puhul oli see 16 baiti).

    Mis on segmendiga seotud, on see, et see on keeruline (aga ma arvan, et te juba teate seda;) Mis on hea, on see, et saate kasutada mõningaid nutikaid tehnikaid moodulprogrammide loomiseks.

    Näiteks saate mõne mooduli segmenti laadida, seejärel teeselda, et segment on väiksem kui see tegelikult on (mooduli hoidmiseks piisavalt väike), seejärel vali esimene segment, mis ei kattu selle pseudo-väiksema üksusega ja laadige järgmine moodul jne. Põhimõtteliselt on see, mida te sellisel viisil saate, erineva suurusega lehekülgi.


    Kas teil on midagi lisada selgitusele? Hääletage kommentaarides. Kas soovite lugeda rohkem vastuseid teistelt tech-savvy Stack Exchange'i kasutajatelt? Vaadake siin täielikku arutelu lõiku.