Kādreiz ir jautri skatīties uz datora pieredzes virsmas līmeni, un citās dienās ir jautri ienirt iekšējā darbā. Šodien mēs aplūkojam datora atmiņas struktūru un tikai to, cik daudz jūs varat iesaiņot RAM atmiņā.
Šodienas jautājumu un atbilžu sesija mums priecājas par SuperUser - Stack Exchange dalību, kas ir kopienas vadīta Q & A tīmekļa vietņu grupa.
SuperUser lasītājs Johan Smohan cīnās ar to, kā procesora tips un atmiņas lielums darbojas kopā, lai iegūtu kopējo adrešu skaitu. Viņš raksta:
Cik atmiņas adreses mēs varam iegūt ar 32 bitu procesoru un 1 GB RAM un cik ar 64 bitu procesoru?
Es domāju, ka tas ir kaut kas līdzīgs šim:
1 GB RAM, ko sadala 32 bitu 4 biti (?), Lai iegūtu atmiņas adreses skaitu?
Es lasīju Wikipēdijā, ka 1 atmiņas adrese ir 32 biti plata vai 4 okteti (1 oktets = 8 biti), salīdzinot ar 64 bitu procesoru, kur 1 atmiņas adreses vai 1 veselais skaitlis ir 64 biti plata vai 8 okteti. Bet nezinu, vai arī es pareizi sapratu.
Tie ir tādi jautājumi, kas nakts laikā var saglabāt ziņkārīgu geek. Cik daudz adreses ir pieejamas katrā Johana hipotētiskajās sistēmās?
SuperUser ieguldītājs Gronostaj piedāvā padziļinātu izpratni par RAM sadali un izmantošanu:
Īsā atbilde: Pieejamo adrešu skaits ir vienāds ar mazāko no šiem:
- Atmiņas izmērs baitos
- Lielākais neparakstīts vesels skaitlis, ko var saglabāt CPU mašīnas vārdu
Garā atbilde un paskaidrojums par iepriekš minēto:
Atmiņa sastāv no baidiem (B). Katrs baits sastāv no 8 bitiem (b).
1 B = 8 b
1 GB RAM ir faktiski 1 GiB (gibibīts, nevis 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
Katram atmiņas bairam ir sava adrese neatkarīgi no tā, cik liels ir CPU mašīna vārds. Piemēram Intel 8086 centrālais procesors bija 16 bitu un tas atrisināja atmiņu baitos, tāpat arī modernus 32 bitu un 64 bitu procesorus. Tas ir pirmā ierobežojuma cēlonis - jums nevar būt vairāk adreses nekā atmiņas baiti.
Atmiņas adrese ir tikai baits, kuru CPU ir jāizlaiž no atmiņas sākuma, lai nokļūtu meklētajā.
- Lai piekļūtu pirmajam baitam, tam ir jāizlaiž 0 baiti, tāpēc pirmā baita adrese ir 0.
- Lai piekļūtu otrajam baitam, tam ir jāizlaiž 1 baits, tāpēc tā adrese ir 1.
- (un tā tālāk… )
- Lai piekļūtu pēdējam baitam, CPU izlaiž 1073741823 baiti, tāpēc tā adrese ir 1073741823.
Tagad jums jāzina, ko īsti nozīmē 32-bit. Kā jau minēju iepriekš, tas ir mašīnas vārda lielums.
Mašīna vārds ir atmiņas apjoms, ko CPU izmanto, lai saglabātu ciparus (RAM, kešatmiņā vai iekšējos reģistros). 32 bitu CPU izmanto 32 bitus (4 baiti), lai saglabātu ciparus. Atmiņas adreses ir arī cipari, tāpēc 32 bitu CPU atmiņas adrese sastāv no 32 bitiem.
Tagad padomājiet par to: ja jums ir tikai viens bits, tajā var 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 bitiem jūs varat saglabāt astoņas vērtības : 0, 1, 2 ... 6, 7. Tas faktiski ir binārā sistēma, un tā darbojas tāpat:
Binārā decimāldaļa 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ā parasti, bet maksimālais skaitlis ir 1, nevis 9. Decimālais 0 ir
0000
, tad jūs pievienojat 1 un iegūstat0001
, pievienojiet to vēlreiz, un jums ir0010
. Šeit redzamais ir tāds pats kā ar decimāldaļu09
un pievienojot vienu: jūs maināt 9 līdz 0 un palielināt nākamo ciparu.No iepriekš redzētā piemēra var redzēt, ka vienmēr ir maksimālā vērtība, kuru var saglabāt skaitlī ar pastāvīgu bitu skaitu - jo, ja visi biti ir 1 un jūs mēģināt palielināt vērtību par 1, visi biti kļūs 0, tādējādi pārkāpjot numurs. To sauc par veselo skaitļu pārplūdi un rada daudzas nepatīkamas problēmas gan lietotājiem, gan izstrādātājiem.
11111111 = 255 + 1 ----------- 100000000 = 0 (šeit ir 9 biti, tādēļ 1 ir apgriezts)
- Par 1 bitu vislielākā vērtība ir 1,
- 2 biti - 3,
- 3 biti - 7,
- 4 biti - 15
Vislielākais iespējamais skaitlis vienmēr ir 2 ^ N-1, kur N ir bitu skaits. Kā jau iepriekš teicu, atmiņas adrese ir numurs, un tam ir arī maksimālā vērtība. Tāpēc mašīnu vārda izmērs ir arī pieejamo atmiņas adreses skaita ierobežojums - dažreiz jūsu CPU vienkārši nevar apstrādāt pietiekami daudz, lai pievērstu vairāk atmiņas.
Tātad 32 bitiem jūs varat saglabāt skaitļus no 0 līdz 2 ^ 32-1, un tas ir 4 294 967 295. Tas ir vairāk nekā lielākā adrese 1 GB RAM, tāpēc jūsu konkrētajā gadījumā RAM būs ierobežojošs faktors.
RAM robeža 32 bitu CPU teorētiski ir 4 GB (2 ^ 32), un 64 bitu CPU tas ir 16 EB (exabytes, 1 EB = 2 ^ 30 GB). Citiem vārdiem sakot, 64 bitu CPU varētu adresēt visu internetu ... 200 reizes;) (aprēķināts ar WolframAlpha).
Tomēr reāllaika operētājsistēmās 32 bitu CPU var apstrādāt apmēram 3 GiB RAM. Tas ir saistīts ar operētājsistēmas iekšējo arhitektūru - dažas adreses ir rezervētas citiem mērķiem. Wikipēdijā varat lasīt vairāk par šo tā saukto 3 GB barjeru. Jūs varat paaugstināt šo ierobežojumu, izmantojot fizisko adresātu pagarinājumu.
Runājot par atmiņas risināšanu, ir jānorāda dažas lietas:virtuālā atmiņa, segmentācijaunpeidžeri.
Virtuālā atmiņa
Kā citā atbildē norādīja @ Daniel R Hicks, operētājsistēmas izmanto virtuālo atmiņu. Tas nozīmē, ka lietojumprogrammas faktiski nedarbojas uz reālām atmiņas adresēm, bet no tām, ko nodrošina operētājsistēma.
Šī metode ļauj operētājsistēmai pārvietot dažus datus no RAM uz tā saukto Pagefile (Windows) vai Swap (* NIX).Cietais disks ir nedaudz lielāks par lēnāku nekā RAM, taču tas nav nopietna problēma reti piekļūt datiem, un tas ļauj operētājsistēmai iesniegt vairāk RAM nekā to, kas faktiski ir instalēts.
Peidžeri
Par to, ko mēs līdz šim runājām, sauc par vienotas adresēšanas shēmu.
Peidžerēšana ir alternatīva adreses shēma, kas ļauj pievērst vairāk atmiņas, ko jūs parasti varētu ar vienu mašīnu vārdu plakanā modeli.
Iedomājieties grāmatu, kas ir piepildīta ar 4 burtu vārdiem. Pieņemsim, ka katrai lapai ir 1024 numuri. Lai risinātu numuru, jums jāzina divas lietas:
- Lapas numurs, uz kura tiek izdrukāts šis vārds.
- Kuru vārdu šajā lapā ir tā, ko meklējat.
Tagad tas ir tieši tā, kā mūsdienu x86 procesori apstrādā atmiņu. Tas ir sadalīts 4 KiB lapās (katrs 1024 mašīnrakstīšanas), un tajās lapās ir numuri. (patiesībā 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. Ievērojiet, ka katrai atmiņas šūnai ir atsauce tieši ar vienu ciparu pāri, tas nebūs segmentācijas gadījumā.
Segmentēšana
Nu, tas viens ir diezgan līdzīgs peidžeru. Tas tika izmantots Intel 8086, tikai, lai nosauktu vienu piemēru. Adresu grupas tagad sauc par atmiņas segmentiem, nevis lapām. Atšķirība ir tas, ka segmenti var pārklāties, un tie pārklājas daudz. Piemēram, 8086 lielākā daļa atmiņas šūnas bija pieejamas 4096 dažādos segmentos.
Piemērs:
Pieņemsim, ka mums ir 8 baiti atmiņas, visas nulles ir, izņemot 4. baitu, kas ir vienāds ar 255.
Attēls atmiņas modelim:
_____ | 0 | | 0 | | 0 | | 255 | | 0 | | 0 | | 0 | | 0 | -----
Ilustrācija ielādētajai atmiņai ar 4 baitu lapām:
PAGE0 _____ | 0 | | 0 | | 0 | PAGE1 | 255 |. | _____ ----- | 0 | | 0 | | 0 | | 0 | -----
Ilustrācija segmentētajā atmiņā ar 4 baitu segmentiem novirzīti 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)
- 0. segments, ieskaits 3
- 1. Segments, ieskaita 2
- 2. segments, nobīde 1
- 3. segments, ieskaita 0
Tā vienmēr ir viena un tā pati atmiņas šūna.
Reālā dzīves realizācijas segmentos tiek pārvietoti vairāk nekā 1 baits (8086 bija 16 baiti).
Kas slikti attiecībā uz segmentāciju, ir tas, ka tas ir sarežģīti (bet es domāju, ka jau to zināt;) Labi, ka varat izmantot dažas gudras metodes, lai izveidotu modulārās programmas.
Piemēram, jūs varat ielādēt kādu moduli segmentā, tad izlikties, ka segmentam ir mazāks, nekā patiešām ir (pietiek tikai pietiekami mazs, lai turētu moduli), tad izvēlieties pirmo segmentu, kas nepārklājas ar šo pseudo-mazāko un ielieciet nākamo modulis un tā tālāk. Būtībā, ko jūs iegūstat šādā veidā, ir lappuses ar mainīgu izmēru.
Vai kaut ko pievienot paskaidrojumam? Skatieties komentāros. Vēlaties lasīt citas atbildes no citiem tehnoloģiju savvy Stack Exchange lietotājiem? Šeit skatiet pilnu diskusiju pavedienu.