Joskus on hauskaa tarkastella laskentakokemuksen pintatasoa, ja muina päivinä on hauskaa kaivaa suoraan sisäiseen toimintaan. Tänään tarkastelemme tietokoneen muistin rakennetta ja kuinka paljon tavaroita voit pakata RAM-muistitikulle.
Tämän päivän Kysymys- ja vastausistunto tulee meille SuperUser-yhteisöstään, joka on Stack Exchangen osasto.
Kysymys
SuperUser-lukija Johan Smohan kamppailee siitä, kuinka prosessorin tyyppi ja muistikoko toimivat yhdessä saadakseen kokonaismäärän osoitteita. Hän kirjoittaa:
Kuinka monta muistiosoitetta voimme saada 32-bittisellä prosessorilla ja 1 Gt: n RAM-muistilla ja kuinka monta 64-bittisellä prosessorilla?
Luulen, että se on jotain tällaista:
1 Gt RAM-muistia jaettuna joko 32 bitillä 4 bitillä (?), Jotta saadaan muistiosoitteiden määrä?
Luin Wikipediasta, että yksi muistiosoite on 32 bittiä leveä tai 4 oktettia (1 oktetti = 8 bittiä) verrattuna 64-bittiseen prosessoriin, jossa 1 muistiosoite tai 1 kokonaisluku on 64 bittiä tai 8 oktettia. Mutta en tiedä ymmärsinkö sen oikein.
Nämä ovat sellaisia kysymyksiä, jotka pitävät utelias nörtti yöllä. Kuinka monta osoitetta on käytettävissä Johanin hypoteettisissa järjestelmissä?
Vastaus
SuperUser-avustaja Gronostaj tarjoaa jonkin verran tietoa RAM-muistin jakamisesta ja käytöstä:
Lyhyt vastaus: Käytettävissä olevien osoitteiden määrä on yhtä suuri kuin pienempi osoitteista:
- Muistin koko tavuina
- Suurin allekirjoittamaton kokonaisluku, joka voidaan tallentaa CPU: n konesanaan
Pitkä vastaus ja selitys yllä olevasta:
Muisti koostuu tavuista (B). Jokainen tavu koostuu 8 bitistä (b).
1 B = 8 b1 Gt RAM-muistia on itse asiassa 1 Gt (gigatavua, ei gigatavua). Ero on:
1 Gt = 10 ^ 9 B = 10000000000 B 1 GiB = 2 ^ 30 B = 1037417824 BJokaisella muistitavulla on oma osoite riippumatta siitä, kuinka suuri CPU-konesana on. Esimerkiksi. Intel 8086 -prosessori oli 16-bittinen ja se osoitti muistia tavuilla, niin tekevät myös modernit 32- ja 64-bittiset suorittimet. Tämä on syy ensimmäiseen rajoitukseen - et voi olla enemmän osoitteita kuin muistitavu.
Muistiosoite on vain useita tavuja, jotka suorittimen on ohitettava muistin alusta päästäkseen etsimäänsä.
- 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 yksi 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 on tiedettävä, mitä 32-bittinen todella tarkoittaa. Kuten aiemmin mainitsin, se on konesan kokoinen.
Konesana on muistin määrä, jonka keskusyksikkö käyttää numeroiden pitämiseen (RAM-muistissa, välimuistissa tai sisäisissä rekistereissä). 32-bittinen CPU käyttää 32 bittiä (4 tavua) numeroiden pitämiseen. Myös muistiosoitteet ovat numeroita, joten 32-bittisessä prosessorissa muistiosoite koostuu 32 bitistä.
Ajattele nyt: jos sinulla on yksi bitti, voit tallentaa siihen kaksi arvoa: 0 tai 1. Lisää yksi bitti lisää ja sinulla on neljä arvoa: 0, 1, 2, 3. Kolmella bitillä 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 1111Se toimii täsmälleen kuten tavallinen lisäys, mutta suurin numero on 1, ei 9. Desimaali 0 on
0000, sitten lisäät 1 ja saat0001, lisää yksi vielä kerran ja sinulla on0010. Mitä täällä tapahtui, on kuin desimaalin saaminen09ja lisäämällä yksi: muutat 9 arvoksi 0 ja lisäät seuraavaa numeroa.Yllä olevasta esimerkistä näet, että aina on maksimiarvo, jonka voit pitää lukumäärässä vakiona bittimäärä - koska kun kaikki bitit ovat 1 ja yrität kasvattaa arvoa yhdellä, kaikista bitteistä tulee 0, mikä rikkoo määrä. Sitä kutsutaan kokonaisluvun ylivuodoksi ja aiheuttaa monia epämiellyttäviä ongelmia sekä käyttäjille että kehittäjille.
11111111 = 255 + 1 ----------- 100000000 = 0 (9 bittiä täällä, joten yksi on leikattu)
- 1 bitin 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 lukumäärä. Kuten sanoin aiemmin, muistiosoite on luku ja sillä on myös suurin arvo. Siksi konesanan koko on myös raja käytettävissä olevien muistiosoitteiden määrälle - joskus suorittimesi ei vain pysty käsittelemään tarpeeksi suuria numeroita osoittaakseen enemmän muistia.
Joten 32 bitillä voit pitää numerot välillä 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-muistin määrä on rajoittava tekijä.
32-bittisen keskusyksikön RAM-raja on teoreettisesti 4 Gt (2 ^ 32) ja 64-bittisen suorittimen 16 EB (eksatavua, 1 EB = 2 ^ 30 Gt). Toisin sanoen 64-bittinen CPU voisi käsitellä koko Internetiä… 200 kertaa;) (arvioitu WolframAlpha ).
Tosielämän käyttöjärjestelmissä 32-bittiset suorittimet voivat kuitenkin kohdistaa noin 3 Gt 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 barrier on Wikipedia . Voit nostaa tätä rajaa Fyysisen osoitteen laajennus .
Puhuessani muistin osoittamisesta, on mainittava muutama asia: virtuaalimuisti , segmentointi ja henkilöhaku .
Virtuaalimuisti
Kuten @Daniel R Hicks huomautti toisessa vastauksessa, käyttöjärjestelmät käyttävät virtuaalimuistia. Se tarkoittaa, että sovellukset eivät todellakaan toimi todellisilla, mutta käyttöjärjestelmän tarjoamilla muistiosoitteilla.
Tämän tekniikan avulla käyttöjärjestelmä voi siirtää tietoja RAM-muistista ns. Pagefile (Windows) tai Swap (* NIX). Kiintolevy on muutama suuruus hitaampi kuin RAM, mutta se ei ole vakava ongelma harvoin käytetyille tiedoille, ja se antaa käyttöjärjestelmän tarjota sovelluksille enemmän RAM-muistia kuin olet itse asentanut.
Henkilöhaku
Sitä mitä puhumme toistaiseksi, kutsutaan tasaiseksi osoitetuksi järjestelmäksi.
Sivutus on vaihtoehtoinen osoitemalli, jonka avulla voidaan kohdistaa enemmän muistia kuin tavallisesti yhdellä konesanalla tasaisessa mallissa.
Kuvittele kirja, joka on täynnä 4 kirjainta. Oletetaan, että jokaisella sivulla on 1024 numeroa. Numeron osoittamiseksi sinun on tiedettävä kaksi asiaa:
- Sivun numero, jolle kyseinen sana tulostetaan.
- Mikä kyseisellä sivulla oleva sana on etsimäsi.
Nyt modernit x86-suorittimet käsittelevät tarkasti muistia. Se on jaettu 4 KiB-sivuun (kussakin 1024 konesanaa), ja näillä sivuilla on numeroita. (itse asiassa sivut voivat olla myös 4 MiB isoja tai 2 MiB kanssa PAE ). Kun haluat osoittaa muistisolun, tarvitset sivunumeron ja osoitteen. Huomaa, että jokaiseen muistisoluun viitataan tarkalleen yhdellä numeroparilla, mikä ei ole segmentoitumisen tapaus.
Segmentointi
No, tämä on melko samanlainen kuin henkilöhaku. Sitä käytettiin Intel 8086: ssa, vain yhden esimerkin mainitsemiseksi. Osoiteryhmiä kutsutaan nyt muistisegmenteiksi, ei sivuiksi. Ero on siinä, että segmentit voivat olla päällekkäisiä, ja ne ovat päällekkäisiä. Esimerkiksi 8086: lla useimmat muistisolut olivat käytettävissä 4096 eri segmentistä.
Esimerkki:
Oletetaan, että meillä on 8 tavua muistia, joilla kaikilla on nollia lukuun ottamatta 4. tavua, joka on yhtä suuri kuin 255.
Kuva litteän muistin mallista:
_____ | 0 | | 0 | | 0 | | 255 | | 0 | | 0 | | 0 | | 0 | -----Kuva sivutetulle muistille 4 tavun sivuilla:
SIVU0 _____ | 0 | | 0 | | 0 | SIVU 1 | 255 | _____ ----- | 0 | | 0 | | 0 | | 0 | -----Kuva segmentoidulle muistille 4-tavuiset segmentit siirretty yhdellä:
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 | _____ 7.SEG ----- | 0 | | 0 | | 0 | | 0 | _____ ----- | 0 | | 0 | | 0 | | 0 | ----- ----- ----- -----Kuten näette, neljään tavuun voidaan osoittaa neljä tapaa: (osoite 0: sta)
- Segmentti 0, siirtymä 3
- Segmentti 1, siirtymä 2
- Segmentti 2, siirtymä 1
- Segmentti 3, siirtymä 0
Se on aina sama muistisolu.
Todellisessa toteutuksessa segmenttejä siirretään enemmän kuin 1 tavu (8086: lle se oli 16 tavua).
Segmentoinnissa on huono, että se on monimutkaista (mutta luulen, että tiedät sen jo;) Mikä on hyvä, on se, että voit käyttää joitain fiksuja tekniikoita modulaaristen ohjelmien luomiseen.
Voit esimerkiksi ladata osan moduulista segmenttiin, sitten teeskennellä, että segmentti on pienempi kuin se todellisuudessa on (vain tarpeeksi pieni moduulin pitämiseen), valitse sitten ensimmäinen segmentti, joka ei ole päällekkäinen kyseisen näennäis-pienemmän kanssa, ja lataa seuraava moduuli ja niin edelleen. Pohjimmiltaan, mitä saat tällä tavalla, ovat erikokoisia sivuja.
Onko sinulla jotain lisättävää selitykseen? Ääni pois kommenteista. Haluatko lukea lisää vastauksia muilta teknisesti taitavilta Stack Exchangen käyttäjiltä? Katso koko keskusteluketju täältä .