20Aug
W pewnym momencie fajnie jest spojrzeć na poziom powierzchni komputera, a innym razem fajnie jest zagłębić się w wewnętrzne działania. Dzisiaj przyjrzymy się strukturze pamięci komputera i ilości rzeczy, które można spakować do pamięci RAM.
Dzisiejsze pytanie &Sesja odpowiedzi przychodzi do nas dzięki uprzejmości SuperUser - poddziału Stack Exchange, opartego na społecznościach grupy Q & A.
Pytanie Czytnik
SuperUser Johan Smohan zmaga się z tym, jak typ procesora i rozmiar pamięci współpracują ze sobą, aby uzyskać całkowitą liczbę adresów. Napisał:
Ile adresów pamięci możemy uzyskać za pomocą 32-bitowego procesora i 1GB pamięci RAM oraz ilu z 64-bitowym procesorem?
Myślę, że jest coś takiego:
1GB pamięci RAM podzielone przez 32 bity 4-bitowe( ?), Aby uzyskać liczbę adresów pamięci?
Czytałem na Wikipedii, że 1 adres pamięci ma szerokość 32 bitów lub 4 oktety( 1 oktet = 8 bitów), w porównaniu z procesorem 64-bitowym, w którym 1 adres pamięci lub 1 liczba całkowita ma szerokość 64 bitów lub 8 oktetów. Ale nie wiem, czy zrozumiałem to poprawnie.
Są to rodzaje pytań, które mogą utrzymać ciekawość w nocy. Ile adresów jest dostępnych w ramach hipotetycznych systemów Johana?
Odpowiedź od właściciela
SuperUser Gronostaj oferuje wgląd w sposób dzielenia i wykorzystania pamięci RAM:
Krótka odpowiedź: Liczba dostępnych adresów jest równa mniejszej z nich:
- Wielkość pamięci w bajtach
- Największa liczba całkowita bez znaku, którą można zapisaćw słowie maszynowym CPU
Dłuższa odpowiedź i wyjaśnienie powyższego: Pamięć
składa się z bajtów( B).Każdy bajt składa się z 8 bitów( b).
1 B = 8 b1 GB pamięci RAM to właściwie 1 GiB( gibibyte, nie gigabajt).Różnica jest następująca:
1 GB = 10 ^ 9 B = 1 000 000 000 B 1 GiB = 2 ^ 30 B = 1 073 741 824 BKażdy bajt pamięci ma swój własny adres, bez względu na to, jak duże jest słowo maszyny CPU.Na przykład. Procesor Intel 8086 był 16-bitowy i adresował pamięć po bajtach, podobnie jak nowoczesne 32-bitowe i 64-bitowe procesory. To jest przyczyna pierwszego limitu - nie możesz mieć więcej adresów niż bajtów pamięci.
Adres pamięci to tylko kilka bajtów, które CPU musi pominąć od początku pamięci, aby dostać się do tego, którego szuka.
- Aby uzyskać dostęp do pierwszego bajtu, należy pominąć 0 bajtów, więc adres pierwszego bajtu wynosi 0.
- Aby uzyskać dostęp do drugiego bajtu, musi on pominąć 1 bajt, więc jego adres to 1.
- ( i tak dalej. ..)
- Aby uzyskać dostęp doostatni bajt, CPU pomija 1073741823 bajtów, więc jego adres to 1073741823.
Teraz musisz wiedzieć, co właściwie oznacza 32-bit. Jak już wspomniałem, jest to rozmiar słowa maszynowego.
Słowo maszynowe to ilość pamięci używanej przez procesor do przechowywania liczb( w pamięci RAM, pamięci podręcznej lub rejestrach wewnętrznych).32-bitowy procesor wykorzystuje 32 bity( 4 bajty) do przechowywania liczb. Adresy pamięci są również liczbami, więc na 32-bitowym procesorze adres pamięci składa się z 32 bitów.
Pomyśl o tym: jeśli masz jeden bit, możesz zapisać dwie wartości: 0 lub 1. Dodaj jeszcze jeden bit i masz cztery wartości: 0, 1, 2, 3. Na trzech bitach możesz zapisać osiemwartości: 0, 1, 2. .. 6, 7. W rzeczywistości jest to układ dwójkowy i działa tak:
Binarny dziesiętny 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 1111Działa dokładnie tak jak zwykle, ale maksymalna cyfra to 1, a nie 9. Dziesiętna 0 to 0000, to dodajesz 1 i dostajesz 0001, dodajesz jeszcze raz i masz 0010. Cohappend tutaj jest jak z dziesiętnym 09 i dodaniem jednego: zmieniasz 9 na 0 i zwiększasz kolejną cyfrę.
Z powyższego przykładu widać, że zawsze istnieje maksymalna wartość, jaką można zachować w liczbie o stałej liczbie bitów - ponieważ gdy wszystkie bity wynoszą 1, a spróbujesz zwiększyć wartość o 1, wszystkie bity będą miały wartość 0, a więc złamanienumer. Nazywa się to całkowitym przepełnieniem i powoduje wiele nieprzyjemnych problemów, zarówno dla użytkowników, jak i programistów.
11111111 = 255 + 1 ----------- 100000000 = 0( tutaj 9 bitów, więc 1 jest przycięte)- Dla 1-bitowej największą wartością jest 1,
- 2-bitowe - 3,
- 3-bitowe -7,
- 4 bity - 15
Największą możliwą liczbą jest zawsze 2 ^ N-1, gdzie N to liczba bitów. Jak już wcześniej wspomniałem, adres pamięci jest liczbą i ma również wartość maksymalną.Dlatego wielkość słowa maszynowego jest również limitem liczby dostępnych adresów pamięci - czasami twój procesor po prostu nie może przetwarzać liczb wystarczająco dużych, aby zająć więcej pamięci.
Tak więc w przypadku 32 bitów możesz zachować numery od 0 do 2 ^ 32-1, a to 4 294 967 295. To więcej niż największy adres w 1 GB pamięci RAM, więc w twoim konkretnym przypadku ilość pamięci RAM będzie czynnikiem ograniczającym.
Limit pamięci RAM dla 32-bitowego procesora wynosi teoretycznie 4 GB( 2 ^ 32), a dla 64-bitowego procesora 16 EB( exabajty, 1 EB = 2 ^ 30 GB).Innymi słowy, 64-bitowy procesor może obsłużyć cały Internet. .. 200 razy;)( szacowany przez WolframAlpha).
Jednak w rzeczywistych systemach operacyjnych 32-bitowe procesory mogą adresować około 3 GiB pamięci RAM.Wynika to z wewnętrznej architektury systemu operacyjnego - niektóre adresy są zarezerwowane dla innych celów. Możesz przeczytać więcej na temat tej tak zwanej bariery 3 GB na Wikipedii. Możesz podnieść ten limit za pomocą rozszerzenia adresu fizycznego.
Mówiąc o adresowaniu pamięci, jest kilka rzeczy, o których powinienem wspomnieć: , i D.
Pamięć wirtualna
Jak @Daniel R Hicks wskazał w innej odpowiedzi, systemy operacyjne używają pamięci wirtualnej. Oznacza to, że aplikacje faktycznie nie działają na rzeczywistych adresach pamięci, ale te dostarczane przez system operacyjny.
Ta technika pozwala systemowi operacyjnemu przenieść niektóre dane z pamięci RAM do tzw. Pagefile( Windows) lub Swap( * NIX).Dysk twardy ma niewiele wolniej niż pamięć RAM, ale nie jest to poważny problem w przypadku rzadko uzyskiwanych danych i pozwala systemowi operacyjnemu na dostarczanie aplikacji więcej pamięci RAM, niż faktycznie zainstalowano.
Paging
O czym rozmawialiśmy do tej pory nazywamy schematem płaskiego adresowania.
Paging to alternatywny schemat adresowania, który pozwala na adresowanie większej ilości pamięci, jaką normalnie można uzyskać za pomocą jednego słowa maszynowego w modelu płaskim.
Wyobraź sobie książkę wypełnioną 4-literowymi słowami. Załóżmy, że na każdej stronie znajduje się 1024 numery. Aby zaadresować numer, musisz znać dwie rzeczy:
- Liczba stron, na których drukowane jest to słowo.
- Jakie słowo na tej stronie jest tym, którego szukasz.
Teraz dokładnie to jest, jak nowoczesne procesory x86 obsługują pamięć.Jest on podzielony na 4 strony KiB( 1024 słowa maszynowe każda) i te strony mają numery.(w rzeczywistości strony mogą być również 4 MB lub 2 MB z PAE).Jeśli chcesz adresować komórki pamięci, potrzebujesz numeru strony i adresu na tej stronie. Zauważ, że do każdej komórki pamięci odwołuje się dokładnie jedna para liczb, która nie ma miejsca w przypadku segmentacji.
Segmentacja
Cóż, ta jest dość podobna do stronicowania. Został użyty w Intel 8086, żeby wymienić tylko jeden przykład. Grupy adresów są teraz nazywane segmentami pamięci, a nie stronami. Różnica polega na tym, że segmenty mogą się nakładać i nakładają się bardzo często. Na przykład w 8086 większość komórek pamięci była dostępna z 4096 różnych segmentów.
Przykład:
Załóżmy, że mamy 8 bajtów pamięci, wszystkie utrzymują zera z wyjątkiem czwartego bajtu, który jest równy 255.
Ilustracja do płaskiego modelu pamięci:
_____ |0 ||0 ||0 ||255 ||0 ||0 ||0 ||0 |-----Ilustracja do pamięci stronicowej ze stronami 4-bajtowymi:
PAGE0 _____ |0 ||0 ||0 |PAGE1 |255 |_____ ----- |0 ||0 ||0 ||0 |-----Ilustracja do pamięci segmentowej z 4-bajtowymi segmentami przesuniętymi o 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 |----- ----- ----- -----Jak widać, czwarty bajt można adresować na cztery sposoby:( adresowanie od 0)
- Segment 0, przesunięcie 3
- Segment 1,offset 2
- Segment 2, przesunięcie 1
- Segment 3, przesunięcie 0
To zawsze ta sama komórka pamięci.
W rzeczywistych implementacjach segmenty są przesuwane o więcej niż 1 bajt( dla 8086 było to 16 bajtów).
Co jest złego w segmentacji jest to, że jest skomplikowane( ale myślę, że już to wiesz;) To, co jest dobre, to to, że możesz użyć sprytnych technik do tworzenia programów modułowych.
Na przykład możesz załadować moduł do segmentu, a następnie udawać, że segment jest mniejszy niż jest w rzeczywistości( na tyle mały, aby pomieścić moduł), a następnie wybrać pierwszy segment, który nie nakłada się na ten pseudo-mniejszy i ładujenastępny moduł i tak dalej. Zasadniczo, otrzymujesz w ten sposób strony o zmiennej wielkości.
Czy masz coś do dodania do wyjaśnienia? Dźwięk w komentarzach. Chcesz przeczytać więcej odpowiedzi od innych użytkowników Stack Exchange, którzy znają się na technologii? Sprawdź cały wątek dyskusji tutaj.