Hvad er den maksimale hukommelse tilgængelig for en C ++-applikation på 32-bit Windows?

Indlæg af Hanne Mølgaard Plasc

Problem



Bare spekulerer på, om der er en begrænsning på den maksimale hukommelse, som en C ++-applikation bruger


Jeg forstår at dette er 2GB - Er det korrekt?


Hvis en C ++ app forsøger at anmode om mere end 2 GB hukommelse, forårsager dette et hukommelseskrasj?


Endelig spørgsmål - Hvis maskinen C ++ app kører på, er der allerede lav hukommelse, og en C ++-app beder om 100 MB array (dvs. sammenhængende hukommelse) vil operativsystemet rumme dette ved hjælp af virtuel hukommelse?

Bedste reference


Det vil forårsage en dynamisk hukommelsesallokeringsfejl, hvilket normalt vil medføre det resulterende programnedbrud, men teknisk set kan en applikation skrives for at modstå denne begivenhed. 2GB er faktisk brugeradressens rumstørrelse til en individuel proces - et program kan bruge flere processer (nemmeste eksempel: Chrome). Hvis en applikation anmoder om 100MB sammenhængende hukommelse, skal den hukommelse skal være næsten sammenhængende, selvom den ikke er fysisk tilstødende, og hvis der ikke er tilstødende sammenhængende sider tilgængelige, er det en fejlagtig tildeling.


Virtuel hukommelse bruges altid - al hukommelse er virtuel.


2GB er grænsen under de fleste omstændigheder. Hvad sker der normalt, at 2GB er til brugeren og 2GB for kernen, men du kan bede Windows om at gøre dette 3GB til brugeren og 1GB for kernen (med en vis risiko) og på 64bit , er hele 4 GB 32 bit adresse plads tilgængelig for brugeren. Det øgede adresserum er kun tilgængeligt, hvis du kompilerer din ansøgning som /LARGEADDRESSAWARE.

Andre referencer 1


Begrænsningen afhænger af operativsystemet. Standard Linux er 2 Gb, Solaris er 3 Gb, Windows er (jeg fortæller) 2 eller 3 afhængigt af, hvordan PAE bruges.


Du får dog ikke alt det 2G til dine data. Din kode vil tage noget af det, og dit program s stack vil tage noget, og C-biblioteket vil tage nogle, ligesom alle andre delte biblioteker, du refererer til . Typisk vil organisationen organisere koden, bunke og stakke sådan, at der er forsætlige huller mellem dem.


Hvad angår dit sidste spørgsmål: det er al virtuel hukommelse. Hvad du rent faktisk spørger er 'hvis programmerne i min maskine bruger hele den fysiske hukommelse, vil OS'et bytte.' Og svaret er ja, men ikke helt du tænker.


En CPU kan kun få adgang til fysisk RAM. Det ved intet om data gemt på disken. Så for at give fysisk hukommelse til en kørende proces, vil OS'et tage den hukommelse fra en anden proces . For at tage hukommelsen, vil den skrive det til bytte. Når den anden proces har brug for adgang til hukommelsen, vil operativsystemet læse det igen, muligvis skrive en anden proces 'hukommelse at bytte.

Andre referencer 2


Selv om de andre svar er korrekte i det sædvanlige tilfælde, er der støtte i Windows XP 32 bit til at bruge mere end 3 GB hukommelse ved at bruge Adress Windowing Extensions. [2]


AWE bruges almindeligvis af databaseservere til at give dem adgang til ekstremt store sæt hukommelse. Det kræver at bruge Win API til faktisk at styre hukommelsen, så det er naturligvis bare at bruge kun når det virkelig er nødvendigt.

Andre referencer 3


En 32-bit OS kan typisk kun adressere 4 GB fysisk RAM . I praksis har denne grænse tendens til at være noget lavere, men kan lindres ved brug af virtuel RAM. På visse versioner af Windows kan den øges ved brug af Physical Address Extension. [3]


Endnu vigtigere for dit spørgsmål er der på 32-bit Windows også en 2GB grænse på adresserummet , der er tilgængeligt for et brugerprogram. Dette lægger en hård begrænsning på mængden af ​​hukommelse, som en enkelt applikation kan bruge, uanset hvor meget fysisk eller virtuel RAM der er til rådighed. Standard 2GB-grænse kan øges til 3GB.


Følgende side forklarer grænserne detaljeret: http://msdn.microsoft.com/en-us/library/aa366778(v=vs.85).aspx[4]

Andre referencer 4


Al den hukommelse, du har adgang til, er virtuel - du kan ikke få adgang til fysisk hukommelse direkte fra et program. OS'et vil bruge sidefilen efter behov - den effekt, som du vil se ved at have mange applikationer, udmattende fysisk hukommelse, er øget bytte og bemærkelsesværdig afmatning.


På Win 32 bit har applikationen 2 GB Virtual Address Space til rådighed. Dette bruges til at kortlægge eksekverbare og DLL'er, for eksempel hukommelseskortede filer til stak og bunke. Dette rum er typisk lidt fragmenteret. Hvis din ansøgning er opbygget som 'Stor adressebeskyttet', og operativsystemet er 64-bit eller konfigureret til at opdele bruger/kernel-modehukommelse som 3/1GB, er adresserummet næsten 4 GB til 64 bit og 3 GB til 32- bit.


Hukommelsen, du kan allokere , ligger typisk i området 17-1800 MB. Hvis du tildeler små portioner, kommer du til dette, hvis du forsøger at allokere store sammenhængende blokke, kan du ramme grænsen meget tidligere, da din adresseplads er fragmenteret.


Se f.eks. Virtual Address Space på MSDN eller Virtual Address Space på Wikipedia [5] [6]

Andre referencer 5


2GB er grænsen gælder kun for 1 proces. Du kan sprede din ansøgning over N-processer (32-bit) for at allokere N x 2 GB. Operativsystemet skal stadig være 64-bit. Og du skal håndtere kommunikationen mellem processerne.