簡體   English   中英

我可以運行該程序多少次

[英]How many times could I run this program

我有一台具有128M內存的機器,這是程序。

while(1)
{    
    ptr = malloc(1024 * 1024 * 100);
    if (NULL == ptr)
    {
        printf("malloc 100M Failed\n");
       return 1;
    }
    n+=100;
    printf("malloc %dM\n", n);
}

我從輸出中發現malloc運行20次,為什么?

因為您的程序正在分配虛擬內存 在32位進程中(在Windows上,其他操作系統略有不同),您通常會獲得2GB的虛擬地址空間來分配內存。 它們在操作系統上將內存映射為“交換文件”和物理內存(在您的情況下,由於您只有128MB的物理內存,因此分配的大部分內存將僅在交換文件中)。

因此100MB * 20 =“大約” 2GB,這解釋了為什么您可以運行20個循環。

由於您實際上不對內存做任何事情,因此您可以使用虛擬內存來使內核過度使用(即為您提供的內存超過實際提供的內存)。

100M的20倍幾乎接近2GB,因此您似乎使用的是32位操作系統,為操作系統保留了2GB的空間,為用戶空間進程保留了2GB的地址空間。 因此,無論您的計算機實際有多少內存,2GB絕對是您可以在此過程中解決的絕對最大內存量。

很難說-這取決於底層操作系統如何為您提供內存。

它不一定是物理內存,它可以駐留在交換空間中,也可以根本不分配任何內容,而是在使用內存時而不是在您要求分配內存時選擇進行分配。

在未啟用PAE的32位平台上,您的虛擬地址空間應為2 ^ 32字節。 好像您的平台允許您在放下腳之前分配大約一半。

這里的基本概念是malloc虛擬內存分配可用內存塊。

因此,不要指望只有128M的可用內存,而是更多,這取決於操作系統從何處分配內存。

暫無
暫無

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

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