作者 主題: 請問如何得知記憶體使用狀況  (閱讀 8395 次)

0 會員 與 1 訪客 正在閱讀本文。

stlee

  • 鑽研的研究生
  • *****
  • 文章數: 817
    • 檢視個人資料
請問如何得知記憶體使用狀況
« 於: 2008-03-29 14:58 »
請問在Linux下是否有像Turbo C的coreleft()函數可得知可用記憶體空間的函數

非常感謝^^!
« 上次編輯: 2008-04-25 20:23 由 stlee »
程式是人寫的,別讓工具的限制成為您想像力的極限
~程式中最重要的部份應該是註解而不是程式碼,這是因為解讀註解一定比解讀程式碼簡單
~程式寫好後約一個月就會忘的差不多了,所以花點時間把註解寫好至少能讓自己(或別人)看的懂當初在寫什麼

darkranger

  • 榮譽學長
  • 俺是博士!
  • *****
  • 文章數: 1370
    • 檢視個人資料
    • http://darkranger.no-ip.org
回覆: 請問如何得知記憶體使用狀況
« 回覆 #1 於: 2008-03-30 04:19 »
似乎沒有這樣的函數
也許直接用系統的 free 指令去取值會是最有效率(最懶人)的寫法?

stlee

  • 鑽研的研究生
  • *****
  • 文章數: 817
    • 檢視個人資料
回覆: 請問如何得知記憶體使用狀況
« 回覆 #2 於: 2008-03-30 15:31 »
似乎沒有這樣的函數
也許直接用系統的 free 指令去取值會是最有效率(最懶人)的寫法?

嗯....似乎只能這樣了

非常感謝^^!
程式是人寫的,別讓工具的限制成為您想像力的極限
~程式中最重要的部份應該是註解而不是程式碼,這是因為解讀註解一定比解讀程式碼簡單
~程式寫好後約一個月就會忘的差不多了,所以花點時間把註解寫好至少能讓自己(或別人)看的懂當初在寫什麼

stlee

  • 鑽研的研究生
  • *****
  • 文章數: 817
    • 檢視個人資料
回覆: 請問如何得知記憶體使用狀況
« 回覆 #3 於: 2008-03-30 16:31 »
剛剛試用了一下發現有個問題

total欄位所顯示的當然不會變動了

可是在used,free,buffers,cached欄位卻會隨時變動

記得之前有在書上看到因為Linux是多工作業系統,所以可能在背景中會有一些行程去動態的存取記憶體

現在問題來了.....當我的行程也是動態存取記憶體時,將如何得知我的行程使用狀態???

如果是正常的使用並歸還是沒問題的,問題就在並不確定叫用以後是否有歸還

就以現在正再寫的三維字串陣列增刪搬移作業來說

一資料如下,橫向為列,直向為行
x00y00 x01y00 x02y00 x03y00
x00y01 x01y01 x02y01 x03y01 x04y01 x05y01
x00y02 x01y02 x02y02
x00y01 x01y01 x02y01 x03y01 x04y01

是以三維指標陣列指向每一個二維指標陣列,而二維指標則指向一個共同的一維字串陣列

當進行"列"的增加作業時,會如預期的列數越多則速度相對會減緩,而刪除作業則會隨列數減少而加速

但以"行"為單位的增刪作業時卻不如預期

當進行"列"增加如下
x00y00 x01y00 x02y00 x03y00
x00y01 x01y01 x02y01 x03y01 x04y01 x05y01
x00y02 x01y02 x02y02
x00y01 x01y01 x02y01 x03y01 x04y01
Null Null Null Null Null Null
Null Null Null Null Null Null
Null Null Null Null Null Null
.....
.....

而"行"增加如下
x00y00 Null Null Null x01y00 x02y00 x03y00
x00y01 Null Null Null x01y01 x02y01 x03y01 x04y01 x05y01
x00y02 Null Null Null x01y02 x02y02
x00y01 Null Null Null x01y01 x02y01 x03y01 x04y01
則會在進行連續的增刪動作約三百次後速度會明顯的降低

已經排除掉顯示的問題了(已將顯示專用函數註解後也有這個問題)

所以現在懷疑是那些增加出來的Null字串在刪除時沒被"真正的"釋放掉(只釋放掉指標陣列)

故想藉由觀察行程所占用的記憶體狀態來進行除錯(其實程式運行正常並無不能運行的狀況)

只是當記憶體使用狀態是"浮動的"時無法正確知道使用狀態,不知道有何方法能得知以Byte為單位的行程使用狀態

非常感謝^^!
程式是人寫的,別讓工具的限制成為您想像力的極限
~程式中最重要的部份應該是註解而不是程式碼,這是因為解讀註解一定比解讀程式碼簡單
~程式寫好後約一個月就會忘的差不多了,所以花點時間把註解寫好至少能讓自己(或別人)看的懂當初在寫什麼

stlee

  • 鑽研的研究生
  • *****
  • 文章數: 817
    • 檢視個人資料
回覆: 請問如何得知記憶體使用狀況
« 回覆 #4 於: 2008-03-30 19:52 »
嗯...找到一個辦法

1.先在另一個shell用w指令找出要執行該行程的TTY
2.然後再執行ps t xx u (紅字部分是以w查出的TTY,是一個數字)
3.然後在要執行該行程的shell內執行該行程(程式)觀察RSS欄位

結果發現執行增列後再刪除作業時記憶體的使用狀況不會被減少(但已經以free()釋放,難道並沒有被釋放???那free()到底是做啥的)

很像以malloc()宣告的記憶體並不會真的被釋放掉

那麼該如何"即時動態的"去叫用記憶體呢???
程式是人寫的,別讓工具的限制成為您想像力的極限
~程式中最重要的部份應該是註解而不是程式碼,這是因為解讀註解一定比解讀程式碼簡單
~程式寫好後約一個月就會忘的差不多了,所以花點時間把註解寫好至少能讓自己(或別人)看的懂當初在寫什麼

anderson1127

  • 訪客
回覆: 請問如何得知記憶體使用狀況
« 回覆 #5 於: 2008-04-01 11:46 »
結果發現執行增列後再刪除作業時記憶體的使用狀況不會被減少(但已經以free()釋放,難道並沒有被釋放???那free()到底是做啥的)

很像以malloc()宣告的記憶體並不會真的被釋放掉
那麼該如何"即時動態的"去叫用記憶體呢???

這個嘛,我認為是與作業系統的記憶體管理的implement 有關啦..

資料也是很久以前看過的,忘了從那裡出來 , 大意是說 ,為了加速OS的運作速度,所以process向OS要求的
memory space 歸還給OS時,OS不會把這個memory space 給釋放出來,而是將它放到memory cache
中,所以沒有意外的話,你的程式一旦free()掉的話,去觀察cache memory的大小應該會增加 !!

不過,說來說去,都是與OS的memory management有關 , Linux發展這部份我相信已經非常成熟了
應該不大可能有大幅度的變動Linux對於memory management的policy !!

stlee

  • 鑽研的研究生
  • *****
  • 文章數: 817
    • 檢視個人資料
回覆: 請問如何得知記憶體使用狀況
« 回覆 #6 於: 2008-04-01 13:23 »
結果發現執行增列後再刪除作業時記憶體的使用狀況不會被減少(但已經以free()釋放,難道並沒有被釋放???那free()到底是做啥的)

很像以malloc()宣告的記憶體並不會真的被釋放掉
那麼該如何"即時動態的"去叫用記憶體呢???

這個嘛,我認為是與作業系統的記憶體管理的implement 有關啦..

資料也是很久以前看過的,忘了從那裡出來 , 大意是說 ,為了加速OS的運作速度,所以process向OS要求的
memory space 歸還給OS時,OS不會把這個memory space 給釋放出來,而是將它放到memory cache
中,所以沒有意外的話,你的程式一旦free()掉的話,去觀察cache memory的大小應該會增加 !!

不過,說來說去,都是與OS的memory management有關 , Linux發展這部份我相信已經非常成熟了
應該不大可能有大幅度的變動Linux對於memory management的policy !!

應該是這樣沒錯,昨天晚上google到這一篇
http://www.bccn.net/Article/kfyy/cyy/jszl/200608/4238.html
還有從書上看的關於核心處理記憶體的大概意思也和您說的差不多

現在所遇到的問題應該還包含行程資源的限制
文字區---程式執行的命令區,這裡所佔的部分應該不會變動了
資料區---這裡是要動態存取的
堆疊區---比較少去直接控制它

而當我以這樣的架構進行記憶體的存取時
代碼: [選擇]
main()
{
  char *p;
  int i;

  for(i=0;i<1000;i++)
  {
    abc(&p);
    ...
    ...
    free(p);
  }
}

void abc(char **p)
{
  char *tp;

  tp=*p;

  tp=aaa(tp);
  ...
  ...
  *p=tp; 
}

char *aaa(char *tp)
{
  char *tmp;

  tmp=malloc();
  ...
  ...
  free(tp);
  ...
  ...
  return(tmp);
}
行程就會不斷的肥大直到超過行程資源限制,而放大行程資源限制顯然是不切實際的做法>"<

我再試試昨晚書上看的vmalloc()函數吧^^!

還是我只是釋放掉那些指標陣列的空間???等試出結果了再來報告吧^^!

« 上次編輯: 2008-04-01 20:08 由 stlee »
程式是人寫的,別讓工具的限制成為您想像力的極限
~程式中最重要的部份應該是註解而不是程式碼,這是因為解讀註解一定比解讀程式碼簡單
~程式寫好後約一個月就會忘的差不多了,所以花點時間把註解寫好至少能讓自己(或別人)看的懂當初在寫什麼

stlee

  • 鑽研的研究生
  • *****
  • 文章數: 817
    • 檢視個人資料
回覆: 請問如何得知記憶體使用狀況
« 回覆 #7 於: 2008-04-03 19:55 »
結果問題發生在一個我認為很不可思議的地方@@!

這是取得螢幕的行列數
void lee_getscrxy(int *x,int *y)
{
setupterm(NULL,fileon(stdout),(int *)0);
*y=tigetnum("lines");
*x=tigetnum("cols");
}

把紅字註解掉就好了@@!
行程的記憶體也不會失控了~~~

那一段已經忘記從哪裡瞧把來的....害我緊張個半天!!!

程式是人寫的,別讓工具的限制成為您想像力的極限
~程式中最重要的部份應該是註解而不是程式碼,這是因為解讀註解一定比解讀程式碼簡單
~程式寫好後約一個月就會忘的差不多了,所以花點時間把註解寫好至少能讓自己(或別人)看的懂當初在寫什麼

dou0228

  • 可愛的小學生
  • *
  • 文章數: 1
    • 檢視個人資料
回覆: 請問如何得知記憶體使用狀況
« 回覆 #8 於: 2008-05-09 09:44 »
怎麼會沒有這函數??

man 2 sysinfo