c - malloc returnerer hukommelse eller virtuelt adresserum

Indlæg af Hanne Mølgaard Plasc

Problem



Denne forstyrrer mig.


Tillægger malloc en blok af hukommelse på bunken, eller skal det hedde Virtual Address Space?


Skal jeg være kræsen og kalde det Virtual Address Space eller dette bare DOS arv? Hvad med Linux?


REDIGERE:


mange svar med gode detaljer, ingen af ​​dem svarer mit spørgsmål.

Bedste reference


malloc tildeler hukommelse på bunken, periode.


Din C-bibliotek holder typisk en liste (eller en mere indviklet datastruktur) af tilgængelige hukommelsesstykker og finder en passende klump for at tilfredsstille en malloc (muligvis opdele en større klump i et antal mindre) og vender tilbage free 'h hukommelse til listen (muligvis fusionere et par mindre klumper til en større)


Kun , når listen ikke indeholder en stor nok chunk til at tilfredsstille din malloc, vil biblioteket bede OS til mere hukommelse, f.eks. ved hjælp af sbrk syscall. Den adresse, der returneres af denne syscall kan være en virtuel adresse eller en rigtig, afhængigt af din hardware, men som programmør kan du ikke (og ikke behøver) vide dette. [24]


At sige at malloc allokerer virtuelt adresserum i stedet for en blok på bunken er som at sige at read læses fra din harddisk i stedet for fra en fil: det er irrelevant fra opkalderens perspektiv og ikke altid sandt.

Andre referencer 1


Der er mindst 3 måder at måle hukommelsesforbrug på:



  • Virtuelt adresserum - mængden af ​​din process adresserum, der forbruges af tildelingen. Dette påvirker også fragmentering og de maksimale sammenhængende fremtidige tildelinger, du kan foretage.

  • commit charge - dette er operativsystemets bogføring af den maksimale mulige fysiske opbevaring, der kræves for at opretholde al den skrivbare, ikke-fil/enhedskopierede hukommelse, der er allokeret til din proces. Hvis operativsystemet tillader det at overstige det samlede antal fysisk hukommelse + bytte, meget dårlige ting kunne ske, første gang overskydende er skrevet til.

  • fysisk hukommelse - mængden af ​​fysiske ressourcer (muligvis inklusive bytte, afhængigt af din fortolkning) din proces er i øjeblikket besat. Dette kan være mindre end forpligteladelse på grund af ugyldige nulsider og ugyldige, private skrivbare kort over filer eller mere end forpligningsafgift på grund af ikke-skrivbare eller delte mappings, som processen bruger (men disse er normalt swappable/throwable).



malloc rammer generelt dem alle.


 Så den bedste måde jeg kan tænke på at svare på dit spørgsmål er at sige:


malloc allokerer virtuel hukommelse .


Og virtuel hukommelse forbruger:



  • virtuelt adresserum,

  • commit charge, og

  • fysiske ressourcer, hvis det er skrevet til.


Andre referencer 2



  Tillægger malloc en blok af hukommelse på bunken eller skal det kaldes virtuelt adresserum?



kort svar: malloc tildeler hukommelse på bunken.


det er ikke nøjagtigt nok at sige, at malloc tildeler hukommelse i det virtuelle adresses [[sic]] -rum, da din opkaldsstak selv er en del af det samme rum.

Andre referencer 3


malloc er et bibliotek opkald. På linux kalder det igen sbrk systemopkald. sbrk vil øge størrelsen af ​​bunke, men tildeler faktisk ikke fysisk hukommelse. Når processen forsøger at få adgang til denne adresse, hæves en page fault, og derefter kilden tildeler den faktiske fysiske side og kort til den virtuelle adresse.


TL; DR: malloc returnerer en virtuel adresse og tildeler IKKE fysisk hukommelse.


Tjek dette ud. [25]

Andre referencer 4



  • malloc() tildeler en blok af hukommelse på HEAP.

  • Skal det kaldes virtuelt adresseområde ? Hold den tanke et sekund. VAS ( virtuelt adresserum ) er en hukommelseskortmekanisme, der omfatter hele hukommelsesrummet i en applikation. Med andre ord er VAS ikke begrænset til HEAP'ens hukommelsesområde. HEAP er faktisk bare en anden del af det.



Hver gang en ny applikation køres, opretter operativsystemet en ny proces og tildeler en ny VAS til applikationen. Hukommelse tildelt via malloc() er reserveret på HEAP, som er et specielt hukommelsesområde inden for VAS, som du ved, og hukommelsen tildelt via standard betyder ender i stakken, hvilket er en anden hukommelsesområde placeret inde i VAS af ansøgningen.

Andre referencer 5


Alle processer kører inden for sit eget virtuelle adresserum. Hver adgang til hukommelse formidles af hukommelsesstyringsenheden. Hvis hukommelsen er kortlagt, er dataene enten indlæst eller gemt fra den tilsvarende fysiske adresse. Hvis ingen hukommelse er kortlagt til den angivne adresse, vil (Memory Management Unit (MMU) udløse en undtagelse.


Malloc styrer en flok (eller måske endda bare en brøkdel) af kortlagte hukommelsessider. Disse sider er kendt som bunken. Når man anmoder om en række bytes fra malloc, vil malloc enten finde den hukommelse inden for de sider, den allerede administrerer, eller den vil bede operativsystemet (ved hjælp af enten BRK eller MMAP på Linux). Dette er helt transparent for brugeren af ​​malloc.


Så de to begreber er helt ortogonale. Processerer adgang virtuel hukommelse, som MMU'en kan oversætte til en fysisk adresse, og bunken er den hukommelsesblok, der forvaltes af malloc.

Andre referencer 6


Du kunne selv have besvaret dette spørgsmål, hvis du havde generet RTFM :-)


Især at skrive man malloc på en Linux-maskine og søge (one-to-a-time) for 'heap' og 'virtual' vil lade dig se entydigt, at malloc() er defineret som heap hukommelse, snarere end virtuel -hukommelse.


Wikipedia artiklen for malloc() er i overensstemmelse med Linux man siden. Det hedder (vægt er min): [26]



  I C er bibliotekets funktion malloc
  bruges til at tildele en blok af hukommelse på
  bunken
. [[...]] Nogle platforme giver
  bibliotek opkald, der tillader run-time
  dynamisk allokering fra C-stacken
  snarere end bunken (for eksempel Unix
  alloca(), Microsoft Windows CRTL 's
  malloca()). Denne hukommelse er
  automatisk frigjort, når opkaldet
  funktionen slutter. Behovet for dette er
  mindsket af ændringer i C99
  standard, som tilføjede støtte til
  variabel længde arrays af blok omfang
  have størrelser bestemt ved kørselstidspunktet.



Hvis du er forvirret om terminologiens betydning, kan Wikipedia-artiklerne om bunkehukommelse og virtuel hukommelse hjælpe dig. [27] [28]

Andre referencer 7


malloc tildeler en blok på bunken. For hver hukommelsesside, hvor den tildelte blok spænder, er der måske eller måske ikke fysisk hukommelse forpligtet til det fra starten. Hele blokken kan imidlertid bruges, da OS'et tager sig af håndtering af sidefejl og styring af fysisk/virtuel hukommelse, som er nødvendig for at understøtte tildelingen.

Andre referencer 8


Svaret afhænger af det underliggende operativsystem, libc implementering og hardware arkitektur. Med de fleste moderne OS'er (som Linux eller Windows), der kører på x86-arkitekturen, får du en pointer inden for det lineære adresserum, men generelt er det implementeringsafhængigt. Jeg tvivler på, at når man for eksempel programmerer en lille enhed (som en microcontroller) i C, ville malloc () returnere en pointer til virtuel hukommelse, fordi der ikke er nogen virtuel hukommelse som sådan.

Andre referencer 9


Malloc tildeler på bunken, som er en del af det virtuelle adresserum.


Du er ikke kræsen ved at kalde det virtuelt adresserum, du er bare for generel. Det kan sammenlignes med at sige: 'Du brækker i badeværelset.' Strengt taget er det sandt, men 'Du knuser i gryden' er mere præcis, fordi den tidligere erklæring indebærer, at du også kan slå i vasken eller karret.


Konceptuelt, malloc, bunken og den virtuelle hukommelse understøttes af de fleste operativsystemer, herunder Dos og Linux. [29] [30] [31]

Andre referencer 10


For at besvare dette spørgsmål skal vi vide, hvilken type operativsystem og arkitektur vi har at gøre med. Som pmg nævner Standard og artikler refererer til 'storage' eller 'space'. Disse er de mest generelle vilkår og de eneste gyldige, medmindre vi laver en masse antagelser.


For eksempel:



  malloc tildeler en blok virtuelt
  Adresse plads på bunken



Dette er ikke korrekt for mange indlejrede systemer. Mange af dem bruger ikke virtuel hukommelse, fordi der ikke er behov for det (ikke multitasking osv.) Eller af ydeevne årsager. Desuden er det muligt, at nogle eksotiske enheder ikke har ideen om bunke - tvivl om, at malloc ville blive brugt, men det er nok en af ​​grundene til, at Standarden refererer til 'storage' - det er implementationsspecifik.


På den anden side er eksemplet korrekt for Windows og Linux i vores pc'er. Lad os analysere det for at besvare spørgsmålet.


Først skal vi definere, hvad der er Virtual Address Space.


Virtual Address Space (VAS) er en memory mapping mekanisme, der hjælper med at styre flere processer.



  • isolere processer - hver af dem har
    hans eget adresserum

  • Tillad at allokere hukommelsen den 32-bit
    arkitekturen er begrænset til.

  • giver en kortfattet model af hukommelse



Tilbage til spørgsmålet 'Allokerer malloc en hukommelsesblok på bunken, eller skal den kaldes Virtual Address Space?'



Begge erklæringer er korrekte . Jeg vil hellere sige VAP i stedet for hukommelse - det er mere eksplicit. Der er en fælles myte, der malloc=RAM-hukommelse. Tilbage i gamle dage var DOS-hukommelseallokering meget enkel. Når vi beder om hukommelse, var det altid RAM, men i moderne Oses kan det variere.

Andre referencer 11


malloc() tildeler specifikt fra bunken.


Hvorvidt bunthukommelsen er i et virtuelt adresserum eller ej, afhænger helt af operativsystemet og hardwarearkitekturen. På et system med en MMU og et operativsystem der bruger det, findes alt -hukommelse (bunke, kodeplads, stakke, statisk hukommelse og hukommelseskortet I/O osv.) I et virtuelt rum, lige hvis den fysiske til virtuelle kortlægning er en-til-en.


For at have et virtuelt adresserum kræver en MMU at kortlægge fysiske til virtuelle adresser, har ikke alle mål en MMU, så hukommelse og virtuel hukommelse er ikke synonyme eller udskiftelige begreber på nogen måde; de er helt uafhængige begreber.


Med hensyn til 'Virtual Address Space' er en 'DOS arv', kunne du ikke længere være fra sandheden. 16 bit x86-arkitektur understøtter slet ikke en MMU eller virtuel hukommelse. Jeg spekulerer på, hvordan du har den idé?

Andre referencer 12


Malloc returnerer altid virtuelle adresser. Årsagen er, at når du kalder malloc, er det faktisk en wrapper-funktion, der kalder et systemopkald (systemopkald er et fancy ord til kerneindstillinger), og dette systemopkald tildeler en virtuel hukommelse inde i din bunke segment. Men når du vil få adgang til den tildelte værdi (opbevarings- eller indlæsningsinstruktion), vil MMU hæve sidefejl, hvilket i grunden betyder, at der ikke er fysisk hukommelse til denne virtuelle side, og kun på det tidspunkt vil OS allokere fysisk hukommelse til dette virtuelle side .

Andre referencer 13


Kernel- og brugerrum arbejder med virtuelle adresser (også kaldet lineære adresser), der kortlægges til fysiske adresser af hukommelsesstyrings hardware.
Denne kortlægning er defineret af sidetabeller, der oprettes af operativsystemet.


Gå gennem dette link på Memory Allocation. [32]