If-Koubou

Kuinka monta muistiosoitetta Voiko RAM-muistin omassa tietokoneessani pitää?

Kuinka monta muistiosoitetta Voiko RAM-muistin omassa tietokoneessani pitää? (Miten)

Jonakin päivänä on hauskaa katsoa laskentakokemuksen pinnan tasoa, ja muina päivinä on hauskaa riisua suoraan sisäiseen toimintaan. Tänään tarkastelemme tietokoneen muistin rakennetta ja kuinka paljon tavaraa voi pakata RAM-muistitikkuun.

Tämän päivän kysymys- ja vastausistunto tulee meihin SuperUserin hyväksi - Stack Exchangein alaosasto, joka on yhteisöllinen Q & A-sivustojen ryhmittely.

Kysymys

SuperUser-lukija Johan Smohan kamppailee siihen, miten prosessorin tyyppi ja muistin koko toimivat yhdessä saaden yhteensä osoitteita. Hän kirjoittaa:

Kuinka monta muistiosoitetta voimme saada 32-bittisellä prosessorilla ja 1 Gt ramilla ja kuinka monta 64-bittisellä prosessorilla?

Mielestäni tällainen on:

1 gigatavun ram jaettuna joko 32 bittiä 4 bittiä (?) Saadaksesi muistin osoitteiden lukumäärän?

Luen Wikipediaa, että 1 muistin osoite on 32 bittiä leveä tai 4 oktetta (1 oktetti = 8 bittiä) verrattuna 64 bittiseen prosessoriin, jossa 1 muistin osoite tai 1 kokonaisluku on 64 bittiä leveä tai 8 oktetta. Mutta en tiedä, ymmärsinkö sen oikein.

Nämä ovat sellaisia ​​kysymyksiä, jotka voivat pitää yllä uteliaan geekin yöllä. Kuinka monta osoitetta on saatavilla Johanin hypoteettisten järjestelmien alla?

Vastaus

SuperUser-avustaja Gronostaj tarjoaa jonkinlaisen käsityksen siitä, miten RAM jaetaan ja hyödynnetään:

Lyhyt vastaus: Käytettävissä olevien osoitteiden määrä on yhtä suuri kuin pienempi kuin:

  • Muistikoko tavuina
  • Suurin allekirjoittamaton kokonaisluku, joka voidaan tallentaa CPU: n koneeseen

Pitkä vastaus ja selitys edellä:

Muisti koostuu tavuista (B). Jokainen tavu koostuu 8 bittiä (b).

1 B = 8 b 

1 GB RAM on oikeastaan ​​1 GiB (gibibyte, ei gigatavua). Ero on:

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

Jokaisella muistin tavulla on oma osoite, ei väliä kuinka suuri CPU-koneen sana on. Esimerkiksi. Intel 8086 -suoritin oli 16-bittinen ja se käsitteli muistia tavujen mukaan, joten tekevät modernit 32- ja 64-bittiset suorittimet. Se on syy ensimmäiseen rajaan - et voi olla enemmän osoitteita kuin muistitavuja.

Muistiosoite on vain muutamia tavuja, joten CPU: n on ohitettava muistin alusta päästäkseen etsimään.

  • Ensimmäisen tavun käyttämiseksi on ohitettava 0 tavua, joten ensimmäisen tavun osoite on 0.
  • Toisen tavun käyttämiseksi sen on ohitettava 1 tavu, joten sen osoite on 1.
  • (ja niin edelleen… )
  • Viimeisen tavun käyttämiseksi CPU ohittaa 1073741823 tavua, joten sen osoite on 1073741823.

Nyt sinun täytyy tietää, mitä 32-bittinen tarkoittaa. Kuten aiemmin mainitsin, se on koneen sana.

Koneen sana on muistin määrä, jonka CPU käyttää numeroiden pitämiseen (RAM, välimuisti tai sisäiset rekisterit). 32-bittinen CPU käyttää 32 bittiä (4 tavua) pitämään numeroita. Muistiosoitteet ovat myös numeroita, joten 32-bittisessä suorittimessa muistiosoite on 32 bittiä.

Ajattele nyt tätä: jos sinulla on yksi bitti, voit tallentaa siihen kaksi arvoa: 0 tai 1. Lisää yksi bitti ja sinulla on neljä arvoa: 0, 1, 2, 3. Kolme bittiä voit tallentaa kahdeksan arvoa : 0, 1, 2 ... 6, 7. Tämä on itse asiassa binaarijärjestelmä ja se toimii näin:

Binaarinen desimaali 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 

Se toimii täsmälleen tavallisella lisäyksellä, mutta maksimimäärä on 1, ei 9. desimaali 0 on0000, lisää sitten 1 ja saat0001, lisää yksi vielä kerran ja olet0010. Se mitä tapahtuu täällä on kuin kun on desimaali09 ja lisäämällä: vaihdat 9: sta 0: een ja lisää seuraavan numeron.

Edellä olevasta esimerkistä näet, että aina on maksimiarvo, jota voit pitää numerossa, jossa on jatkuvasti bittiä - koska kun kaikki bitit ovat 1 ja yrität lisätä arvoa 1, kaikki bittien arvot ovat 0, jolloin ne rikkovat määrä. Sitä kutsutaan kokonaisluvuksi ja aiheuttaa monia epämiellyttäviä ongelmia sekä käyttäjille että kehittäjille.

 11111111 = 255 + 1 ----------- 100000000 = 0 (9 bittiä tässä, joten 1 on leikattu) 
  • 1 bittiä varten suurin arvo on 1,
  • 2 bittiä - 3,
  • 3 bittiä - 7,
  • 4 bittiä - 15

Suurin mahdollinen luku on aina 2 ^ N-1, missä N on bittien määrä. Kuten sanoin aiemmin, muistiosoite on numero ja sillä on myös suurin arvo. Siksi koneen sana on myös rajoitettu käytettävissä olevien muistien osoitteiden lukumäärälle - joskus prosessori ei pysty käsittelemään riittävän suuria numeroita käsittelemään enemmän muistia.

Joten 32 bittiä voit pitää numerot 0-2 ^ 32-1 ja se on 4 294 967 295. Se on enemmän kuin suurin osoite 1 Gt: n RAM-muistissa, joten erityisessä tapauksessa RAM: n määrä on rajoittava tekijä.

32-bittisen CPU: n RAM-raja on teoreettisesti 4 Gt (2 ^ 32) ja 64-bittiselle CPU: lle 16 EB (exabytes, 1 EB = 2 ^ 30 Gt). Toisin sanoen 64-bittinen CPU voisi käsitellä koko Internetin ... 200 kertaa;) (arvioitu WolframAlpha).

Todellisissa käyttöjärjestelmissä 32-bittiset suorittimet voivat kuitenkin käsitellä noin 3 GiB RAM-muistia. Tämä johtuu käyttöjärjestelmän sisäisestä arkkitehtuurista - jotkut osoitteet on varattu muihin tarkoituksiin. Voit lukea lisää tästä ns. 3 Gb: n esteestä Wikipediassa. Voit nostaa tämän rajan Fyysisen osoiterivin avulla.

Puhuminen muistiosoituksesta on muutamia asioita, joista minun pitäisi mainita:virtuaalimuistijakautuminenjahenkilöhaku.

Virtuaalimuisti

Kuten @Daniel R Hicks huomautti toisessa vastauksessa, käyttöjärjestelmät käyttävät virtuaalimuistia. Se tarkoittaa sitä, että sovellukset eivät todellisuudessa toimi todellisissa muistiosoitteissa, vaan OS: ssä.

Tämä tekniikka sallii käyttöjärjestelmän siirtää joitain tietoja RAM: stä niin sanottuun Pagefile (Windows) tai Swap (* NIX).Kiintolevy on muutamia pienempiä kuin RAM, mutta se ei ole vakava ongelma harvoin saatavilla oleville tiedoille ja sallii käyttöjärjestelmän tarjota sovelluksille enemmän RAM-muistia kuin olet itse asentanut.

Hakulaite

Se, mitä puhumme toistaiseksi, kutsutaan tasoratkaisuksi.

Paging on vaihtoehtoinen osoitejärjestelmä, jonka avulla voidaan käsitellä enemmän muistia, jota tavallisesti saatat käyttää yhden koneen sanaa litteässä mallissa.

Kuvittele kirja, jossa on 4 kirjainta. Sanotaan, että jokaisella sivulla on 1024 numeroa. Jos haluat vastata numeroon, sinun on tiedettävä kaksi asiaa:

  • Sen sivun määrä, jolle kyseinen sana on painettu.
  • Mikä sana tällä sivulla on etsimäsi sana.

Nyt on täsmälleen miten nykyaikaiset x86-suorittimet käsittelevät muistia. Se on jaettu 4 kt: n sivuihin (1024 koneen sanaa) ja niillä on numeroita. (oikeastaan ​​sivut voivat olla 4 MiB suuria tai 2 MiB PAE: n kanssa). Kun haluat käsitellä muistisolua, tarvitset sivun numeron ja osoitteen kyseisellä sivulla. Huomaa, että jokaiseen muistisoluun viitataan täsmälleen yhdellä parilla numeroita, mikä ei ole tapaus segmentointia varten.

jakautuminen

No, tämä on melko samanlainen kuin haku. Sitä käytettiin Intel 8086: ssa, vain yhden esimerkin nimeämiseksi. Osoiteryhmät kutsutaan nyt muistisegmenteiksi, ei sivuiksi. Ero on, että segmentit voivat olla päällekkäisiä, ja ne ovat päällekkäisiä paljon. Esimerkiksi 8086 useimmilla muistisoluilla oli 4096 eri segmenttiä.

Esimerkki:

Sanotaan, että meillä on 8 tavua muistia, jotka kaikki pitävät nollia lukuun ottamatta neljää tavua, joka on 255.

Kuva flat memory mallille:

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

Kuva paged muistiin 4-tavuisella sivulla:

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

Kuva segmentoituun muistiin jossa 4 tavun segmentit siirrettiin 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 | ----- ----- ----- ----- 

Kuten näette, neljäs tavu voidaan käsitellä neljään tapaan: (osoite 0)

  • Segmentti 0, offset 3
  • Segmentti 1, offset 2
  • Segmentti 2, offset 1
  • Segmentti 3, offset 0

Se on aina sama muistisolu.

Todellisissa toteutuksissa segmentit siirretään yli 1 tavulla (8086: lle 16 tavua).

Se, mikä on huono segmentoitumisesta, on se, että se on monimutkaista (mutta mielestäni jo tiedät sen;). Hyvää on, että voit käyttää älykkäitä tekniikoita modulaaristen ohjelmien luomiseen.

Voit esimerkiksi ladata osan moduulista osaksi segmenttiä, sitten teeskennellä, että segmentti on pienempi kuin se on (vain tarpeeksi pieni pitämään moduuli), valitse sitten ensimmäinen segmentti, joka ei ole päällekkäinen pseudo-pienemmän kanssa ja lataa seuraavan moduuli ja niin edelleen. Pohjimmiltaan, mitä tällä tavoin saat, on eri kokoisia sivuja.

Onko jokin asia lisättävä selitykseen? Kuulkaa kommentit. Haluatko lukea lisää vastauksia muilta tech-tajuilta Stack Exchange-käyttäjiltä? Katso koko keskusteluketju täältä.