內存管理問題

內存管理問題數組

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

    : 對於這個問題,因爲靜態數組是全局變量,全局變量是在數據區。數據區的大小沒法肯定,鑑於網上答案不少,我寫程序嘗試了一下,最終檢驗的結果是 2G。spa

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

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

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


    系統將4G系統空間分爲兩部分,將高字節 0-1G字節(從虛擬地址0xC0000000到0xFFFFFFFF),供內核使用,稱爲「內核空間」。而將較低的3G字節(從虛擬地址 0x00000000 -0xBFFFFFFF),供各個進程使用,稱爲「用戶空間)。由於每一個進程能夠經過系統調用進入內核,所以,Linux內核由系統內的全部進程共享。因而,從具體進程的角度來看,每一個進程能夠擁有4G字節的虛擬空間。
     Linux使用兩級保護機制:0級供內核使用,3級供用戶程序使用。從圖中能夠看出(這裏沒法表示圖),每一個進程有各自的私有用戶空間(0~3G),這個空間對系統中的其餘進程是不可見的。最高的1GB字節虛擬內核空間則爲全部進程以及內核所共享。
    內核空間中存放的是內核代碼和數據,而進程的用戶空間中存放的是用戶程序的代碼和數據。無論是內核空間仍是用戶空間,它們都處於虛擬空間中。
    雖然內核空間佔據了每一個虛擬空間中的最高1GB字節,但映射到物理內存卻老是從最低地址(0x00000000)開始。對內核空間來講,其地址映射是很簡單的線性映射,0xC0000000就是物理地址與線性地址之間的位移量,在Linux代碼中就叫作PAGE_OFFSET。
    內核空間和用戶空間之間如何進行通信?
    內核空間和用戶空間通常經過系統調用進行通訊。
    編譯器

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

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

     :對於這個問題網上有一答案,可是我運行告終果不同。給你們附代碼:io

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

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

相關文章
相關標籤/搜索