關於Memory leaks 判斷與使用ps觀察memory的問題

我們生活周遭存在太多太多的 embedded system ,過去 embedded system 有專屬的 OS,現在 linux 也可以應用在嵌入式環境,不過本版將廣泛討論所有嵌入式系統不只 linux 喔,歡迎有這方面經驗或有興趣的朋友一同進來討論。

版主: chester

關於Memory leaks 判斷與使用ps觀察memory的問題

文章ddy » 週三 9月 19, 2007 12:19 pm

這個問題困擾我很久了
在這邊提出來請各位先進幫忙解惑

一般我們都會使用ps aux 來看程序所佔用的cpu與memory(VSZ)
例:
ddy 1316 0.0 0.0 1348 332 pts/8 S 11:44 0:00 ./mem_test

藍色部份就是我用來觀察佔用多少memory 的依據,我不確定這是否準確,但是大部份人都是這樣觀察

我寫了個小的程式,來實驗,程式如下:
代碼: 選擇全部
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
    int *p;
    int i;
    int size=0;

    printf("Please input memory allocate size:");
    scanf("%d",&size);
    printf("\n");
    printf("[before memory allocate]\n");
    system("\nps aux |grep mem_test |grep -v grep");

    p=(int *)malloc(size);
    if (p!=NULL)
    {
        for (i=0;i<size;i++)
        {
          p[i]=i;
        }
    }
    else
        printf("malloc fail");

    printf("\n\n[After memory allocate]\n");
    system("\nps aux |grep mem_test |grep -v grep");
    printf("\n\n[After Memory free]\n");
    free(p);
    system("\nps aux |grep mem_test |grep -v grep");

    return 0;
}



分別在程式執行時觀察memory與allocate memory 之後觀察,
最後在free() 之後再觀察,結果如下:
代碼: 選擇全部
[ddy@ipdslam test]$ ./mem_test
Please input memory allocate size:1000

[before memory allocate]
ddy      1316  0.0  0.0  1348  332 pts/8    S    11:56   0:00 ./mem_test


[After memory allocate]
ddy      1316  0.0  0.0  1352  360 pts/8    S    11:56   0:00 ./mem_test


[After Memory free]
ddy      1316  0.0  0.0  1352  360 pts/8    R    11:56   0:00 ./mem_test
[ddy@ipdslam test]$



發現,程式一開始執行佔1348, allocate memory之後變成1352
但是free()之後,仍然是1352,這就令人不解了

小弟的問題整理如下:
1) ps VSZ 所顯示的值為何在 memory free 之後仍然不會降下來?該值所代表真正意義為何?

2) 由上可知 ps 裡的 VSZ 似乎不完全正確(在用來憑斷是否有memory leaks方面),然而在linux 下面,有什麼樣的function call 或是資料能正確的反應程式所耗的memory?
ddy
可愛的小學生
可愛的小學生
 
文章: 3
註冊時間: 週三 2月 08, 2006 2:00 pm
來自: 中壢

文章Franklin » 週三 9月 19, 2007 1:47 pm

Linux 裡管理記憶體的方式,就我所知,你在 malloc 後,還要「實際有用到」那一塊記憶體時,系統才會真正去 allocate。如果呼叫 malloc 後什麼都不做就 free,實際上是不會去用任何記憶體的,即使開 128MB,你所看到的記憶體數量也不會因為 malloc() 一呼叫就掉 128MB。這種方法有一個名詞,但我忘了叫什麼了。
頭像
Franklin
懵懂的國中生
懵懂的國中生
 
文章: 171
註冊時間: 週五 6月 16, 2006 1:13 pm

文章訪客 » 週三 9月 19, 2007 3:26 pm

malloc 背後會呼叫 brk/ sbrk system call. 所以 只有在當 累積 數個 malloc() function 才會 調用 brk/ sbrk 以減少 system call 的次數. free() 的時後也是一樣的 情況.
訪客
 


回到 embedded system

誰在線上

正在瀏覽這個版面的使用者:沒有註冊會員 和 1 位訪客