2014-11-23 90 views
0

我想在運行我的程序的同時獲取linux top命令中的內存字段的一般概念。它是一個簡單的c程序,在分配內存和釋放內存之後,在動態分配內存之前,使用其進程ID在批處理模式下打印我的程序的最高結果。這裏是頂部命令我使用在外殼:我使用下面的函數創建一個二維數組動態如何理解一個進程的Linux最高命令結果?

int** Create2DArray(unsigned int size, int** addr_of_ptr_to_ints_array){ 

    int** int_ptrs_array = (int**)malloc(size * sizeof(int*)); 
    *addr_of_ptr_to_ints_array = (int*)malloc(size * size * sizeof(int)); 
    for (int i = 0; i < size; i++) { 
     int_ptrs_array[i] = *addr_of_ptr_to_ints_array + (i * size); 
    } 

    return int_ptrs_array; 
} 

作爲

int* int_array1; 
int** int_ptr_array1 = Create2DArray(n, &int_array1); 

,其中n = 64,因此陣列

top -p my_pid -b -n 1 

大小爲(4096 * size(int)= 16kb)+ 64 * size(int *)= 16.25kb並使用以下代碼釋放內存。

free(int_array1);free(int_ptr_array1); 

輸出我從上面命令之前獲取,分配後和釋放內存後以下內容:

EDIT: 
Pagesize: 4096 

--- Before Array Allocation. 
top - 17:45:01 up 17:39, 3 users, load average: 0.36, 0.26, 0.34 
Tasks: 1 total, 0 running, 1 sleeping, 0 stopped, 0 zombie 
%Cpu(s): 15.4 us, 2.5 sy, 0.0 ni, 81.7 id, 0.3 wa, 0.0 hi, 0.0 si, 0.0 st 
KiB Mem: 2065072 total, 1675324 used, 389748 free, 48344 buffers 
KiB Swap: 1046524 total, 25168 used, 1021356 free, 485028 cached 

    PID VIRT RES SHR %CPU %MEM SWAP CODE DATA COMMAND 
14606 10756 616 524 0.0 0.0 0 8 8508 mx 

--- Array Allocated. 
top - 17:45:03 up 17:39, 3 users, load average: 0.36, 0.26, 0.34 
Tasks: 1 total, 0 running, 1 sleeping, 0 stopped, 0 zombie 
%Cpu(s): 15.4 us, 2.5 sy, 0.0 ni, 81.7 id, 0.3 wa, 0.0 hi, 0.0 si, 0.0 st 
KiB Mem: 2065072 total, 1675364 used, 389708 free, 48344 buffers 
KiB Swap: 1046524 total, 25168 used, 1021356 free, 485028 cached 

    PID VIRT RES SHR %CPU %MEM SWAP CODE DATA COMMAND 
14606 11780 616 524 0.0 0.0 0 8 9532 mx 

--- Array Updated. 
top - 17:45:06 up 17:39, 3 users, load average: 0.49, 0.29, 0.35 
Tasks: 1 total, 0 running, 1 sleeping, 0 stopped, 0 zombie 
%Cpu(s): 15.4 us, 2.5 sy, 0.0 ni, 81.7 id, 0.3 wa, 0.0 hi, 0.0 si, 0.0 st 
KiB Mem: 2065072 total, 1675348 used, 389724 free, 48344 buffers 
KiB Swap: 1046524 total, 25168 used, 1021356 free, 485028 cached 

    PID VIRT RES SHR %CPU %MEM SWAP CODE DATA COMMAND 
14606 11784 616 524 0.0 0.0 0 8 9536 mx 

問題:

Q1。爲什麼RES在數組分配之前和之後都是常量? Q2302。爲什麼在陣列被釋放後VIRT增加了?

Q3。雖然匿名內存應該代表由malloc命令根據此article創建的內存,但是(RES-SHR)*(頁面大小)=(616-524)* 4096 = 376.832Kb,我期待匿名內存在16.5kb之後。

任何幫助表示讚賞。 謝謝

回答

1

你不說,如果你已經觸摸任何分配的內存或沒有。 Linux(默認情況下)有一個不太常見的內存分配策略:當您撥打malloc時,調用總是成功。 「但是如果沒有記憶呢?」你問。那麼malloc沒有給你一頁物理內存,只是你的虛擬地址空間中的頁面(基本上是無限的)。當你嘗試訪問這些頁面時,你會得到一個頁面錯誤,此時內核會爲你找到一個物理頁面。

所以這給我們留下了以下內容:

Q1)RES是不變的,因爲你沒有過通過分配

Q2)VIRT(分配到任務的虛擬內存)已經增加,因爲使用任何更多的內存你分配了虛擬內存。即使你釋放它,它仍然會保留,但由於它沒有物理內存支持,所以它並不重要。

我認爲我沒有足夠的信息來回答Q3。

+0

感謝您的回覆。我編輯了我的答案,在將所有數組元素更新爲常量值後包含「頂部」結果。儘管如此,我仍然沒有在內存領域看到任何改變。我想知道的是當我們分配,更新和釋放動態內存時,哪些字段會受到影響? – shaffooo 2014-11-23 22:51:55

相關問題