20Aug

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

Jonakin päivänä on hauskaa katsoa laskentakokemuksen pintatasoa, 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 &Vastausistunto tulee meille kohteliaasti SuperUser-osastoon Stack Exchange, yhteisöllinen ryhmittely Q & A verkkosivuilla.

Kysymys

SuperUser-lukija Johan Smohan kamppailee siitä, kuinka 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ämä on jotain tällaista:

1 Gt ram jaettuna joko 32 bittiä 4 bittiä( ?) Saada muistia osoitteita?

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

Nämä ovat sellaisia ​​kysymyksiä, jotka voivat pitää utelias geek ylös 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 käytetään:

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

  • Muistikoko tavuissa
  • Suurin allekirjoittamaton kokonaisluku, joka voidaan tallentaaCPU: n koneen sanassa

Pitkä vastaus ja selitys edellä:

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

1 B = 8 b

1 Gt 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

Jokaisen muistin tavulla on oma osoite riippumatta siitä, kuinka suuri CPU-koneen sana on. Esim. 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.

Muistipaikka on vain muutamia tavuja, joten prosessorin on ohitettava muistin alusta päästäkseen etsimään.

  • Ensimmäisen tavun käyttämiseksi sen 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. ..)
  • viimeinen tavu, CPU ohittaa 1073741823 tavua, joten sen osoite on 1073741823.

Nyt sinun on tiedettävä, 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 kahdeksanarvot: 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 111011 12 1100 13 1101 14 1110 15 1111

Se toimii täsmälleen kuin tavallinen lisäys, mutta suurin numero on 1, ei 9. desimaali 0 on 0000, lisää 1 ja saat 0001, lisää yksi uudelleen ja sinulla on 0010. Mitätapahtuu täällä on kuin kun on desimaali 09 ja lisätään yksi: muutat 9: sta 0: een ja lisää seuraavan numeron.

Edellä olevasta esimerkistä näet, että aina on maksimaalinen arvo, jota voit pitää numerossa, jossa on jatkuvasti bittiä - koska kun kaikki bitit ovat 1 ja yrität lisätä arvoa 1, kaikki bitit tulevat 0: ksi, jolloin ne rikkovatnumero. 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 bitille suurin arvo on 1,
  • 2 bittiä - 3,
  • 3 bittiä -7,
  • 4 bittiä - 15

Suurin mahdollinen numero 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-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 muistin osoittamisesta on muutamia asioita, joista minun pitäisi mainita: virtuaalimuisti , segmentointi ja sivut .

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ä ns. Pagefile( Windows) tai Swap( * NIX) -muotoon. 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.

Paging

Tähän saakka puhumme kutsutaan tasainen osoitejärjestelmä.

Paging on vaihtoehtoinen osoitusjärjestelmä, jonka avulla voidaan käsitellä enemmän muistia, jota normaalisti voisit käyttää yhden koneen sanaa litteässä mallissa.

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

  • Sivun numero, jolle kyseinen sana tulostetaan.
  • Mikä sana tällä sivulla on juuri etsimäsi sana.

Nyt juuri kuinka modernit x86-prosessorit 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.

Segmentaatio

No, tämä on melko samanlainen kuin hakutoiminto. 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 paitsi neljäs tavu, joka on 255.

Taivutusmuoto malli:

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

Kuvasuurennetun muistin kuva 4-tavuisella sivulla:

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

Segmentoidun muistin kuva , jossa on 4 tavun segmentit siirretty 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äet, 4. 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).

Mikä on huono segmentoitumisesta, se on monimutkainen( mutta mielestäni jo tiedät sen;) Mikä on hyvä, että voit käyttää älykkäitä tekniikoita modulaaristen ohjelmien luomiseen.

Esimerkiksi voit ladata jonkin moduulin 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 lataaseuraava moduuli ja niin edelleen. Pohjimmiltaan, mitä tällä tavoin saat, on eri kokoisia sivuja.

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