SIGKILLでプログラムを終了する前に、繰り返しのmallocによってシステムが遅くなるのを防ぐにはどうすればよいですか?

SIGKILLでプログラムを終了する前に、繰り返しのmallocによってシステムが遅くなるのを防ぐにはどうすればよいですか?

明らかに私は通常走りません。

#include <stdlib.h>
int main() {
    while (malloc(50));
    return 0;
}

しかし、私は大規模なプロジェクトをコンパイルしようとしてきました。実行中は、コンピュータcmakeのリソースが使い果たされ、コンピュータが遅くなり、数分間使用できなくなります。その後、突然私のコンピュータが再び応答しましたcmakeSIGKILL解決策は、をcmake実行してジョブ数を制限することでした-j2

しかし、上記の単純な「メモリ不足」プログラムを実行した後、最初に私のシステムが過負荷になったことを発見して驚きました。マニュアルページによると、malloc()使用可能なメモリがない場合はmalloc単に返されます0。システムがメモリの問題を認識せず、malloc失敗を選択するのはなぜですか?

つまり、プログラムがメモリを使い果たしてシステムが遅くなるようにシステムを構成する方法を探しています。同様に、常に私のDEの優先順位を指定するようにスケジューラを設定する方法はありますか?

私はKDEを使用してLinux 5.6.6.arch1-1 x86_64を実行しています。ありがとうございます。

答え1

malloc() のマニュアルページによると、malloc は、使用可能なメモリがない場合は単に 0 を返します。

この場合、コードが終了するように指定されます。しかし、先取りされたようです。

Linuxには、悪意のあるプロセスを識別して終了し、プロセスが実行するアクションを記録するメモリ不足(OOM)キラーがあります。しかし、早期に実行しないようにします。

ポライトアプリケーションは、システムに設定を問い合わせ、それに応じて動作を調整することが知られています。明らかに、cmakeはそのうちの1つではありません。

答え2

RAMが不足すると、システムがディスクに交換され始めるようです。ディスクはRAMよりはるかに遅いため、遅くなります。ある時点では、仮想メモリも枯渇し、LinuxのOut of Memory Killerが起動し、悪意があると思われるプロセスを選択して終了します(表示されるSIGKILLがまさにこれです)。これにより、システムを引き続き使用できます。

プロセスに使用可能なRAMの量を制限することで、これが発生するのを防ぎます。たとえば、CMakeで使用可能なメモリ量を100MBに制限するには、次の手順を実行します。

ulimit -v 100000
cmake <args>

RAM(-m)と仮想メモリ(-v)に別々の制限を設定できます。使用可能なメモリがない場合、malloc()ヌルポインタが返されます。よく書かれたソフトウェアはそれを賢明に処理する必要がありますが、他のソフトウェアはヌルポインタを逆参照すると分割エラーによって中断される可能性があります。

関連情報