Permalänk
Medlem

Minneshantering

Vi har en förberedande uppgift för en labb där vi ska skriva en funktion som skapar en variabel som tar upp mycket minne, och sedan frigöra detta minne.
Har kommit fram till detta, men det drar inget minne utan bara mycket CPU och slutar med ett Segmentation fault. Vill inte att någon ska göra uppgiften åt mig, men undrar om jag kan få lite hjälp på traven av någon?

"Lämplig storlek på dataelement är 50,100,150,200..2000 MB

Dataelementet kan vara av vilken typ som helst, var bara noggrann med att hantera hela elementet, annars kan operativsystemet luras och inte spänna upp hela datauppsättningen."

int big(long int storlek) { unsigned int *c, n, l; n = 1024L*1024L*storlek; c = (unsigned int *) malloc(n); for (l = 0; l < n-1; l++) { // printf(": %d ",l); c++; } free(c); return n; }

Visa signatur

Light travels faster than sound. Is that why some people appear to be smart before they speak?
It's a big rock. I can't wait to tell my friends. They don't have a rock this big.

Permalänk

c = malloc(num_bytes) returnerar num_bytes * sizeof(char)

Du kastar c till en "unsigned int" pekare som pekar på fyra sizeof(char) åt gången.

Permalänk
Medlem

Vad ska din for-loop tjäna till? Du inkrementerar pekaren i varje loop, och när du ger variabeln till free() har den ett helt annat värde än du fick från malloc(). Om du vill använda minnet kanske du ska ersätta c++ med c[l] = 42 eller något liknande. Annars är väl memset() ganska väl lämpad för att sätta uniforma värden på stora block minne.

Permalänk
Medlem

Problemet jag står inför är att jag aldrig har haft problem med att skapa program som drar mycket minne, förutom nu när jag ska skapa program som drar mycket minne.

Har tittat lite på man memset, och det ser ut att vara intressant. Tackar.
Edit:
Memset var precis det jag behövde men inte kände till.
Vill bara kolla med er om det används rätt såhär, eller behöver jag inte malloc och free?

long int *c, n = 1024L*1024L*storlek; c = (long int *) malloc(n); memset(c, 1, n); free(c);

Edit: Glöm det, det blir segmentation fault om jag tar bort det, så det behövs nog.

Visa signatur

Light travels faster than sound. Is that why some people appear to be smart before they speak?
It's a big rock. I can't wait to tell my friends. They don't have a rock this big.

Permalänk
Medlem

Jodå, malloc() allokerar minnet åt dig, memset() bara sätter minnet till värdet du ger den, byte för byte. Om du inte allokerar c kommer den peka på en helt random plats i minnet, och memset() kommer glatt börja försöka skriva till den, varpå systemet terminerar din process för att du inte håller dig inom ditt eget minnessegment.

Permalänk
Medlem

malloc och free behöver du, men memset känns helt onödig om du bara ska allokera minne!

Visa signatur

5D MkII

Permalänk
Medlem

Och om man nu inte gillar det odefinierade innehållet så kan man allokera med calloc() och få minnet nollställt.

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av vectrex
malloc och free behöver du, men memset känns helt onödig om du bara ska allokera minne!

Jag ska inte bara allokera minne, jag ska allokera och använda stora minnessegment.

Visa signatur

Light travels faster than sound. Is that why some people appear to be smart before they speak?
It's a big rock. I can't wait to tell my friends. They don't have a rock this big.

Permalänk
Medlem

Ja, men du behöver ju nödvändigtvis inte ge det allokerade minnet några värden.

Permalänk
Medlem

Skriv någon rekursiv funktion som du låter gå... då kommer du dra minne, tro mig =D

Visa signatur

weeeee

Permalänk
Medlem

Jo, annars spänner inte operativsystemet upp hella minnessegmentet.

Visa signatur

Light travels faster than sound. Is that why some people appear to be smart before they speak?
It's a big rock. I can't wait to tell my friends. They don't have a rock this big.

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av kerberos
Jo, annars spänner inte operativsystemet upp hella minnessegmentet.

Varför inte?

Permalänk
Medlem

Jag vet inte varför, jag märkte bara att minnesanvändningen låg kvar på 0 meg.

Visa signatur

Light travels faster than sound. Is that why some people appear to be smart before they speak?
It's a big rock. I can't wait to tell my friends. They don't have a rock this big.

Permalänk
Medlem

Moderna OS gör så som en optimering. Varför allokera minnet innan det används?

Permalänk

Det känns som om att du har missuppfattat laborationsuppgiften, antingen är det tänkt att ni skall försöka skapa ett eget segmenteringssystem för att kunna allokera över 4GB eller att ni skall lära er om hur moderna OS allokerar minne. Jag gissar på det senare i och med att du försöker "toucha" minnet, vilket tvingar OS:et att inte bara reservera utan "comit":a minnent.

Kolla in getpagesize() och skapa en lopp som "rör" pekaren så många bytes från föregående position. Kallas för en "page-in" operation.

Permalänk
Medlem

BobbyFromDallas:

Nästa labb handlar om att skriva ett demand paging system.

Denna labb handlade om att se vad som händer när internminnet tar slut och operativsystemet börjar swappa.

Visa signatur

Light travels faster than sound. Is that why some people appear to be smart before they speak?
It's a big rock. I can't wait to tell my friends. They don't have a rock this big.

Permalänk
Citat:

Ursprungligen inskrivet av RAMPKORV
Varför inte?

Det kallas virtuellt minne, vilket de flesta moderna operativsystem använder (anledningen till att jag använder "de flesta" istället för "alla" är att det finns operativsystem som används till vissa speciella uppgifter där VM är en nackdel eller helt enkelt inte behövs).

En bra artikel om VM: http://www.64bits.se/guider/virtuelltminne/index.php

Visa signatur

"to conquer others is to have power, to conquer yourself is to know the way"