2016-03-25 2 views
0

Ich schrieb ein C-Programm mithilfe von verketteten Listen, um RAM komplett aufzufüllen, um zu sehen, wie das Betriebssystem, das ich verwendete, damit umgehen würde.Nach Platzieren von nur ~ 1400MB, wenn freier Speicherplatz vorher war viel weniger Platz

Screenshot des Programms und der Ressourcen-Manager: http://i.imgur.com/s6OQRBG.png

Ich lief kali Linux in VirtualBox und das os nur wurde mit 700-ish MB so freien Raum wurde in der Nähe 3 Gigs ... aber der Speicher gefüllt nach dem Zuweisen von 1420MB in meinem Programm. Code unten:

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 

typedef struct node 
{ 
    char val; 
    struct node *next; 
} node_t; // 16 bytes according to sizeof() 

node_t *create_node(node_t *current, char newval) 
{ 
    node_t *head = malloc(sizeof(node_t)); 
    head->val = newval; 
    head->next = current; 
    return head; 
} 

int main(void) 
{ 
    node_t *head = NULL; 

    for (int i = 0; i < 1099511627776; i++) //arbitrarily large number 
    { 
    for (int j = 0; j < 65536; j++) //64*1024 
    { 
     head = create_node(head, 'a'); 
    } 
    usleep(11111); 
    printf("%dMB\n", i+1); 
    } 

    return 0; 
} 

64 Knoten sollte ein Kilobyte (16 * 64 = 1024) und 1024 KB soll ein MB sein ... seine so, warum ist mein ram bereits nach den Zuweisungen ~ 1400MB Wert gefüllt werden?

+0

wo ist das 'j ++'? – user3528438

+1

Und malloc reserviert die Flexibilität, um etwas mehr zu reservieren, also erwarte nicht, dass der Speicher voll genutzt wird, wenn du kleine Teile zu oft zuteilen musst. – user3528438

+0

@ user3528438 behoben, musste den Code aus virtualbox bc kopieren ich konnte nicht freigegeben Zwischenablage oder Drag n Drop zur Arbeit – ohmyginger

Antwort

0

Es besteht eine gute Chance, dass Sie den Speicher fragmentieren.

Wenn man bedenkt, dass eine Speicherseite wesentlich größer als 16 Bytes ist und 16 Bytes mit 16 Bytes belegt, könnten Sie Speicherseiten von 2048 oder 4096 Bytes mit nur 16 Bytes (oder mehr, aber niemals die volle Seite) .

Wenn Sie einen besseren Speicherbenchmark wünschen, ordnen Sie Byte-Arrays im fortlaufenden Speicherbereich zu (stellen Sie auch sicher, dass Sie den Speicher durch Schreiben in den Speicher schreiben).

+0

wenn ich Dinge richtig verstehen, gibt das Betriebssystem Seite für Seite Speicher für den Prozess, aber sollte der Prozess die Seite nicht verbrauchen, bevor ihm eine andere zugewiesen wird? warum würde nicht/nicht wahr? – ohmyginger

+0

Eigentlich gibt das Betriebssystem dem Prozess mehrere Seiten zu der Zeit, weiß nicht genau den Algorithmus, nach dem diese Seiten Ihnen gegeben sind. Wenn der Prozess beschließt, ein kleines Objekt (z. B. Ihres) zuzuweisen, wählt er eine der verfügbaren Seiten aus und speichert sie zusammen mit einem gewissen Mehraufwand auf dieser Seite.Zu einer bestimmten Zeit einer Zuweisung kann der Prozess entscheiden, dass er mehr Seiten benötigt, und das Betriebssystem bitten, seinen Speicher zu erhöhen, und dann wird dies fehlschlagen. Machen Sie ein schnelles Experiment und machen Sie einen arithmetischen Unterschied zwischen den Zeigern. Sie werden bemerken, dass sie nicht 16 Bytes auseinander liegen. – MichaelCMS

+0

aber warum verbraucht der Prozess nicht zuerst den Raum, den er gegeben hat, bevor er nach mehr verlangt, so sehr, dass das Programm fast doppelt so viel braucht wie es sollte? – ohmyginger

Verwandte Themen