2017-04-18 16 views
-1

以下C++動態地爲包含大量整數的對象的巨大數組分配內存。爲什麼操作系統不會拒絕此程序的內存?

#include <iostream> 
// VALUE1 > 1000000 
class Int{ 
int* p = new int[VALUE1]; 

}; 

int main() { 
// VALUE2 > 1000000 
Int* ppi = new Int[VALUE2]; 
while(true){ 
    } 
} 

我的理解是內存分配在堆(這是很大的)。程序向內存請求操作系統,並處理內存分配。所以,我的問題是爲什麼操作系統沒有向程序拒絕內存(如果它沒有可用的內存資源,它會讓它崩潰)?這是操作系統的工作。上述程序使我的電腦凍結。如果有問題,我在Linux 4.9上有8 GB RAM。

+2

我猜計算機凍結了,因爲它忙於'while(true){}'中什麼都不做。由於'p'和'ppi'從不使用,它們可能已被編譯器優化掉了。 – wkl

+0

你確定編譯器不只是優化分配,因爲你什麼也不做呢? – EdChum

+2

或者也許它變成了一個虛擬內存請求,它將不會提交頁面直到它們被訪問。 –

回答

1

如果操作系統沒有可用的內存資源,OS爲什麼不會拒絕內存?

操作系統可能會拒絕內存的重新分配,或者它可能不會。不否認分配不是所有操作系統必須執行的操作。

允許放置意味着允許程序分配儘可能多的虛擬內存,並且不會被終止,直到不再有空閒的物理內存映射爲止。物理內存僅在訪問內存時映射。即使所有的物理內存都被映射,其中的一些可以交換到磁盤上。

在Linux 4.9

的Linux尤其確實的內存支持的過度分配。

上述程序會讓我的電腦凍結。

該程序是一個無限循環。如果循環沒有被優化到睡眠中或被移除,那麼它將無限期地要求處理器時間。如果只有1個CPU核心,則根據調度算法,另一個進程可能需要一些時間才能獲得CPU時間。

+0

嚴格來說,允許編譯器刪除該循環。 –

相關問題