Ile pamięci może mieć dostęp do procesu 32-bitowego w 64-bitowym systemie operacyjnym?

86

W systemie Windows w normalnych warunkach proces 32-bitowy może uzyskać dostęp tylko do 2 GB pamięci RAM (lub 3 GB za pomocą specjalnego przełącznika w pliku boot.ini). Ile pamięci jest dostępne podczas uruchamiania procesu 32-bitowego w 64-bitowym systemie operacyjnym? Czy są jakieś specjalne przełączniki lub ustawienia, które mogą to zmienić?

jjxtra
źródło

Odpowiedzi:

92

Domyślnie 2 GB. Jeśli aplikacja obsługuje dużą przestrzeń adresową (połączoną z / LARGEADDRESSAWARE), otrzymuje 4 GB (nie 3 GB, patrz http://msdn.microsoft.com/en-us/library/aa366778.aspx )

Nadal są ograniczone do 2 GB, ponieważ wiele aplikacji zależy od tego, czy górny bit wskaźników wynosi zero.

Michał
źródło
5
Czy ktoś może wyjaśnić, dlaczego procesy nie mogą uzyskać dostępu do pełnego 4 GB?
BlueTrin,
1
Co masz na myśli? Jeśli zbudujesz go samodzielnie, możesz użyć flagi / LARGEADDRESSAWARE i sprawić, że będzie działał z 4 GB, jeśli tego nie zrobiłeś, jesteś na łasce programistów, którzy to zrobili.
SilverbackNet
Czy to dlatego, że wskaźnik może być niebezpiecznie zinterpretowany z dopełnieniem do dwóch?
rosstex
1
Mówiąc to - since many application depends on the top bit of pointers to be zeromasz na myśli, że 32-ty bit schematu adresowania nie jest brany pod uwagę ani nie jest używany podczas przechodzenia przez przestrzeń adresową procesu.
RBT
21

4 GB minus to, co jest używane przez system po połączeniu z / LARGEADDRESSAWARE.

Oczywiście, jeśli ustawisz tę flagę, powinieneś być jeszcze bardziej ostrożny z arytmetyką wskaźników.

MSN
źródło
-1: System będzie używał adresów 64-bitowych dla siebie, więc nie ma potrzeby odejmowania czegoś
Thomas Weller,
@ThomasW., To nieprawda, przynajmniej w systemie Windows. WOW64 nadal wymaga 32-bitowych połączeń dla 64-bitowych wywołań systemowych. Zobacz msdn.microsoft.com/en-us/library/windows/desktop/…
MSN
1
Masz na myśli te 605 kB bibliotek DLL? Przepraszam, nie rozumiem, ponieważ pytanie dotyczyło więcej GB pamięci.
Thomas Weller,
7
@ThomasW., Dlatego powiedziałem „minus to, co jest używane przez system”.
MSN
FYI Link nie żyje
jjxtra
14

Wydaje się, że nikt nie dotyka faktu, że jeśli masz wiele różnych 32-bitowych aplikacji, podsystem wow64 może mapować je w dowolnym miejscu w pamięci powyżej 4G, więc na 64-bitowych oknach z wystarczającą pamięcią możesz uruchomić znacznie więcej aplikacji 32-bitowych niż w natywnym systemie 32-bitowym.

Harm ten Napel
źródło
7
Mówisz o fizycznej pamięci RAM, gdzie OP mówi o pamięci wirtualnej. Nawet w systemach 32-bitowych można uruchamiać wiele aplikacji, o ile plik stronicowania jest wystarczająco duży.
Thomas Weller,
8

Proces 32-bitowy jest nadal ograniczony do tych samych ograniczeń w 64-bitowym systemie operacyjnym. Problem polega na tym, że wskaźniki pamięci mają tylko 32 bity szerokości, więc program nie może przypisać / rozwiązać żadnego adresu pamięci większego niż 32 bity.

Ben S.
źródło
4
Byłoby to przydatne, gdybyś wyjaśnił, że 32 bity to 4 GB miejsca.
Inżynier
4

Pojedynczy proces 32-bitowy w 64-bitowym systemie operacyjnym jest ograniczony do 2 GB. Ale jeśli jest skompilowany do pliku EXE z IMAGE_FILE_LARGE_ADDRESS_AWAREustawionym bitem, ma limit 4 GB, a nie 2 GB - patrz https://msdn.microsoft.com/en-us/library/aa366778(VS.85).aspx

Rzeczy, które słyszysz o specjalnych flagach rozruchowych, 3 GB, /3GBprzełącznikach lub /uservawszystkie dotyczą 32-bitowych systemów operacyjnych i nie mają zastosowania w 64-bitowym systemie Windows.

Więcej informacji można znaleźć pod adresem https://msdn.microsoft.com/en-us/library/aa366778(v=vs.85).aspx .

Jeśli chodzi o 32-bitowe systemy operacyjne, wbrew przekonaniu nie ma fizycznego limitu 4 GB dla 32-bitowych systemów operacyjnych. Na przykład 32-bitowe serwerowe systemy operacyjne, takie jak 32-bitowy Microsoft Windows Server 2008, mogą uzyskać dostęp do 64 GB(Edycje Windows Server 2008 Enterprise i Datacenter) - za pomocą Physical Address Extension (PAE), które po raz pierwszy wprowadził Intel w Pentium Pro, a później AMD w procesorze Athlon - definiuje trzypoziomową hierarchię tabel stron, z wpisami tabeli po 64 bity każdy zamiast 32, umożliwiając tym procesorom bezpośredni dostęp do fizycznej przestrzeni adresowej większej niż 4 gigabajty - więc teoretycznie 32-bitowy system operacyjny może teoretycznie uzyskać dostęp do 2 ^ 64 bajtów lub 17179869184 gigabajtów, ale segment jest ograniczone do 4 GB. Jednak ze względów marketingowych Microsoft ograniczył maksymalną dostępną pamięć w systemach operacyjnych innych niż serwerowe do zaledwie 4 GB lub nawet 3 GB efektywnie. W ten sposób pojedynczy proces może uzyskać dostęp do ponad 4 GB w 32-bitowym systemie operacyjnym - czego przykładem jest serwer Microsoft SQL.

Procesy 32-bitowe w 64-bitowym systemie Windows nie mają żadnej wady w porównaniu z procesami 64-bitowymi pod względem korzystania z wirtualnej przestrzeni adresowej współdzielonego jądra (zwanej również przestrzenią systemową ). Wszystkie procesy, czy to 64-bitowe, czy 32-bitowe, w 64-bitowym systemie Windows współużytkują tę samą 64-bitową przestrzeń systemową.

Biorąc pod uwagę fakt, że przestrzeń systemowa jest współdzielona przez wszystkie procesy , w 32-bitowym systemie Windows procesy, które tworzą dużą liczbę uchwytów (takie jak wątki, semafory, pliki itp.), Zajmują przestrzeń systemową przez obiekty jądra i mogą zabraknąć nawet pamięci jeśli masz w sumie dużo dostępnej pamięci. Z kolei w 64-bitowym systemie Windows przestrzeń jądra jest 64-bitowa i nie jest ograniczona do 4 GB. Wszystkie wywołania systemowe wykonywane przez aplikacje 32-bitowe są konwertowane na natywne wywołania 64-bitowe w trybie użytkownika .

Maxim Masiutin
źródło
1
To pytanie dotyczy tego, do jakiej ilości pamięci może uzyskać dostęp pojedynczy proces . Jest to ograniczone przez 32-bitową przestrzeń adresową pamięci wirtualnej. Jasne, możesz mieć wiele 32-bitowych procesów, z których każdy używa 4 GB na tym samym komputerze, nawet w 32-bitowym systemie operacyjnym używającym PAE. Ale nie o to chodzi w tym pytaniu.
Peter Cordes,
@PeterCordes - przepraszam i dziękuję - zaktualizowałem odpowiedź o limicie 2GB / 4GB.
Maxim Masiutin
@PeterCordes, dziękuję za twoją uwagę, zaktualizowałem odpowiedź, aby podkreślić, że wiele procesów 32-bitowych może wykorzystywać 4 GB na tym samym komputerze, nawet z 32-bitowym systemem operacyjnym korzystającym z PAE i że procesy 32-bitowe pod 64- bit OS nie cierpi z powodu ograniczenia przestrzeni systemowej do 2 GB, co było problemem w 32-bitowym systemie operacyjnym.
Maxim Masiutin
-1

Masz to samo podstawowe ograniczenie podczas uruchamiania procesu 32-bitowego pod Win64. Twoja aplikacja działa w podsystemie 32, ale najlepiej wygląda jak Win32, a to obejmie ograniczenia pamięci dla twojego procesu (dolne 2 GB dla ciebie, górne 2 GB dla systemu operacyjnego)

Sean
źródło
-11

Limit nie wynosi 2g lub 3 GB, a 4 GB dla wersji 32-bitowej.

Powodem, dla którego ludzie myślą, że jego 3 GB jest to, że system operacyjny pokazuje 3 GB wolnego miejsca, podczas gdy naprawdę mają 4 GB pamięci RAM.

Jego całkowita pamięć RAM 4 GB. Więc jeśli masz kartę graficzną 1 GB, która liczy się jako część całkowitej pamięci RAM wyświetlanej przez 32-bitowy system operacyjny.

4Gig nie 3 nie 2 masz to?

BobJ
źródło
2
To jest niepoprawne. W przypadku standardowego systemu x86 (bez rozszerzeń pamięci) jądro może uzyskać dostęp do pełnych 4 GB miejsca w pamięci (nawet jeśli komputer ma tylko 1 GB pamięci RAM z powodu stronicowania). Jądro rezerwuje górne 2GiB (niektóre jądra rezerwują zamiast tego 1GiB lub 3GiB) na własny użytek. Pamięć wirtualna każdego procesu ma również odwzorowaną pamięć zarezerwowaną jądra, a zatem proces nie może wykorzystywać 2 GB pamięci.
Alex Jorgenson
3
Ponadto karty graficzne nie mają nic wspólnego z ilością pamięci, z której może korzystać proces. Tabele ACPI, operacje we / wy mapowane w pamięci itp. Wykorzystują fizyczne adresy pamięci, ale można tego uniknąć dzięki pamięci wirtualnej.
Alex Jorgenson
1
To jest niepoprawne. Firma Microsoft wybrała (wybór projektu), aby podzielić wirtualną 32-bitową przestrzeń adresową z systemem Windows NT, tak aby 2 GB zostało zarezerwowane na mapowanie systemu operacyjnego (sterownik / API / wywołania systemowe itp.), A pozostałe 2 GB na użytek aplikacji. Przełącznik rozruchu / 3 GB zmienia to zachowanie (1 GB na mapowanie systemu operacyjnego, 3 GB na kod aplikacji). Zostawiam znalezienie starej dokumentacji architektury pamięci wirtualnej Windows NT 3.x jako ćwiczenie dla czytelnika :-)
ripvlan