2016-03-25 14 views
0

Kullandığım işletim sisteminin nasıl kullanıldığını görmek için ram'ı tamamen doldurmak için bağlantılı listeler kullanarak bir C programı yazdım. Program ve kaynak yöneticisininÖnceden boş alan büyük olduğunda yalnızca ~ 1400MB ayırdıktan sonra alan tükeniyor.

ekran görüntüsü: http://i.imgur.com/s6OQRBG.png

Ben virtualbox içinde Kali linux koşuyordu ve os sadece 3 konser yakın ancak bellek dolu ... edilmiş 700 imsi MB böylece boş alan kullanıyordum Programımda sadece 1420MB ayırdıktan sonra. Aşağıdaki kodu:

#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 düğümler bir kilobayt (16 * 64 = 1024) ve olmalıdır 1024 KB bir MB olmalı ... öyleyse neden benim ram ayırmaları sadece ~ 1400MB değerinde sonra dolduruluyor?

+0

nerede 'j var ++'? – user3528438

+1

Ve malloc biraz daha fazla ayırma esnekliğini saklı tutar, bu nedenle küçük parçaları çok fazla tahsis ettiğinizde hafızanın tamamen kullanılmasını beklemeyin. i – user3528438

+0

user3528438 sabit @, virtualbox arta kodu kopyalayıp teslim etmesi gerektiğini; // 16 bayt boyutuna göre, sizeof() 'malloc() yükü muhtemelen aynı aralıktadır ve bellek tüketiminizi etkin bir şekilde iki katına çıkarır. - >> çok sayıda küçük ayırmalardan kaçının. – ohmyginger

cevap

0

Belleği parçalanan olan iyi bir şans var.

Bir bellek sayfasının 16 bayttan önemli ölçüde daha büyük olduğunu ve 16 bayta 16 bayt ayırdığınızı göz önünde bulundurarak, 2048 veya 4096 baytlık bellek sayfalarının yalnızca 16 baytlık bellek sayfaları (veya daha fazla, ancak tam sayfa) .

Daha iyi bir bellek karşılaştırması istiyorsanız, sürekli alanda bayt dizileri ayırın (ayrıca belleğe yazarak bunu yaptığınızdan emin olun).

+0

şeyleri doğru anlayın, os sayfalara işlem sayfalarına bellek verir, ancak işleme başka bir tane atanmadan önce sayfayı kullanmamalı mıdır? neden olmasın/yapmıyor? – ohmyginger

+0

Aslında, OS o andaki sayfalara çok sayıda sayfa veriyor, tam olarak bu sayfaların size verildiği algoritmayı bilmiyorum. Süreç, küçük bir nesne (sizinki gibi) tahsis etmeye karar verdiğinde, mevcut sayfalardan birini seçer ve bazı ek yüklerle birlikte bu sayfaya kaydeder.Bir tahsisin belirli bir zamanında, süreç daha fazla sayfaya ihtiyaç duyduğuna karar verebilir ve İşletim Sisteminden belleğini artırmasını isteyebilir ve bu da başarısız olacaktır. Hızlı bir deneme yapın ve işaretçiler arasında aritmetik fark yaratın. Bunların 16 bayt olmadıklarını fark edeceksiniz. – MichaelCMS

+0

ama neden daha önce sormadan önce bu alanın kullanılmadığı, bu yüzden programın neye ihtiyaç duyduğu neredeyse iki katına çıktığı oluyor? – ohmyginger