簡體   English   中英

為什么malloc不填滿內存?

[英]Why isn't malloc filling up memory?

我有以下代碼:

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

int main() {
    int data = 0;
    char *byte = (char *)malloc(sizeof(char)*1000000000);
byte[999999999] = 'a';
printf("%c",byte[999999999]);
    scanf("%d",&data);
    return 0;
}

在程序啟動之前和scanf之前查看內存,我希望內存增加1 GB。 為什么不發生這種情況?

編輯:我添加了

byte[999999999] = 'a';
printf("%c",byte[999999999]);

程序輸出a

默認情況下,Linux會在第一次訪問時延遲分配物理內存。 您對malloc調用將分配很大的虛擬內存塊,但尚未映射任何物理內存頁面。 首次訪問未映射的頁面將導致錯誤,內核將通過分配和映射一個或多個物理內存頁面來處理該錯誤。

要分配所有物理內存,您必須在每一頁上至少訪問一個字節。 或者您可以繞過malloc並直接使用類似以下內容的操作系統

mmap(0, 1000000000, PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_POPULATE, -1, 0);

請注意使用MAP_POPULATE來立即填充頁表,即立即分配物理內存。 根據手冊頁,這僅適用於相當新的Linux版本。

大多數(全部?)Linux系統過量使用內存。 這意味着即使您使用特定的提交策略,即使您保留了可笑的內存量,malloc也不會失敗。 如果您預留過多的內存(例如,超過虛擬內存),則在某些情況下可能會失敗。

您不會獲得真正的內存地址,只能獲得一個指針,該指針被承諾指向足夠的內存供您使用。 如果您嘗試使用內存,系統會為您分配內存,因此您必須對其進行寫操作以向系統發送信號,告知您確實需要它。

使用該系統是因為許多程序不需要它們保留的內存或在其他時間需要它。

編輯后,您只能訪問一頁,因此只能保留一頁。 您需要訪問每個頁面以獲取所有內存。

當您詢問時, malloc並沒有給您全部取回1000000000 它只有1st頁,直到您開始訪問它(讀/寫)為止,您將獲得分配的其余部分。

在Linux中, malloc請求將立即擴展虛擬地址空間,但在您訪問它之前不會分配物理內存頁。

暫無
暫無

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

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