2009-11-04 61 views
4

我想獲取每個進程和系統範圍內的內存使用信息。在Windows中,這很容易。 GetProcessMemoryInfo和GlobalMemoryStatusEx可以非常輕鬆地完成這些工作。例如,GetProcessMemoryInfo給出給定進程的「PeakWorkingSetSize」。 GlobalMemoryStatusEx返回系統可用內存。Linux/Windows中的C/C++內存使用API​​

但是,我需要在Linux上完成。我試圖找到相當於GetProcessMemoryInfo和GlobalMemoryStatusEx的Linux系統API。

我發現'getrusage'。但是,struct rusage中的max'ru_maxrss'(駐留集大小)僅爲零,未實現。另外,我不知道要獲得全系統的空閒內存。

當前的解決方法,我使用的是「system(」ps -p%my_pid -o vsz,rsz「);」。手動記錄到文件。但是,處理數據很髒並且不方便。

我想知道一些花哨的Linux API用於此目的。

+0

您是否想要特定進程使用的內存量或特定線程正在使用的內存量? – ChadNC 2009-11-04 16:04:54

+0

@ChadNC,我想要每個進程和系統,我解決了這個問題。 – minjang 2009-11-05 20:05:22

回答

6

您可以在libstatgrab中看到它是如何完成的。
您也可以使用它(GPL)

+0

謝謝亞歷克斯,這正是我想要的。實際上,庫讀取/ proc/*數據,這是我會嘗試它的方式:) – minjang 2009-11-04 16:51:45

+0

然後將答案標記爲已接受,並upvote它。 – 2009-11-05 03:20:44

5

Linux有一個(模塊化)文件系統接口,用於從內核中獲取這些數據,因此幾乎可用於任何語言或腳本工具。

內存可能很複雜。程序可執行文件本身,大概是mmap()被編入共享庫。堆棧利用率。堆利用率。軟件的部分駐留在RAM中。部分換出。等等


「PeakWorkingSetSize」究竟是什麼?這聽起來像最大駐留集大小(進程使用的最大非交換物理內存RAM)。

雖然它也可能是整個過程的總虛擬內存佔用量(內存和SWAPPED輸出部分的總和)。


Irregardless,在Linux下,你可以strace的的過程,看看它的內核級別的交互。 「ps」從/ proc/$ {PID}/*文件獲取數據。

我建議你cat/proc/$ {PID} /狀態。 Vm *行非常有用。

具體來說:VmData是指進程堆利用率。 VmStk是指進程堆棧利用率。

如果繼續使用「ps」,您可能會考慮popen()


我也沒辦法讓整個系統的可用內存。

總是有在/ usr/bin中/免費

注意,Linux將利用用於緩衝文件和緩存未使用的內存的......因此,+/-緩存/緩存一行。

+0

感謝您的詳細解答。 「PeakWorkingSetSize」在Windows系統中定義,它與您指出的最大rss類似。 如上所述,libstatgrab讀取/ proc/$ PID/status中的文件。該庫還通過閱讀「/ proc/meminfo」部分提供了系統範圍的可用內存。 謝謝! – minjang 2009-11-05 18:05:46