
存在するLinuxでプロセスを「終了」する方法は?Linux は、メモリをプールに返すことでプロセスを終了すると説明します。
シングルコアマシンで実際にこれを行うにはどうすればよいですか?プロセスを終了するにはCPU時間が必要であり、プロセスが譲歩せずに非常に長い間実行される計算を実行している場合、Linuxはプロセスを終了するのに十分な長さのプロセッサをどのように制御できますか?
答え1
カーネルは、通常の操作中にプロセスがシステムコールを呼び出すたびに、割り込みが発生するたびに非常に頻繁に制御権を持ちます。ハードウェアがCPUの注意を必要とする場合、またはCPUがカーネルの注意を必要とすると割り込みが発生し、ハードウェアの特定の部分が定期的に注意(タイマー)を要求するようにプログラムできます。したがって、カーネルは、システムが過度にロックされ、割り込みが発生しなくなったら定期的に呼び出されることを保証できます。
したがって、
プロセスが結果を生成せずに非常に長い間実行される計算を実行する場合
質問ではありません。 Linuxは先制的なマルチタスクオペレーティングシステム、つまり実行中のプログラムの協力なしにマルチタスクを実行できます。
プロセスの終了に関しては、とにかくカーネルが関係しています。プロセスが他のプロセスを終了するには、カーネルを呼び出す必要があるため、カーネルには制御権があります。カーネルがプロセスを終了することを決定した場合(例えばまた、OOM キラーによって制御されたり、プロセスが実行を許可されていない操作 (マップされていないメモリーにアクセスなど) を実行しようとするため、制御されます。
カーネルは次のように構成できます。いいえ制御システムCPU自体のサブセット(廃止予定)isolcpus
カーネルパラメータ)または一部のCPU自体でジョブをスケジュールしたくない場合(使用中央処理ユニットロードバランシングは不要で、完全に統合されています。cグループv1そしてcグループv2);ただし、システム内の少なくとも1つのCPUは常にカーネルによって完全に管理されなければなりません。それでは十分です構成済み特定のCPU使用率に応じて生成されるタイマ割り込みの数を減らします。
さらに、シングルCPU(シングルコアなど)システムとマルチCPUシステムの間に大きな違いはありません。カーネル制御に関する限り、同じ問題が両方のシステムに適用されます。各CPUは定期的にカーネルを呼び出す必要があります(もしそれが)。カーネル制御下のマルチタスクに使用されます。
答え2
Linuxおよびほとんどの最新のオペレーティングシステムでは、先制的なマルチタスクこれは、カーネルが各プロセスの実行時間を完全に制御できることを意味し、プロセスが長すぎるとプロセスを先取りします。コラボレーションマルチタスクプロセスはいつでも制御を通過します。
デフォルトでは、プリエンプティブマルチタスクでは、カーネルはタイマーで定期的に実行され、カーネルが制御状態にあるたびに(タイマー割り込みが発生したとき、またはシステムコールが呼び出されたとき)、カーネルは現在のプロセスのコンテキストを保存してから次のプロセスに切り替えます。 '必要に応じてコンテキストを提供してください。これは…コンテキストスイッチプロセスの全状態(すべてのスレッド情報、レジスタ値などを含む)が保存および復元されるため、プロセスがまだ実行されていないという事実さえ知らずに、プリエンプトされた正確なポイントから実行を続けることができます。したがって、多くのプロセスが現れる実際には、いつでも1つのプロセスだけが実行されても、単一のCPUコアで同時に実行されます。カーネルは、すべてのプロセスとリソースの処理を担当する特別なプロセスにすぎません。他のプロセスを監視するために別のコアで実行されません。
また、見ることができます「Linuxカーネルはプリエンプティブです」とはどういう意味ですか?
答え3
ちょっと変な状況で(組み込みデバイスの場合もあります。ラズベリーパイ基準)Linuxカーネルを持つことができます(望むよりkernel.org&kernelnewbies.org詳細)非常に限られたグループ管理プロセス。
/sbin/init
独自のプログラムを書くこともできます。
これにより、このプロセスセットを完全に制御できます。
(望むより初期化(1))そのようにフォーク(2)- 子プロセスが少なく、他のプロセスを使用します。システムコール(2)。
これオペレーティングシステム教科書これにより、より多くの洞察を得ることができ、ソースからLinuxカーネルをコンパイルして多くのことを学ぶことができます。実行する最初のコマンドはmake menuconfig
(ローカルディスクにLinuxカーネルツリー全体がある後)です。また読んでください高度なLinuxプログラミングそして信号(7)、時間(7)、VDS(7)。
ただし、2020年現在、ほとんどのLinuxプロセッサには2つ以上のコアがあります。多くのLinuxシステムで使用されていますシステム、そのソースコードは次のとおりです。オープンソース(そしてそれを研究し改善することができます)。他のLinuxシステムを使用できます。走る(またオープンソース)。既存のプログラムから興味とインスピレーションを得て、init
独自のプログラムを書くことができます。
一度見てみたいかもしれません最初からLinux、そしてソースコードを学ぶcrt0ルーチン、そしてGNUライブラリ(これはフリーソフトウェア、良い湾岸協力協議会そしてGNUバイナリチルそしてGNU バッシュはい! )またはmusl-libcライブラリ。
関連概念は続ける(物体化のための素晴らしい名前コールスタック)そして電話/参照スキームの基本要素。だから読むR5RS、ACMシグナルイニシアチブ議事録(例:PLDI)、キネクの本Lispの小さな部分、そしてピエトラの本人工生物たぶんあるかもしれませんこのドラフトレポート(作成者:二輪電車)。気づくライスのまとめ。
使用する場合湾岸協力協議会foo.c
、コードをコンパイルしてから gcc -Wall -Wextra -fverbose-asm -S foo.c
内部を調べることを忘れないでください。foo.s
これOSDEVウェブサイトオペレーティングシステムカーネルの作成(および対応するソースコードの調査)に関する実際の情報も提供されます。あなたは興味があるかもしれません特異点ソフトウェアとフォスデムそしてACMシグプス会議。
以下を使用したい場合があります/proc/
(参照工程(5))これにより、Linuxカーネルが処理中であることを確認できます。邪魔する頻繁に発生します(通常は毎秒数百の割り込み)。各割り込み(例:高温PET)は(Linuxカーネルの場合)他のプロセスをスケジュールする機会です。
ハードウェアが毎秒数百の割り込みを提供しない場合は、ハードウェアプロバイダまたは設計者とそれについて話し合う必要があります。
プロセスが結果を生成せずに非常に長期間実行される計算を実行しています。
Linuxでは、カーネルやハードウェアに問題がない限り、これは決して起こりません。
存在するユーザースペースプロセスは毎秒少なくとも10回中断されます(2020年のほとんどのハードウェアで)。読むカーネルプリエンプションそしてコンテキストスイッチ。
コンテキストスイッチが現在の連続を変更していることを観察します。抽象的なレベルでは、割り込みはいくつかのcall/cc
割り込みに近くなります。計画。
答え4
簡単に言えば、カーネルはシステムの絶対的な独裁者です*。それは制御するいつプロセスはプリエンプティブマルチタスクカーネルとなり、リソースを獲得して制御権を持ちます。何獲得したリソース。 (要求されたリソースを処理し、リソースがあればカーネルはそれを提供します。リソースがなければリソースを提供しません。)
絶対独裁者として、核心は必要であると判断されればそれらを殺すことができます。
*常に例外と極端なケースがあります。