Mājas lapa » » Cik atmiņas adreses var saglabāt manu datoru?

    Cik atmiņas adreses var saglabāt manu datoru?

    Kādu dienu ir jautri aplūkot skaitļošanas pieredzes virsmas līmeni, un citās dienās tas ir jautri ienirt tieši iekšējos darbos. Šodien mēs aplūkojam datora atmiņas struktūru un to, cik daudz sīkumu jūs varat iesaiņot RAM atmiņā.

    Šodienas jautājumu un atbilžu sesija mums dod pieklājību no SuperUser-Stack Exchange apakšnodaļas, kas ir kopienas orientēta Q & A tīmekļa vietņu grupa.

    Jautājums

    SuperUser lasītājs Johans Smohans cīnās ar to, kā procesora tips un atmiņas izmērs darbojas kopā, lai iegūtu kopējo adrešu skaitu. Viņš raksta:

    Cik atmiņas adreses var saņemt ar 32 bitu procesoru un 1GB RAM un cik 64 bitu procesoru?

    Es domāju, ka tas ir kaut kas šāds:

    1GB RAM dalīts ar 32 bitiem 4 biti (?), Lai iegūtu atmiņas vietu skaitu?

    Es izlasīju Wikipedia, ka 1 atmiņas adreses ir 32 bitu plata vai 4 okteti (1 oktets = 8 biti), salīdzinot ar 64 bitu procesoru, kur 1 atmiņas adrese vai 1 vesels skaitlis ir 64 bitu plats vai 8 okteti. Bet nezinu, vai es to pareizi sapratu.

    Šie ir jautājumi, kas naktī var saglabāt ziņkārīgu ģeeku. Cik daudz adreses ir pieejamas katrā no Johana hipotētiskajām sistēmām?

    Atbilde

    SuperUser ieguldītājs Gronostaj piedāvā zināmu ieskatu, kā RAM tiek sadalīts un izmantots:

    Īsā atbilde: Pieejamo adrešu skaits ir vienāds ar mazāko no tiem:

    • Atmiņas lielums baitos
    • Lielākais neparakstītais vesels skaitlis, ko var saglabāt CPU mašīntēlā

    Ilgstoša atbilde un paskaidrojums par iepriekš minēto:

    Atmiņa sastāv no baitiem (B). Katrs baits sastāv no 8 bitiem (b).

    1 B = 8 b 

    1 GB RAM faktiski ir 1 GiB (gibibīts, ne gigabaits). Atšķirība ir:

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

    Katrai atmiņas atmiņai ir sava adrese, neatkarīgi no tā, cik liels ir CPU mašīnas vārds. Piemēram, Intel 8086 CPU bija 16 bitu, un tas bija vērsts uz atmiņu ar baitiem, tāpēc arī mūsdienu 32 bitu un 64 bitu CPU. Tas ir pirmā ierobežojuma cēlonis - jums nevar būt vairāk adrešu nekā atmiņas baiti.

    Atmiņas adrese ir tikai vairāki baiti, kurus CPU izlaiž no atmiņas sākuma, lai nokļūtu tajā, ko meklē.

    • Lai piekļūtu pirmajam baitam, tai ir jāizlaiž 0 baiti, tāpēc pirmā baita adrese ir 0.
    • Lai piekļūtu otrajam baitam, tai ir jāizlaiž 1 baits, tāpēc tās adrese ir 1.
    • (un tā tālāk… )
    • Lai piekļūtu pēdējam baitam, CPU izlaiž 1073741823 baitus, tāpēc tās adrese ir 1073741823.

    Tagad jums ir jāzina, kas patiesībā nozīmē 32 bitu. Kā jau iepriekš minēju, tas ir mašīnas vārda izmērs.

    Iekārtas vārds ir atmiņas daudzums, ko CPU izmanto, lai turētu numurus (RAM, kešatmiņā vai iekšējos reģistros). 32 bitu CPU izmanto 32 bitus (4 baitus), lai saglabātu numurus. Atmiņas adreses ir arī skaitļi, tāpēc 32 bitu CPU atmiņas adrese sastāv no 32 bitiem.

    Tagad padomājiet par to: ja jums ir viens bits, varat saglabāt divas vērtības: 0 vai 1. Pievienojiet vēl vienu bitu, un jums ir četras vērtības: 0, 1, 2, 3. Trīs biti var saglabāt astoņas vērtības : 0, 1, 2… 6, 7. Tas faktiski ir bināra sistēma, un tā darbojas šādi:

    Binārā decimālā 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 

    Tas darbojas tieši tāpat kā parastais papildinājums, bet maksimālais cipars ir 1, nevis 9. Decimal 0 ir 0000, tad jūs pievienojat 1 un saņemsiet 0001, pievienojiet vēl vienu un jums ir 0010. Kas notiek šeit, ir kā ar decimāldaļu 09 un pievienojot vienu: jūs maināt 9 līdz 0 un pieaugums nākamajam ciparam.

    No iepriekš minētā piemēra jūs varat redzēt, ka vienmēr ir maksimālā vērtība, ko var saglabāt skaitlī ar nemainīgu bitu skaitu - jo tad, kad visi biti ir 1 un jūs mēģināt palielināt vērtību par 1, visi biti kļūs par 0, tādējādi pārkāpjot numuru. To sauc par veselu skaitļu pārplūdi un rada daudz nepatīkamu problēmu gan lietotājiem, gan izstrādātājiem.

     11111111 = 255 + 1 ----------- 100000000 = 0 (9 biti šeit, tāpēc 1 ir apgriezts) 
    • 1 bitu lielākā vērtība ir 1,
    • 2 biti - 3,
    • 3 biti - 7,
    • 4 biti - 15

    Vislielākais skaitlis vienmēr ir 2 ^ N-1, kur N ir bitu skaits. Kā jau iepriekš teicu, atmiņas adrese ir numurs un tai ir arī maksimālā vērtība. Tāpēc mašīnu vārda lielums ir arī ierobežojums pieejamo atmiņas adrešu skaitam - dažreiz jūsu CPU vienkārši nevar apstrādāt pietiekami lielus numurus, lai risinātu vairāk atmiņas.

    Tātad 32 bitos jūs varat saglabāt ciparus no 0 līdz 2 ^ 32-1, un tas ir 4 294 967 295. Tas ir lielāks par lielāko adresi 1 GB RAM, tāpēc jūsu konkrētajā gadījumā RAM apjoms būs ierobežojošs faktors.

    RAM ierobežojums 32 bitu CPU ir teorētiski 4 GB (2 ^ 32) un 64 bitu CPU tas ir 16 EB (eksabīti, 1 EB = 2 ^ 30 GB). Citiem vārdiem sakot, 64 bitu CPU varētu risināt visu internetu… 200 reizes;) (aprēķināts ar WolframAlpha).

    Tomēr reālās dzīves operētājsistēmās 32 bitu CPU var risināt apmēram 3 GiB RAM. Tas ir operētājsistēmas iekšējās arhitektūras dēļ - dažas adreses ir rezervētas citiem mērķiem. Vairāk par šo tā saucamo 3 GB barjeru var izlasīt Wikipedia. Šo ierobežojumu var atcelt ar fizisko adrešu paplašinājumu.

    Runājot par atmiņas adresēšanu, man ir jānorāda tikai dažas lietas: virtuālā atmiņasegmentācija un peidžeri.

    Virtuālā atmiņa

    Tā kā @Daniel R Hicks citā atbildē norādīja, OSs izmanto virtuālo atmiņu. Tas nozīmē, ka lietojumprogrammas faktiski nedarbojas uz reālām atmiņas adresēm, bet tās, ko nodrošina OS.

    Šī metode ļauj operētājsistēmai pārvietot dažus datus no RAM uz tā saucamo Pagefile (Windows) vai Swap (* NIX). HDD ir mazliet lēnāks nekā RAM, bet tas nav nopietna problēma reti piekļūstamiem datiem, un tas ļauj OS nodrošināt lietojumprogrammas vairāk RAM, nekā jūs faktiski esat instalējis.

    Peidžerēšana

    Līdz šim mēs runājām par vienotas adresēšanas shēmu.

    Peidžerēšana ir alternatīva adresēšanas shēma, kas ļauj pievērsties vairākai atmiņai, ko parasti var izmantot ar vienu mašīnu vārdu plakanā modelī.

    Iedomājieties grāmatu, kas piepildīta ar 4 burtu vārdiem. Pieņemsim, ka katrā lapā ir 1024 numuri. Lai adresētu numuru, jums jāzina divas lietas:

    • Lappušu skaits, uz kura tiek izdrukāts šis vārds.
    • Kurš vārds šajā lapā ir tas, ko meklējat.

    Tagad tas ir tieši tas, kā mūsdienu x86 CPU apstrādā atmiņu. Tas ir sadalīts 4 KiB lapās (katrs no tiem ir 1024 vārdi), un šīm lapām ir skaitļi. (faktiski lapas var būt arī 4 MiB lielas vai 2 MiB ar PAE). Ja vēlaties vērsties pie atmiņas šūnas, šajā lapā ir nepieciešams lapas numurs un adrese. Ņemiet vērā, ka katrai atmiņas šūnai ir atsauce tieši uz vienu ciparu pāru, kas nav segmentācijas gadījumā.

    Segmentācija

    Nu, tas ir diezgan līdzīgs peidžam. Tā tika izmantota Intel 8086, tikai, lai nosauktu vienu piemēru. Adreses grupas tagad sauc par atmiņas segmentiem, nevis lapām. Atšķirība ir segmenti, kas var pārklāties, un tie daudz pārklājas. Piemēram, 8086 lielākajā daļā atmiņas šūnu bija pieejamas no 4096 dažādiem segmentiem.

    Piemērs:

    Pieņemsim, ka mums ir 8 baiti atmiņas, visi tur nulles, izņemot 4. baitu, kas ir vienāds ar 255.

    Plakanās atmiņas modeļa ilustrācija:

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

    Lapas atmiņas ilustrācija ar 4 baitu lapām:

     PAGE0 _____ | 0 | | 0 | | 0 | LAPA1 | 255 | _____ ----- | 0 | | 0 | | 0 | | 0 | ----- 

    Segmentētas atmiņas ilustrācija ar 4 baitu segmentiem, kas pārvietoti par 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 | ----- ----- ----- ----- 

    Kā redzat, 4. baitu var risināt četros veidos: (adresējot no 0)

    • Segments 0, nobīde 3
    • Segments 1, nobīde 2
    • Segments 2, nobīde 1
    • Segments 3, nobīde 0

    Tā vienmēr ir tā pati atmiņas šūna.

    Reālajā dzīvē realizācijas segmenti tiek pārvietoti par vairāk nekā 1 baitu (8086 bija 16 baiti).

    Kas ir slikti par segmentāciju, ir tas, ka tas ir sarežģīts (bet es domāju, ka jūs jau zināt, ka;) Kas ir labi, ir tas, ka jūs varat izmantot dažas gudras metodes, lai izveidotu modulārās programmas.

    Piemēram, jūs varat ielādēt kādu moduli segmentā, pēc tam izlikties, ka segments ir mazāks nekā tas patiešām ir (tikai pietiekami mazs, lai turētu moduli), tad izvēlieties pirmo segmentu, kas nepārklājas ar šo pseido-mazāko, un ielādējiet nākamo modulis utt. Būtībā tas, ko jūs iegūstat šādā veidā, ir dažāda lieluma lapas.


    Vai kaut kas jāpievieno paskaidrojumam? Skaņas izslēgšana komentāros. Vai vēlaties lasīt vairāk atbildes no citiem tehnoloģiju gudriem Stack Exchange lietotājiem? Apskatiet pilnu diskusiju pavedienu šeit.