天天看點

記憶體管理問題

記憶體管理問題

在你的系統中,你所能配置設定的靜态數組的最大長度是多少? 使用動态配置設定記憶體,你所能配置設定的最大記憶體是多少?

: 對于這個問題,由于靜态數組是全局變量,全局變量是在資料區。資料區的大小無法确定,鑒于網上答案很多,我寫程式嘗試了一下,最終檢驗的結果是 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));

    free(p);

    return 0;

}

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

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

本文轉自 傑思 51CTO部落格,原文連結:http://blog.51cto.com/12700807/1939530

繼續閱讀