2014-10-16 38 views
3

我正在查看我的應用程序消耗的內存以確保我沒有分配太多內存,並且對Gnome資源監視器顯示的內容感到困惑。我已經使用以下代碼片段分配兩個獨立的應用程序中的內存,否則它們是相同的;它們含有比這個代碼和scanf函數沒有其他()調用,而我抓住了內存使用暫停執行:由Gnome資源監視器報告的C++程序中的內存使用情況:混淆

malloc(1024 * 1024 * 100); 

char* p = new char[1204*1024*100]; 

下圖顯示了我的應用程序的內存使用之前這些行後:

Memory use

現在,我已經讀了很多(但顯然是不夠的)內存使用情況(包括this SO問題),並且難以區分可寫入內存和虛擬內存。根據連鎖問題,

「可寫內存是你的程序有 具有寫權限分配的地址空間量」

「虛擬內存地址空間,你的應用程序已分配 「

1)如果我自己分配了內存,它肯定具有寫權限?

2)鏈接的問題還規定(關於malloc的)

」 ......這實際上不會分配任何內存。(見咆哮在malloc的結束 (3)有關詳細信息,我的圖片頁。)」

我沒有看到任何‘咆哮’,並展示了虛擬內存已經增加!有人可以解釋這個嗎?

3)如果我有純粹以下代碼:

char* p = new char[100]; 

...資源監視器顯示內存和重寫存儲器增加了8KB - 同樣的,當我分配一個完整的一兆字節! - 虛擬內存增加0.1。這裏發生了什麼?

4)我應該在資源監視器中查看哪些列以查看我的應用程序使用了多少內存?

非常感謝您的參與,如果不清楚或遺漏了任何可能導致我自己找到答案的事情,我們深表歉意。

+1

我不清楚你的問題是否有確切的副本,所以我沒有關閉它。但是您可能錯過的技術術語是「overcommit」。用'[C] overcommit'搜索SO顯示出很多結果。請稍微查看一下,然後回來告訴我們你是否還有更具體的問題。 – 2014-10-16 16:02:57

+1

這和「懶惰分配」或「需求分配」......當應用程序「分配」更多的內存時,Linux往往只是將一些額外的虛擬地址空間標記爲正在使用中,而沒有真正分配物理內存來填充該地址空間 - 實際分配會在稍後嘗試訪問新的虛擬地址時發生...... – twalberg 2014-10-16 16:10:44

+1

好的。我研究了推薦的術語並找到有用的鏈接。 [This](http://www.etalabs.net/overcommit.html)談論overcommit,[this](http://www.win.tue.nl/~aeb/linux/lk/lk-9。 html#ss9.6)有一些示例代碼。所以我現在知道爲什麼我的「可寫」列不會增加,直到我觸摸我的記憶(通過'memset'),但我的「虛擬」一個立即增加。但我仍不清楚爲什麼觸摸我的記憶將其從「虛擬」改爲「可寫」。另一個問題仍然是爲什麼我分配了8KB的只有100個字符...... – Wad 2014-10-16 17:07:49

回答

1

的類Gnome資源監視器報告的內存(實際上,絕大多數資源報告工具)並不是簡單的單獨的內存類別 - 它們之間存在重疊,因爲它們報告內存的不同特性。其中一些不同的特徵包括:

  • 虛擬vs物理 - 現代操作系統上進程地址空間中的所有內存都是虛擬的;該虛擬地址空間通過CPU的硬件能力被映射到實際的物理存儲器;映射如何完成本身就是一個複雜的主題,不同體系結構之間存在很大差異
  • 內存訪問權限 - 內存可以是可讀的,可寫的或可執行的,或者三者的任意組合(理論上 - 某些組合沒有什麼意義,所以硬件和/或軟件實際上可能不允許這樣做,但重點在於這些權限是分開處理的)
  • 駐留與非駐留 - 使用虛擬內存系統,大部分地址空間的進程實際上可能實際上並沒有被映射到真實的物理內存,原因有很多 - 它可能還沒有被分配;它可能是二進制或其中一個庫的一部分,或者甚至是尚未加載的數據段,因爲該程序還沒有調用它;它可能已被交換到交換區域以釋放物理內存以用於需要它的不同程序
  • 共享vs私有 - 進程虛擬地址空間的部分是隻讀的(例如,實際的代碼程序和大多數庫)可以與使用相同庫或程序的其他進程共享 - 這對整體內存使用來說是一個很大的優勢,因爲運行37個不同的xterm實例並不意味着需要加載xterm的代碼37周不同的時間到存儲器中 - 的全部工序可以共享代碼

因爲這些,以及其它一些因素(IPC共享存儲器,存儲器映射文件中,具有內存r物理設備的一個拷貝在硬件中映射的外觀等),確定任何單個進程或甚至整個系統使用的實際內存可能很複雜。

2

更準確地瞭解Linux上運行的內存使用情況process是使用proc(5)文件系統。

所以,如果你的進程的PID爲1234,嘗試過程有他們address spacevirtual memory

cat /proc/1234/maps 

通知。該地址空間可以通過mmap(2)和其他syscalls(2)更改。出於幾個效率原因malloc(3)free避免使這些系統調用過多,並且傾向於重新使用以前的free-d內存區域。所以當你的程序是free -ing(或者在C++,delete -ing中)某個內存塊時,該塊經常被標記爲可重用,但不會被釋放回內核(例如通過munmap)。同樣,如果你只有100個字節,你的libc被允許例如要求使用mmap整體兆字節(您呼叫malloc爲例如200個字節,下一次,它將使用magabyte的一部分)

參見http://linuxatemyram.com/Advanced Linux Programming(和this question約內存過量)

+0

感謝您的評論巴西爾。然而,儘管信息是有用的,但它並不真正回答我的問題(我的意思是從將來有人看這個問題的角度來看)。我希望接受的答案能成爲我所問的內容的參考。我相信你明白了:) – Wad 2014-10-19 17:59:23

相關問題