vmware, visual studio, steam dota2這種需要極大內存的程序是如何分配內存的?
01-05
為什麼我自己寫的程序不能分配2G的內存?比如char *p, p = malloc(1024 * 1024 * 1024 * 2), 會編譯不通過,提示overflow.那如題所示的大型程序都是如何分配內存的,我開vmware的時候,打開一個虛擬機會看到系統內存佔用率有很明顯的增加,
虛心請教各位大神。系統: ubuntu 14.10, 64bit, gcc 4.9
p = malloc(1024 * 1024 * 1024 * 2L);
這些程序不是一次性分配這麼多的,有些可能是用mmap分配的,大致來說這個會受到heap size的影響,晚上回來繼續補充。有國外大神做過實驗,參見這裡:http://stackoverflow.com/questions/3463207/how-big-can-a-malloc-be-in-c
申請太大的連續空間,在一些功能簡單的OS上會容易因為碎片問題而失敗啊。操作系統課的老師偷懶了!
解決方案很簡單,鏈表 + 塊式內存啊,數據結構老師也偷懶了!
#include &
#include &
int main(void)
{
int i = 0;
for (; i&<1024; ++i)
{
char* p = (char*)malloc(1024 * 1024 * 1024);
if (p==NULL);
{
printf("%d %s
",i,"malloc error");
break;
}
}
return 0;
}
樓主的溢出在1024*1024*2的地方,改成2L就好了。試試我的代碼,你就明白分配內存跟系統內存有關係,但是又沒關係,好好看操作系統。
題主先要能理解編譯錯誤,鏈接錯誤和運行錯誤的區別。其次對於內存分配極限值的問題,一般首先會受限於進程地址空間的可用性,這與操作系統,體系架構有很大關係。
推薦閱讀:
※想成為 Linux 驅動工程師,需要讀些什麼書?
※求推薦學習linux命令的書籍?
※在 2015 年的今天,Linux 是否比十多年前更適合大眾使用了?
※gentoo 和 archlinux 有什麼優缺點?
※Linux 和 Mac 下有什麼好用的類似於 Visio 的畫圖軟體?