このコードは、コマンドライン上の入力として数をとり、何回もすることをheapOverflow()関数を呼び出します:Linuxのミント17.1でヒープオーバーフローがシステムをフリーズするのを「許可」するのはなぜですか?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void heapOverflow()
{
unsigned *some_array = malloc(50000);
}
int main(int argc, char *argv[])
{
unsigned num_calls = atoi(argv[1]);
while (num_calls > 0)
{
heapOverflow();
num_calls--;
}
return 0;
}
が、十分な大きさの入力(私の場合は例えば10000000)でこれを実行していますbashが "Killed"で復帰する前に数分間システムをフリーズさせてから、システムはさらに数分間遅くなります。
なぜOSはプロセスがその程度までメモリを引き継ぐことを許可しますか?スケジューラとメモリマネージャは、あまりにも多くのヒープメモリを要求することが明らかになったときにプロセスを強制終了するべきではありませんか?あるいは、このすべてのメモリを1つのプロセスに与えることが有用な場合があります(つまり、システムの残りの部分、または少なくともX GUIシステムが凍結されている間でも、実際にプロセスが有用な作業をすることができますか?)
'malloc'は、失敗したときに' NULL'を返します。確認してください、それは不可欠です。 –
Linuxカーネルはメモリオーバーコミットを許可しています(プログラムは使用可能なメモリよりも多くのメモリを要求することができ、割り当ては成功しますが、後でメモリが利用できないときにコードがクラッシュします)。あなたの好きな検索エンジンで 'Linux OOM Killer'(メモリ不足のキラー)を検索してください。あなたのコードは実際に割り当てているメモリを使用しません。ポインタのためにスペースを使い果たす必要があるため、メモリ自体ではなく、実行に時間がかかります。メモリを割り当てた後でメモリをゼロにした場合(おそらく 'calloc()'を使用してください)、システムに与える影響は少なく、速くクラッシュします。 –
プロセスが実際に大量のメモリを必要とするときにはどうなると思いますか?とにかくそれは殺されるべきですか? – immibis