Ile adresów pamięci możemy uzyskać za pomocą procesora 32-bitowego i RAM 1 GB, a ile za pomocą procesora 64-bitowego?
Myślę, że to coś takiego:
1 GB pamięci RAM podzielonej przez 32 bity lub podzielonej przez 4? uzyskać liczbę adresów pamięci?
Ale nie jestem pewien. Właśnie dlatego pytam.
Na Wikipedii zaznaczam, że 1 adres pamięci ma szerokość 32 bity lub 4 oktety (1 oktet = 8 bitów), w porównaniu do 64-bitowego procesora, 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 dobrze to zrozumiałem.
Odpowiedzi:
Krótka odpowiedź: liczba dostępnych adresów jest mniejsza od tych:
Długa 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 GB pamięci RAM to w rzeczywistości 1 GiB (gibibajt, nie gigabajt). Różnica polega na:
Każdy bajt pamięci ma swój 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ęć bajtami, podobnie jak nowoczesne 32-bitowe i 64-bitowe procesory. To jest przyczyną pierwszego limitu - nie możesz mieć więcej adresów niż bajtów pamięci.
Adres pamięci to tylko liczba bajtów, które procesor musi pominąć od początku pamięci, aby dostać się do tego, którego szuka.
Teraz musisz wiedzieć, co właściwie oznacza wersja 32-bitowa. Jak wspomniałem wcześniej, jest to wielkość 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 również są 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ć na nim 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ć osiem wartości : 0, 1, 2 ... 6, 7. To jest w rzeczywistości system binarny i działa w ten sposób:
Działa dokładnie tak jak zwykłe dodawanie, ale maksymalna cyfra to 1, a nie 9. Liczba dziesiętna to 0
0000
, następnie dodajesz 1 i dostajesz0001
, dodajesz jeszcze raz i masz0010
. To, co się tutaj dzieje, jest po przecinku09
i dodaniu jednego: zmieniasz 9 na 0 i zwiększasz kolejną cyfrę.Z powyższego przykładu widać, że zawsze istnieje maksymalna wartość, którą można zachować w liczbie ze stałą liczbą bitów - ponieważ gdy wszystkie bity mają wartość 1, a Ty próbujesz zwiększyć wartość o 1, wszystkie bity staną się równe 0, co spowoduje przerwanie numer. Nazywa się to przepełnieniem liczb całkowitych i powoduje wiele nieprzyjemnych problemów, zarówno dla użytkowników, jak i programistów.
Największa możliwa liczba to zawsze 2 ^ N-1, gdzie N jest liczbą bitów. Jak powiedziałem wcześniej, adres pamięci jest liczbą i ma również wartość maksymalną. Dlatego rozmiar słowa maszynowego jest również ograniczeniem liczby dostępnych adresów pamięci - czasami twój procesor po prostu nie może przetworzyć liczb wystarczająco dużych, aby zająć więcej pamięci.
Na 32 bitach możesz przechowywać liczby 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 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 (eksabajtów, 1 EB = 2 ^ 30 GB). Innymi słowy, 64-bitowy procesor mógłby adresować cały Internet ... 200 razy;) (oszacowany przez WolframAlpha ).
Jednak w rzeczywistych systemach operacyjnych 32-bitowe procesory mogą obsługiwać około 3 GiB pamięci RAM. Wynika to z wewnętrznej architektury systemu operacyjnego - niektóre adresy są zarezerwowane do innych celów. Możesz przeczytać więcej o tak zwanej barierze 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ć: pamięć wirtualna , segmentacja i stronicowanie .
Pamięć wirtualna
Jak zauważył @Daniel R. Hicks w innej odpowiedzi, systemy operacyjne używają pamięci wirtualnej. Oznacza to, że aplikacje faktycznie nie działają na prawdziwych adresach pamięci, ale na tych dostarczonych przez system operacyjny.
Ta technika pozwala systemowi operacyjnemu przenieść niektóre dane z pamięci RAM do tak zwanego pliku stronicowania (Windows) lub zamiany (* NIX). Dysk twardy jest o kilka wielkości wolniejszy niż pamięć RAM, ale nie stanowi poważnego problemu w przypadku rzadko uzyskiwanych danych i umożliwia systemowi operacyjnemu dostarczenie aplikacji więcej pamięci RAM niż faktycznie zainstalowano.
Stronicowanie
To, o czym mówiliśmy do tej pory, nazywa się schematem adresowania płaskiego.
Stronicowanie jest alternatywnym schematem adresowania, który pozwala zaadresować więcej pamięci niż zwykle przy użyciu jednego słowa maszynowego w modelu płaskim.
Wyobraź sobie książkę wypełnioną 4-literowymi słowami. Powiedzmy, że na każdej stronie jest 1024 liczb. Aby zaadresować numer, musisz znać dwie rzeczy:
Właśnie tak nowoczesne procesory x86 obsługują pamięć. Podzielony jest na 4 strony KiB (po 1024 słowa maszynowe), które mają numery. (w rzeczywistości strony mogą być również 4 MiB duże lub 2 MiB z PAE ). Aby zaadresować komórkę 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, co nie będzie miało miejsca w przypadku segmentacji.
Segmentacja
Ten jest bardzo podobny 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 bardzo często się pokrywają. Na przykład w 8086 większość komórek pamięci była dostępna z 4096 różnych segmentów.
Przykład:
Powiedzmy, że mamy 8 bajtów pamięci, wszystkie z zerami, z wyjątkiem 4 bajtu, który jest równy 255.
Ilustracja modelu płaskiej pamięci:
Ilustracja pamięci stronicowanej z 4-bajtowymi stronami:
Ilustracja podzielonej pamięci z 4-bajtowymi segmentami przesuniętymi o 1:
Jak widać, czwarty bajt można adresować na cztery sposoby: (adresowanie od 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łe w segmentacji jest to, że jest skomplikowane (ale myślę, że już to wiesz;) Co dobre, to że możesz użyć sprytnych technik do tworzenia programów modułowych.
Na przykład możesz załadować jakiś moduł do segmentu, a następnie udawać, że segment jest mniejszy niż jest w rzeczywistości (wystarczy na tyle, aby pomieścić moduł), a następnie wybierz pierwszy segment, który nie zachodzi na ten pseudo-mniejszy i załaduj następny moduł , i tak dalej. Zasadniczo otrzymujesz w ten sposób strony o zmiennej wielkości.
źródło
Oprócz powyższego należy pamiętać, że używane jest adresowanie wirtualne wraz z wieloma przestrzeniami adresowymi . Tak więc, nawet jeśli masz tylko 1 GB pamięci RAM, program może koncepcyjnie wykorzystać do 4 GB pamięci wirtualnej (chociaż większość systemów operacyjnych ogranicza ją do mniejszej liczby). I możesz koncepcyjnie mieć (prawie) nieskończoną liczbę takich przestrzeni adresowej 4 GB.
Rozmiar pamięci RAM nie ogranicza (tak bardzo) maksymalnego rozmiaru programu ani liczby programów, które można uruchomić, ale ogranicza wydajność. Kiedy rzeczywista pamięć staje się „nadmiernie zaangażowana”, a system zaczyna „drżeć”, gdy „zamienia” „strony” tam iz powrotem między RAM a dyskiem, wydajność spada.
źródło
1 GB pamięci RAM zajmowałby 1024 * 1024 * 1024 bajtów lub 1 073,741,824 bajtów.
Procesor 32-bitowy zawsze ma 4 * 1024 * 1024 * 1024 bajtów lub 4 294 967 296 bajtów przestrzeni adresowej 1 GB pamięci RAM pojawia się w tej przestrzeni. W procesorach Intel część pamięci RAM musi pojawić się pod adresem 0 dla wektorów przerwań, więc fizyczna pamięć RAM zaczyna się pod adresem 0 i idzie w górę.
Inne rzeczy pojawiają się w tej przestrzeni adresowej, takie jak BIOS i opcjonalne ROM-y (w górnych 384 kilobajtach w ciągu pierwszego 1 MB), urządzenia I / O (takie jak APIC) i RAM wideo. Dziwne rzeczy dzieją się także w trybie zarządzania systemem „SMRAM”, którego jeszcze nie rozumiem.
Zauważ, że jest to fizyczna przestrzeń adresowa z punktu widzenia jądra. MMU może zmienić to wszystko w dowolny sposób na proces przestrzeni użytkownika.
źródło
Procesor 32-bitowy może adresować maksymalnie 2 ^ 32 pojedyncze bajty pamięci (około 4 GB), ale posiadanie 1 GB pamięci sprawiłoby, że 1 * 1024 * 1024 * 1024 bajtów adresowalnych (choć prawdopodobnie nadal miałbyś wirtualną przestrzeń adresową 2 ^ 32 ). 64-bitowy procesor mógłby adresować 2 ^ 64 pojedynczych bajtów, ale myślę, że większość systemów używa tylko 48 bitów na adresy pamięci, co stanowi górną granicę. bajty adresowalne 2 ^ 48.
źródło
Przyjęta odpowiedź stanowi dobre wyjaśnienie. Ale nie sądzę, że to jest odpowiedź. Nie zawiera niczego na temat magistrali adresowej . A jego rozmiar jest tak naprawdę głównym powodem ograniczeń pamięci. Na przykład 8080 jest 8-bitowym procesorem (rozmiar jego szyny danych wynosi 8 bitów), ale ma 16-bitową szynę adresową. Może adresować 2 ^ 16 = (2 ^ 6) * (2 ^ 10) = 64 * 1024 bajtów = 64 KB.
Więcej informacji znajdziesz tutaj (wersja 32-bitowa) w sekcji „Historia techniczna”.
źródło
Wierzę, że w tej rozmowie zagubiono najbardziej podstawowe informacje, więc oto moja odpowiedź:
Powiedzenie „To jest procesor 32-bitowy” oznacza, że rozmiar instrukcji lub rozmiar polecenia, który procesor może zrozumieć i pracować jednocześnie, to 32 bity. Podobnie w przypadku procesorów 64-bitowych: mogą obsługiwać instrukcje maksymalnie 64-bitowe.
Pomyśl o tym jak o starym mechanicznym kalkulatorze: masz tylko tyle cyfr, więc po prostu nie możesz wprowadzić żadnej liczby.
Teraz adres, którego może używać procesor, również musi mieścić się w tej samej przestrzeni, więc w przypadku procesora 32-bitowego adres, którego używa, może również mieć maksymalnie 32 bity. Stąd możemy po prostu obliczyć maksymalną liczbę adresów (tj. Maksymalną ilość pamięci RAM używaną przez procesor):
2 ^ 32 = 4294967296 (= 4 GB)
lub
2 ^ 64 = 18446744073709551616 (= znacznie więcej;)
Lub, jako zabawny przykład, mój stary Commodore 64 miał 16-bitowy procesor, więc był w stanie zarządzać pamięcią:
2 ^ 16 = 65536 bajtów (= 64 KB)
Jest to podstawowa logika, ale, jak wspomniano wcześniej, istnieją sposoby obejścia tego ograniczenia, takie jak wirtualne przestrzenie adresowe, mapowanie pamięci itp.
źródło