linux進程空間
Ⅰ linux每個進程的HEAP SIZE限制是多少
網上看到的分析:
32位意味著4G的定址空間,Linux把它分為兩部分:最高的1G(虛擬地址從0xC0000000到0xffffffff)用做內核本身,成為「系統空間」,而較低的3G位元組(從0x00000000到0xbffffff)用作各進程的「用戶空間」。這樣,理論上每個進程可以使用的用戶空間都是3G。當然,實際的空間大小收到物理存儲器大小的限制。雖然各個進程擁有其自己的3G用戶空間,系統空間卻由所有的進程共享。從具體進程的角度看,則每個進程都擁有4G的虛擬空間,較低的3G為自己的用戶空間,最高的1G為所有進程以及內核共享的系統空間。
可是經自己測試:
堆區最多開2G - 1大小空間
棧區能開1G多,當接近2G就會報錯
[html] view plain print?
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <string.h>
const long long MAXN = 1073741824;//2^30即1G
using namespace std;
char s[MAXN * 2 - 1];//開2G內存,多1個都會編譯錯誤(提示:整數溢出之類的錯誤)
int main()
{
char t[MAXN + 1000];//之內開1G多的空間,2G會編譯不通過
memset(t, 0, sizeof(t));
memset(s, 0, sizeof(s));
return 0;
}
Ⅱ Linux進程內存管理
對於包含MMU的處理器而言,Linux系統提供了復雜的存儲管理系統,使得進程所能訪問的內存達到4GB。在Linux系統中,進程的4GB內存空間被分為兩個部分——用戶空間與內核空間。用戶空間的地址一般分布為0~3GB(即PAGE_OFFSET,在Ox86中它等於OxC0000000),這樣,剩下的3~4GB為內核空間,用戶進程通常只能訪問用戶空間的虛擬地址,不能訪問內核空間的虛擬地址。用戶進程只有通過系統調用(代表用戶進程在內核態執行)等方式才可以訪問到內核空間。
每個進程的用戶空間都是完全獨立、互不相乾的,用戶進程各自有不同的頁表。而內核空間是由內核負責映射,它並不會跟著進程改變,是固定的。內核空間的虛擬地址到物理地址映射是被所有進程共享的,內核的虛擬空間獨立於其他程序。
Linux中1GB的內核地址空間又被劃分為物理內存映射區、虛擬內存分配區、高端頁面映射區、專用頁面映射區和系統保留映射區這幾個區域。
對於x86系統而言,一般情況下,物理內存映射區最大長度為896MB,系統的物理內存被順序映射在內核空間的這個區域中。當系統物理內存大於896MB時,超過物理內存映射區的那部分內存稱為高端內存(而未超過物理內存映射區的內存通常被稱為常規內存),內核在存取高端內存時必須將它們映射到高端頁面映射區。Linux保留內核空間最頂部FIXADDR_TOP~4GB的區域作為保留區。
當系統物理內存超過4GB時,必須使用CPU的擴展分頁(PAE)模式所提供的64位頁目錄項才能存取到4GB以上的物理內存,這需要CPU的支持。加入了PAE功能的Intel Pentium Pro及以後的CPU允許內存最大可配置到64GB,它們具備36位物理地址空間定址能力。
由此可見,對於32位的x86而言,在3~4GB之間的內核空間中,從低地址到高地址依次為:物理內存映射區→隔離帶→vmalloc虛擬內存分配器區→隔離帶→高端內存映射區→專用頁面映射區→保留區。
Ⅲ linux 下怎麼查看一個進程佔用內存大小
這里介紹下查看一個進程佔用內存大小的方法。
1、首先單擊桌面左上角的應用程序,選擇系統工具選項,如下圖所示。