內存管理問題

內存管理問題

  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   ?????

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








發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章