簡體   English   中英

C和內存使用情況中的malloc()

[英]malloc() in C And Memory Usage

我正在嘗試使用malloc進行實驗,以查看是否可以分配所有可用內存。

我使用了以下簡單程序,並有幾個問題:

int main(void)
{
    char * ptr;
    int x = 100;

    while(1)
    {
        ptr = (char *) malloc(x++ * sizeof(char) / 2);
        printf("%p\n",ptr);
    }

    return 0;
}

1)為什么當使用較大的數據類型(int,unsigned long long int,long double)時,該進程將使用較少的內存,而使用較小的數據類型(int,char)將使用更多的內存?

2)運行該程序時,它將在達到一定數量后停止分配內存(在Windows 7 64位系統上約為592mb,並將8GB RAM交換文件設置為系統托管)。 如果輸出為0,則表示NULL。 為什么在達到此閾值后停止分配內存,而沒有耗盡系統內存並進行交換?

我在以下文章中發現有人嘗試與我做相同的事情,但是區別是他們沒有看到內存使用方面的任何區別,但是我同意。 使用malloc的內存泄漏失敗

我已經在Linux內核2.6.32-5-686上嘗試過該代碼,但結果相似。

任何幫助和解釋將不勝感激。

謝謝,

1)通常,內存是在多個頁面中分配的,因此,如果您要求的大小小於一個頁面,則malloc將分配至少一個頁面。

2)這是有道理的,因為在多任務系統中,您不是唯一的用戶,並且您的進程不是唯一正在運行的進程,還有許多其他進程共享有限的資源集,包括內存。 如果操作系統允許一個進程無限制地分配其所需的所有內存,那么它並不是一個好的操作系統,對嗎?

最后,在Linux中,內核直到您真正開始使用該內存后才分配任何物理內存頁面,因此僅調用malloc並不會實際上消耗任何物理內存,除了跟蹤其自身分配所需的內容外課程。 我不確定Windows。

編輯:下面的示例分配1GB的虛擬內存

#include <stdio.h>
int main(int agrc, char **argv)
{
    void *p = malloc(1024*1024*1024);
    getc(stdin);
}

如果你跑得最好,你會得到

 top -p `pgrep test` PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 20 0 1027m 328 252 S 0 0.0 0:00.00 test 

如果將malloc更改為calloc,然后再次運行top,則得到

 top -p `pgrep test` PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 20 0 1027m 1.0g 328 S 0 1.3 0:00.08 test 

您如何閱讀內存使用情況?

1)使用char分配時,您為每個分配分配的內存要少於例如分配的long (通常是四分之一,但是取決於計算機),這是因為程序本身外部的大多數內存使用工具都不顯示已分配內存,但實際使用了內存,它將僅顯示開銷malloc()本身使用的內存,而不是您已分配的未使用的內存。

更多分配,更多開銷。

如果為每個分配用數據填充malloc'd塊,那么實際使用的內存應該得到非常不同的結果。

2)我假設您正在從同一工具中讀取內容? 嘗試計算實際分配的字節數,它應該顯示正確的數量,而不僅僅是“ malloc開銷”。

1)分配內存時,每次分配都占用請求內存的空間加上堆幀的大小。 在這里查看相關問題

2)在Windows中,任何單個malloc的大小都被限制為_HEAP_MAXREQ。 有關更多信息和一些解決方法,請參見此問題

1)這可能是由於內存已分頁並且每個頁面都具有相同的大小。 如果您的數據無法放入一個頁面並位於兩個頁面之間,我認為它已移至下一頁的開始,從而在前一頁的末尾造成了空間的損失。

2)閾值較小,因為我認為每個程序僅限於一定數量的數據,而不是您擁有的總最大內存。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM