20Aug
Kažkuriomis dienomis įdomu pažvelgti į kompiuterio patirties paviršiaus lygį, o kitomis dienomis įdomu sugrįžti į vidines veiklas.Šiandien mes pažvelgtame į kompiuterio atminties struktūrą ir kiek daug daiktų galite įpakuoti į RAM atmintinę.
Šiandienos klausimas &Atsakymų sesija ateina pas mus iš "SuperUser" - "Stack Exchange", bendruomenės pagrįstos "Q & A" svetainių grupės, padalijimo.
Klausimas
SuperUser skaitytojas Johan Smohan kovoja su tuo, kaip procesoriaus tipas ir atminties dydis dirba kartu, kad gautų bendrą adresų skaičių.Jis rašo:
Kiek atminties adresus galime gauti su 32 bitų procesoriumi ir 1 GB talpos ir kiek su 64 bitų procesoriumi?
Aš manau, kad tai kažkas panašaus į tai:
1GB RAM, padalytas iš 32 bitų 4 bitų( ?), Norint gauti atminties adresų skaičių?
Aš skaitau Vikipedijoje, kad 1 atminties adresai 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 bitų pločio arba 8 oktetai. Bet nežinau, ar tai supratau.
Tai yra klausimų rūšis, dėl kurių nakties metu gali būti įdomu geek. Kiek adresų yra kiekvienoje iš Johano hipotetinių sistemų?
Atsakymas
SuperUser autorius Gronostaj pateikia keletą įžvalgų apie tai, kaip RAM yra padalintas ir naudojamas:
Trumpas atsakymas: Galimų adresų skaičius yra lygus mažesniems iš šių:
- Atminties dydis baitais
- Didžiausias nesignatuotas sveikasis skaičius, kurį galima išsaugotiCPU mašininiame žodyje
Ilgą atsakymą ir paaiškinimą aukščiau:
Atmintis susideda iš baitų( B).Kiekvienas baitas susideda iš 8 bitų( b).
1 B = 8 b1 GB atminties yra 1 GiB( gibibyte, ne gigabaitas).Skirtumas yra toks:
1 GB = 10 ^ 9 B = 1 000 000 000 B 1 GiB = 2 ^ 30 B = 1 073 741 824 BKiekvienas atminties baitas turi savo adresą, nesvarbu, koks didelis CPU mašininis žodis. Pvz."Intel 8086" procesorius buvo 16 bitų, o atmintis kreipėsi baitais, taip pat ir šiuolaikinius 32 bitų ir 64 bitų procesorius. Tai yra pirmosios ribos priežastis - negalite turėti daugiau adresų nei atminties baitai.
Atminties adresas yra tik keli baitai, CPU turi praleisti atminties pradžią, kad pasiektų norimą.
- Norėdami pasiekti pirmąjį baitą, jis turi praleisti 0 baitų, todėl pirmasis baito adresas yra 0.
- Norėdami pasiekti antrąjį baitą, jis turi praleisti 1 baitą, todėl jo adresas yra 1.
- ( ir kt.. ..)
- Norėdami pasiektiPaskutinis baitas, CPU praleidžia 1073741823 baitų, todėl jo adresas yra 1073741823.
Dabar jūs turite žinoti, kas iš tikrųjų reiškia 32 bitų.Kaip minėjau anksčiau, tai mašininio žodžio dydis.
Automatinis žodis - tai atminties procesoriaus kiekis, naudojamas išlaikyti numerius( RAM, talpykloje ar vidiniuose registruose).32 bitų procesorius naudoja 32 bitus( 4 baitus), kad išlaikytų numerius. Atminties adresai yra ir skaičiai, todėl 32 bitų procesoriaus atminties adresą sudaro 32 bitai.
Dabar pagalvokite apie tai: jei turite vieną bitą, galite išsaugoti dvi jo reikšmes: 0 arba 1. Įtraukite dar vieną bitą ir turite keturias reikšmes: 0, 1, 2, 3. Trimis bitais galite išsaugoti aštuonisVertės: 0, 1, 2. .. 6, 7. Tai iš tikrųjų yra dvejetainė sistema, kuri veikia taip:
Binary Decimal 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 1111Tai veikia lygiai taip pat, kaip ir įprastas papildymas, tačiau maksimalus skaičius yra 1, o ne 9. Dešimtainis 0 yra 0000, tada pridedate 1 ir gaunate 0001, dar kartą pridėkite dar kartą ir turite 0010. Kasčia pasirodo kaip dešimtainis 09 ir pridedamas vienas: jūs pakeisite 9 iki 0 ir padidinsite kitą skaitmenį.
Iš pirmiau pateikto pavyzdžio matote, kad visada yra didžiausia reikšmė, kurią galite laikyti skaičiuje su nuolatiniu bitų skaičiumi - nes kai visi bitai yra 1 ir bandote padidinti vertę iki 1, visi bitai taps 0, todėl pertraukosskaičius. Tai vadinama sveikaisiais perpildymais ir sukelia daug nemalonių problemų tiek vartotojams, tiek kūrėjams.
11111111 = 255 + 1 ----------- 100000000 = 0( 9 bitai čia, taigi 1 yra apdailintas)- 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, jis taip pat turi didžiausią vertę.Štai kodėl mašininio žodžio dydis taip pat yra apribotas galimų atminties adresų skaičiui - kartais jūsų procesorius negali apdoroti pakankamai didelių skaičių, kad būtų galima spręsti daugiau atminties.
Taigi, 32 bitais galite išlaikyti numerius nuo 0 iki 2 ^ 32-1, o tai yra 4 294 967 295. Tai daugiau nei didžiausias 1GB atminties adresas, taigi jūsų konkrečiu atveju RAM suma bus ribojantis veiksnys.
RAM riba 32 bitų CPU yra teoriškai 4 GB( 2 ^ 32), o 64 bitų CPU - 16 EB( exabytes, 1 EB = 2 ^ 30 GB).Kitaip tariant, 64 bitų procesorius gali išspręsti visą internetą. .. 200 kartų;)( apskaičiuotas "WolframAlpha").
Tačiau realiose operacinėse sistemose 32 bitų procesoriai gali apdoroti apie 3 GiB RAM.Taip yra dėl operacinės sistemos vidinės architektūros - kai kurie adresai yra rezervuoti kitiems tikslams. Daugiau apie tai vadinamą 3 GB barjerą galite sužinoti Vikipedijoje.Ši limitą galite pakelti naudodami fizinio adreso plėtinį.
Kalbant apie atminties nukreipimą, aš turėčiau paminėti keletą dalykų: virtualiosios atminties , segmentavimo ir puslapių paieškos .
Virtuali atmintis
Kaip sakė @ Daniel R Hicks kitame atsakyme, operacinės sistemos naudoja virtualiąją atmintį.Tai reiškia, kad programos iš tikrųjų neveikia tikruos atminties adresuose, bet ir OS.
Šis metodas leidžia operacinei sistemai perkelti kai kuriuos duomenis iš RAM į vadinamąjį Pagefile( "Windows") arba "Swap"( * NIX).HDD yra keletas dydžių, kurie yra lėtesni nei RAM, tačiau tai nėra rimta problema retai prieinamais duomenimis, o OS suteikia programoms daugiau RAM nei jūs iš tikrųjų įdiegėte.
Pagingas
Ką mes apie tai kalbėjome iki šiol vadinama plokščia adresavimo schema."
Paging" yra alternatyvi adresavimo schema, leidžianti spręsti daugiau atminties, kurią paprastai galėtumėte su vienu mašininiu žodžiu plokščiuoju modeliu.
Įsivaizduokite knygą, užpildytą 4 raidėmis žodžiais. Tarkime, kiekviename puslapyje yra 1024 numerių.Norėdami išspręsti numerį, turite žinoti du dalykus:
- Puslapio numeris, kuriame šis tekstas yra atspausdintas.
- Kuris žodis šiame puslapyje yra tas, kurį ieškote.
Dabar būtent tai, kaip šiuolaikiniai x86 procesoriai tvarko atmintį.Jis suskirstytas į 4 KiB puslapius( po 1024 mašininius žodžius) ir šiuose puslapiuose yra numerių.(iš tikrųjų puslapiai taip pat gali būti 4 MiB arba 2 MiB su PAE).Jei norite kreiptis į atminties ląstelę, šiame puslapyje reikia puslapio numerio ir adreso. Atkreipkite dėmesį, kad kiekviena atminties ląstelė nurodo tiksliai vieną porą skaičių, tai nebus segmente.
segmentavimas
Na, šis yra gana panašus į peidžerių.Jis buvo naudojamas "Intel 8086", tik norint pavadinti vieną pavyzdį.Adresų grupės dabar vadinamos atminties segmentais, o ne puslapiais. Skirtumas yra tas, kad segmentai gali dubliuoti, o jie daug dera. Pavyzdžiui, 8086 dauguma atminties ląstelių buvo prieinama iš 4096 skirtingų segmentų.
Pavyzdys:
Tarkime, kad mes turime 8 baitų atminties, visi laikomi nuliais, išskyrus 4 baitą, kuris lygus 255.
iliustracija plokščios atminties modeliui:
_____ |0 ||0 ||0 ||255 |. ||0 ||0 ||0 ||0 |-----Iliustracija išeitinei atminčiai su 4 lapų puslapiais:
PAGE0 _____ |0 ||0 ||0 |PAGE1 |255 |. |_____ ----- |0 ||0 ||0 ||0 |-----Iliustracija segmentuotai atminčiai su 4 bitų segmentais, perkeltais 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, 4-asis baitas gali būti išspręstas keturiais būdais:( adresavimas iš 0)
- segmentas 0, kompensuoti 3
- segmentas 1,kompensuoti 2
- segmentas 2, kompensuoti 1
- 3 segmentas, kompensuoti 0
Visada ta pati atminties ląstelė.
Realiojo gyvenimo realizacijose segmentai yra perkelti daugiau nei 1 baitu( 8086 buvo 16 baitų).
Blogai kalbant apie segmentaciją, tai yra sudėtinga( bet manau, kad jau žinote, kad); gerai, kad galite kurti modulines programas naudodami keletą protingų metodų.
Pvz., Galite įkelti tam tikrą modulį į segmentą, tada apsimestumėte, kad segmentas yra mažesnis, nei iš tikrųjų yra( pakankamai mažas, kad laikytumėte modulį), tada pasirinkite pirmąjį segmentą, kuris neatitinka šio pseudo-mažesnio ir įkelkitekitas modulis ir pan. Iš esmės tai, ką jūs gaunate, yra kintamojo dydžio puslapiai.
Ar ką nors įtraukti į paaiškinimą?Garsas išjungtas komentaruose. Norite skaityti daugiau atsakymų iš kitų "Tech-savvy Stack Exchange" vartotojų?Patikrinkite visą diskusijų temą čia.