2014-09-02 72 views
1

在ubuntu 13.04 64bit下運行以下示例代碼,使用intel編譯器14工具鏈安裝了16 GB內存。c + + stdlib.h system()命令在分配8GB內存後無法工作

我的應用程序 在驗證點進行分類後,我的系統(「做某事bashy ..」)有問題,無法工作。 經過幾個小時的爭鬥後,我意識到,我在該特定點分配8GB內存的事實不允許我使用system()命令。不用說,這是我分配的內存,我可以自由地使用系統。

代碼片段:

#include <string.h> 
#include <iostream> 
#include "stdlib.h" 

int main() { 
char ** buffer = new char*[100]; 

system("logger TRYING..!"); 
for(int i= 1; i<=80; i++) 
{ 
    buffer[i] = new char[200*1000*1000]; 
} 

system("logger SUCCESS..!"); 

return 0; 
} 

感謝您的幫助..!

+2

'系統'函數分出一個新進程,當新進程創建爲父進程,分配內存和全部進程的副本時,這有效地將分配的內存量加倍。 – 2014-09-02 13:30:12

+0

80 * 200 * 1000 * 1000 =接近16 GB,而不是8。 – IronMensan 2014-09-02 13:41:39

回答

2

system來電fork,這將本質上從您的過程中需要的RAM的兩倍。由於您使用8 GB並且只有16 GB,因此您沒有足夠的空間,並且fork失敗。也就是說,fork是通過寫入時複製頁面實現的,這意味着如果您不更改子進程的內存,則RAM實際上不會被複制。在這種情況下,你不會寫入該內存,但操作系統不知道,所以fork失敗。您應該通過檢查system的返回值(如果fork失敗則返回-1)來確認。

您可以嘗試啓用overcommit內存,以允許您「過量使用內存」。這應該讓fork成功。在你的情況下,我可能只會暫時啓用它。

# Enable overcommit 
echo 1 > /proc/sys/vm/overcommit_memory 

# Disable overcommit 
echo 0 > /proc/sys/vm/overcommit_memory