1. 程式人生 > >內存管理問題

內存管理問題

靜態數組 動態分配 內存 linux

內存管理問題

  1. 在你的系統中,你所能分配的靜態數組的最大長度是多少? 使用動態分配內存,你所能分配的最大內存是多少?

    : 對於這個問題,由於靜態數組是全局變量,全局變量是在數據區。數據區的大小無法確定,鑒於網上答案很多,我寫程序嘗試了一下,最終檢驗的結果是 2G。

    用戶所能分配的靜態數據的最大長度是2G。

    動態分配的最大內存也是2G。

    註意: 部分網友說,用戶動態分配的最大內存空間應該是用戶所能使用的最大用戶空間也就是3G,但事實上無法到3G,通過代碼檢驗是2G。


    系統將4G系統空間分為兩部分,將高字節 0-1G字節(從虛擬地址0xC0000000到0xFFFFFFFF),供內核使用,稱為“內核空間”。而將較低的3G字節(從虛擬地址 0x00000000 -0xBFFFFFFF),供各個進程使用,稱為“用戶空間)。因為每個進程可以通過系統調用進入內核,因此,Linux內核由系統內的所有進程共享。於是,從具體進程的角度來看,每個進程可以擁有4G字節的虛擬空間。

    Linux使用兩級保護機制:0級供內核使用,3級供用戶程序使用。從圖中可以看出(這裏無法表示圖),每個進程有各自的私有用戶空間(0~3G),這個空間對系統中的其他進程是不可見的。最高的1GB字節虛擬內核空間則為所有進程以及內核所共享。
    內核空間中存放的是內核代碼和數據,而進程的用戶空間中存放的是用戶程序的代碼和數據。不管是內核空間還是用戶空間,它們都處於虛擬空間中。
    雖然內核空間占據了每個虛擬空間中的最高1GB字節,但映射到物理內存卻總是從最低地址(0x00000000)開始。對內核空間來說,其地址映射是很簡單的線性映射,0xC0000000就是物理地址與線性地址之間的位移量,在Linux代碼中就叫做PAGE_OFFSET。
    內核空間和用戶空間之間如何進行通訊?
    內核空間和用戶空間一般通過系統調用進行通信。

動態分配內存是在堆上進行,這個視編譯器決定。

2.當你一次請求分配500字節的內存時,你實際獲得的動態分配的內存數量總共是多少?當你一次性請求分配5000字節的時候,又如何? 他們存在什麽區別嗎?

:對於這個問題網上有一答案,但是我運行了結果不一樣。給大家附代碼:

#include<stdio.h>

#include<stdlib.h>

#include<maloc.h>

int main ()

{

char *p ;

p = (char *)mallo (500 * sizeof (char));

printf ("%u\n", malloc_usable_size(p));

free (p);


p = (char *) malloc (5000 * sizeof (char));

printf ("%u\n", malloc_usable_size(p));

free(p);

return 0;

}

註意: 網上給出的運行答案是 504 5000 , but but but 我運行的結果是 500 5000 ?????

請問為什麽呢??? 這是為什麽呢?? 難道是人品問題嗎??? 對於這個問題我沒有答案。








內存管理問題