#include <unistd.h>
int main(int argc, char* argv[]) {
while(1)
{
fork();
}
}
Linuxでこのプログラムを実行しましたが、端末に何も出力されず、OSが死んでしまったようです。Linuxには、メモリ不足になる可能性のあるプログラムに対する保護手段がありますか?
#include <unistd.h>
int main(int argc, char* argv[]) {
while(1)
{
fork();
}
}
Linuxでこのプログラムを実行しましたが、端末に何も出力されず、OSが死んでしまったようです。Linuxには、メモリ不足になる可能性のあるプログラムに対する保護手段がありますか?
回答:
これはフォーク爆弾として知られています。
Linuxには、メモリ不足になる可能性のあるプログラムに対する保護手段がありますか?
あんまり。各フォークは、独自の仮想アドレス空間とメモリ使用量を持つ新しいプロセスを生成します。したがって、各コピーは比較的小さいです。最終的には、システム上のすべての物理メモリとスワップメモリを使い果たし、メモリ不足(OOM)キラーが個々のプロセスの強制終了を開始します。しかし、フォーク爆弾は、プロセスを作成するのと同じくらい高速です(高速でない場合)。
そもそもこれが発生するのを防ぐ1つの方法は、ユーザープロセスの数を制限するulimit -u
ことです(Bashを使用していると仮定します。他のシェルには同等のものがあります)。
ulimit
bashに固有のことです。他のシェルにはおそらく同じ組み込みコマンドがありますが、名前が異なる可能性があります。
はい。ただし、システムでデフォルトで有効になっていない場合があります。setrlimit
ユーザごとのプロセスの数を含む-システムコールは、システムの制限を定義します。
最初にカーネルAPIを見てみましょう(「linux」と言ったため):setrlimitのマンページを使用すると、次のようなことができます。
#include <sys/resource.h>
...
struct rlimit r;
rnew.r_cur = 40;
rnew.r_max = 50;
setrlimit(RLIMIT_NPROC,&r);
これにより、ユーザーごとの最大プロセス(RLIMIT_NPROC
)が40(ソフト制限)および50(ハード制限)に設定されます。
ここで、シェルから、bashを使用する場合、ulimit
組み込みコマンドを使用できます。
ulimit -u
29089
引数として渡すことで制限を設定できます:
ulimit -u 100
ulimit --help
設定可能な制限が他にもいくつかあることを示します(興味深いのは、ユーザーが使用するファイル記述子の最大数です)。
ユーザーレベルで使用するか、システムレベルで使用するかによって異なります。ユーザーレベルでは、ulimit
(または他のシェルの対応するコマンド)が最も簡単なソリューションです。
ただし、システムレベルでは、悪意のあるユーザー(またはulimitを使用しない)がシステムを停止しないようにするメカニズムがあります。Linux cgroupsメカニズムは、グループごとにリソースを制限できます。(pam_systemd
メカニズムにより)ユーザーセッションを特定のグループに強制することができます。これには、たとえばCPUスケジューラなど、他の利点もあります。
/sys/fs/cgroup/
2. Googleでの検索による3.ブラウジングによるmake menuconfig
4.による調査/usr/src/linux/Documentation/cgroups
5. systemdドキュメントの閲覧による。申し訳ありませんが、これ以上のお手伝いはできませんが、これらのリソースのみを使用しました。デスクトップでcgroupを使用してリソースを制御しました。
ここでの最新の回答は3年以上前のものなので、新しいカーネル(4.3以降)は、新しい「PIDsサブシステム」を介してフォーク爆弾を防ぐための明示的なサポートがあることを指摘したいと思います。(https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=49b786ea146f69c371df18e81ce0a2d5839f865cおよびhttps://git.kernel.org/cgit/linux/kernel/gitを参照してください/torvalds/linux.git/commit/?id=917d8e2d10f40e28aa9e0d824b2e5b8197d79fc2)