Kiek atminties adresų galima laikyti „My Computer“ atmintyje?
Kažkada įdomu pažvelgti į skaičiavimo patirties paviršiaus lygį, o kitomis dienomis įdomu įsijungti į vidinį darbą. Šiandien mes pažvelgsime į kompiuterio atminties struktūrą ir tik kiek dalykų, kuriuos galite pakuoti į RAM atmintį.
Šiandienos „Klausimų ir atsakymų“ sesija mums suteikiama pagal „SuperUser“ - „Stack Exchange“ padalinį, bendruomenės sukurtą „Q&A“ svetainių grupavimą.
Klausimas
„SuperUser“ skaitytuvas Johanas Smohanas kovoja su tuo, kaip procesoriaus tipas ir atminties dydis veikia kartu, kad gautų bendrą adresų skaičių. Jis rašo:
Kiek atminties adresų galime gauti su 32 bitų procesoriumi ir 1GB RAM ir kiek su 64 bitų procesoriumi?
Manau, kad tai kažkas panašaus:
1GB RAM padalintas iš 32 bitų 4 bitų (?), Kad gautumėte atminties adresų skaičių?
Wikipedijoje perskaičiau, kad 1 atminties adresas yra 32 bitų pločio arba 4 oktetai (1 oktetas = 8 bitai), palyginti su 64 bitų procesoriumi, kur 1 atminties adresai arba 1 sveikasis skaičius yra 64 bitai plati arba 8 oktetai. Bet nežinau, ar taip gerai suprantu.
Tai yra tokie klausimai, kurie naktį gali išlikti įdomūs geekai. Kiek adresų yra pagal kiekvieną iš Johano hipotetinių sistemų?
Atsakymas
„SuperUser“ autorius „Gronostaj“ supranta, kaip RAM yra padalinta ir naudojama:
Trumpas atsakymas: Galimų adresų skaičius yra lygus mažesniems adresams:
- Atminties dydis baitais
- Didžiausias nepasirašytas sveikasis skaičius, kurį galima įrašyti į procesoriaus kompiuterio žodį
Ilgas atsakymas ir paaiškinimas aukščiau:
Atmintis susideda iš baitų (B). Kiekvieną baitą sudaro 8 bitai (b).
1 B = 8 b
1 GB RAM iš tikrųjų yra 1 GiB (gibibitas, ne gigabaitas). Skirtumas yra:
1 GB = 10 ^ 9 B = 1 000 000 000 B 1 GiB = 2 ^ 30 B = 1 073 741 824 B
Kiekvienas atminties baitas turi savo adresą, nesvarbu, koks yra CPU įrenginio žodis. Pvz. „Intel 8086“ procesorius buvo 16 bitų ir adresavo atmintį baitais, taigi ir šiuolaikiniai 32 bitų ir 64 bitų procesoriai. Tai yra pirmosios ribos priežastis - jūs negalite turėti daugiau adresų nei atminties baitai.
Atminties adresas yra tik keletas baitų, kuriuos CPU turi praleisti nuo atminties pradžios, kad pasiektų tą, kurio ieškote.
- Norėdami pasiekti pirmąjį baitą, jis turi praleisti 0 baitų, todėl pirmasis baitų adresas yra 0.
- Norėdami pasiekti antrą baitą, jis turi praleisti 1 baitą, todėl jo adresas yra 1.
- (ir taip toliau… )
- Norint pasiekti paskutinį baitą, CPU praleidžia 1073741823 baitus, todėl jo adresas yra 1073741823.
Dabar jūs turite žinoti, ką iš tikrųjų reiškia 32 bitai. Kaip jau minėjau, tai yra mašininio žodžio dydis.
Įrenginio žodis yra atminties procesoriaus, naudojamo numerių laikymui (RAM, talpyklos ar vidinių registrų), kiekis. 32 bitų CPU naudoja 32 bitus (4 baitus) numerių laikymui. Atminties adresai taip pat yra numeriai, todėl 32 bitų CPU atminties adresas susideda iš 32 bitų.
Dabar pagalvokite apie tai: jei turite vieną bitą, galite išsaugoti dvi reikšmes: 0 arba 1. Pridėti dar vieną bitą ir turite keturias reikšmes: 0, 1, 2, 3. Trijuose bituose galite išsaugoti aštuonias reikšmes : 0, 1, 2… 6, 7. Tai iš tikrųjų yra dvejetainė sistema ir veikia taip:
Dvejetainis dešimtainis 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
Jis veikia lygiai taip pat, kaip įprasta, tačiau maksimalus skaičius yra 1, o ne 9. Decimal 0
0000
, tada pridėkite 1 ir gaukite0001
, dar kartą pridėkite vieną ir turite0010
. Tai, kas čia vyksta, yra panaši į dešimtainę09
ir pridedant vieną: pakeisite nuo 9 iki 0 ir padidinsite kitą skaičių.Iš aukščiau pateikto pavyzdžio matote, kad visada yra didžiausia reikšmė, kurią galite laikyti skaičiumi su pastoviu bitų skaičiumi - nes kai visi bitai yra 1 ir bandote padidinti vertę 1, visi bitai taps 0, tokiu būdu pažeidžiant numeris. Tai vadinama sveikojo skaičiaus perpildymu ir sukelia daugybę nemalonių problemų tiek vartotojams, tiek kūrėjams.
11111111 = 255 + 1 ----------- 100000000 = 0 (9 bitai čia, todėl 1 yra apkarpytas)
- 1 bitui didžiausia vertė yra 1,
- 2 bitai - 3,
- 3 bitai - 7,
- 4 bitai - 15
Didžiausias galimas skaičius visada yra 2 ^ N-1, kur N yra bitų skaičius. Kaip jau minėjau, atminties adresas yra numeris ir jis taip pat turi didžiausią vertę. Štai kodėl mašinos žodžio dydis taip pat yra galimų atminties adresų skaičiaus riba - kartais jūsų CPU tiesiog negali apdoroti pakankamai didelių skaičių, kad būtų galima išspręsti daugiau atminties.
Taigi 32 bitais galite išsaugoti numerius nuo 0 iki 2 ^ 32-1, ir tai yra 4 294 967 295. Tai daugiau nei didžiausias adresas 1 GB RAM, todėl jūsų konkrečiu atveju RAM kiekis bus ribojamasis veiksnys.
32 bitų procesoriaus RAM riba teoriškai yra 4 GB (2 ^ 32) ir 64 bitų CPU - 16 EB (exabytes, 1 EB = 2 ^ 30 GB). Kitaip tariant, 64 bitų procesorius gali kreiptis į visą internetą ... 200 kartų;) (įvertintasWolframAlpha).
Tačiau realiame gyvenime veikiančiose operacinėse sistemose 32 bitų procesoriai gali spręsti apie 3 GB RAM. Taip yra dėl operacinės sistemos vidinės architektūros - kai kurie adresai yra skirti kitiems tikslams. Daugiau apie šią vadinamąją 3 GB barjerą galite perskaityti Vikipedijoje. Šią ribą galite panaikinti naudodami fizinio adreso plėtinį.
Kalbant apie atminties adresavimą, turėčiau paminėti keletą dalykų: Virtuali atmintis, segmentavimas ir ieškos.
Virtuali atmintis
Kaip @Daniel R Hicks nurodė kitame atsakyme, OS naudoja virtualią atmintį. Tai reiškia, kad programos iš tikrųjų neveikia tikruose atminties adresuose, bet tuose, kuriuos teikia OS.
Šis metodas leidžia operacinei sistemai perkelti kai kuriuos duomenis iš RAM į vadinamąjį „Pagefile“ („Windows“) arba „Swap“ („Swap“) (* NIX). HDD yra nedidelis mastelis lėtesnis nei RAM, tačiau tai nėra rimta prieiga prie retų duomenų ir leidžia OS suteikti programas daugiau RAM nei įdiegėte.
Raginimas
Apie tai, apie ką kalbėjome, vadiname vienodo adresavimo schemą.
Žurnalas yra alternatyvi adresavimo schema, kuri leidžia spręsti daugiau atminties, kurią paprastai galite naudoti su vienu mašininiu žodžiu plokščiu modeliu.
Įsivaizduokite knygą, užpildytą 4 raidžių žodžiais. Tarkime, kiekviename puslapyje yra 1024 numeriai. Jei norite adresuoti numerį, turite žinoti du dalykus:
- Puslapių, kuriais spausdinamas šis žodis, skaičius.
- Kuris žodis šiame puslapyje yra tas, kurį ieškote.
Dabar būtent šiuolaikiniai x86 procesoriai valdo atmintį. Jis suskirstytas į 4 „KiB“ puslapius (kiekvienas iš jų yra 1024) ir šie puslapiai turi numerius. (iš tikrųjų puslapiai taip pat gali būti 4 MiB arba 2 MiB su PAE). Jei norite kreiptis į atminties elementą, šiame puslapyje reikia puslapio numerio ir adreso. Atkreipkite dėmesį, kad kiekviena atminties ląstelė yra nurodoma lygiai viena skaičiaus pora, o tai nebus segmentavimo atveju.
Segmentavimas
Na, tai yra gana panašus į ieškos. Jis buvo naudojamas „Intel 8086“, tik pavadindamas vieną pavyzdį. Adresų grupės dabar vadinamos atminties segmentais, o ne puslapiais. Skirtumas yra segmentai gali sutapti, ir jie daug sutampa. Pavyzdžiui, 8086 dažniausiai atminties ląstelės buvo prieinamos iš 4096 skirtingų segmentų.
Pavyzdys:
Tarkime, mes turime 8 baitų atminties, visi laikomi nuliai, išskyrus 4 baitą, kuris yra lygus 255.
Lygiosios atminties modelio iliustracija:
_____ | 0 | | 0 | | 0 | | 255 | | 0 | | 0 | | 0 | | 0 | -----
Pagedamos atminties iliustracija su 4 baitų puslapiais:
PAGE0 _____ | 0 | | 0 | | 0 | PAGE1 | 255 | _____ ----- | 0 | | 0 | | 0 | | 0 | -----
Segmentuotos atminties iliustracija su 4 baitų segmentais, perkelti 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 | ----- ----- ----- -----
Kaip matote, ketvirtąjį baitą galima spręsti keturiais būdais: (adresavimas iš 0)
- 0 segmentas, kompensavimas 3
- 1 segmentas, poslinkis 2
- 2 segmentas, poslinkis 1
- 3 segmentas, nuokrypis 0
Jis visada yra tas pats atminties elementas.
Realaus gyvenimo įgyvendinimo segmentuose segmentai yra perkeliami daugiau nei 1 baitu (8086 jis buvo 16 baitų).
Kas yra bloga dėl segmentavimo, yra tai, kad tai sudėtinga (bet manau, kad jau žinote, kad;) Kas gera, yra tai, kad galite naudoti keletą protingų metodų modulinėms programoms kurti.
Pavyzdžiui, kai kuriuos modulius galite įkelti į segmentą, tada apsimesti, kad segmentas yra mažesnis, nei jis iš tikrųjų yra (tik mažas, kad galėtumėte laikyti modulį), tada pasirinkite pirmąjį segmentą, kuris nesutampa su tuo pseudo mažesniu ir įkelkite kitą modulis ir pan. Iš esmės tai, ką jūs gaunate tokiu būdu, yra įvairaus dydžio puslapiai.
Ar ką nors papildyti paaiškinimu? Garsas išjungtas komentaruose. Norite perskaityti daugiau atsakymų iš kitų „tech-savvy Stack Exchange“ vartotojų? Čia rasite visą diskusijų temą.