以前のLinuxカーネルがプリエンプティブではないのはなぜですか?

以前のLinuxカーネルがプリエンプティブではないのはなぜですか?

最初のLinux開発者が非線形カーネルを実装することを選択したのはなぜですか?同期保存ですか?

私が知る限り、Linuxは1990年代初頭にPCにプロセッサが1つしかなかったように開発されました。そのようなPCでの非線形コアの利点は何ですか?しかし、マルチコアプロセッサが利点を減らすのはなぜですか?

答え1

Linuxカーネルの文脈では、人々がプリエンプションについて話すとき、通常、カーネルが自分自身を中断する能力、つまり本質的にカーネルコードが実行されている間にタスクを切り替える能力を指します。これを可能にするのは非常に複雑で、おそらくコアがプリエンプションされるのに長い時間がかかる主な理由です。

最初は、ほとんどのカーネルコードが大規模なカーネルロックで保護されているため、中断することはできません。ロックはますます多くのカーネルコードから徐々に削除され、複数のカーネルを同時に並列に呼び出すことができるようになりました(SMPシステムが汎用化されるにつれて、これはより重要になりました)。しかし、これはまだコア自体をプリエンプション可能にするわけではありません。それまだより多くの開発が必要であり、最終的にPREEMPT_RTパッチセットは最終的にメインラインカーネルにマージされました(そしてとにかくBKLを先取りすることができました)。これで、必要なスループットとレイテンシの特性に基づいてコアをプリエンプティブに設定できます。関連カーネルの設定もっと学ぶ。

カーネル構成の説明に示すように、プリエンプションは並行性ではなくスループットとレイテンシに影響します。単一のCPUシステムでは、プリエンプションはより短い応答時間でイベントを処理できるため、まだ便利です。ただし、これによりスループットが低下します(カーネルがジョブを切り替えるのに時間を費やすため)。プリエンプションを使用すると、単一のCPUまたは複数のCPUシステムの特定のCPUを他のジョブにすばやく切り替えることができます。マルチCPUシステムの制限要因は、プリエンプションではなくロック(大小)です。すべてのタイムコードがロックを獲得すると、他のCPUが同じタスクの実行を開始できないことを意味します。

答え2

プリエンプティブコアは、単にコアがないことを意味します。大きなカーネルロック

Linuxには最初からプリエンプティブマルチタスク(つまり、ユーザーコードがプリエンプション可能)がありました(私の知る限り、Linusがfunet ftpサーバーにアップロードした最初のLinux 0.0.1はすでにプリエンプティブマルチタスクです)。たとえば、複数の圧縮またはコンパイルプロセスを実行する場合は、最初から並列に実行されます。

当時広く使われていたWin31とは反対の概念です。 Win31 でタスクが「カーネル」から CPU をインポートする場合、デフォルトでいつオペレーティングシステム (または他のタスク) に制御権を渡すかを決定するのは基本的にそのタスクの責任です。プロセスにこの機能の特別なサポートがない場合(追加のプログラミング作業が必要です)、実行中に他のすべてのタスクが一時停止されます。これは、Win31に統合されたほとんどの基本アプリケーションにも当てはまります。

プリエンプティブマルチタスクは、タスクに必要に応じてCPUが割り当てられていないことを意味します。逆に、タイムゾーン有効期限が切れると、カーネルはCPUを取得します。したがって、プリエンプティブオペレーティングシステムでは、正しく作成されていないプロセス、または正しく実行されていないプロセスがオペレーティングシステムを停止したり、他のプロセスの実行を妨げたりすることはありません。 Linuxは常にユーザースペースプロセスを先取りします。

大きなカーネルロックは、場合によっては次のことを意味します。カーネル空間の内部他のプロセスが保護されたコードを実行できないようにするいくつかのロックがまだあるかもしれません。たとえば、次のことはできません。同時に複数のファイルシステム - 複数のマウントコマンドを提供する場合、マウントするには大規模なカーネルロック割り当てが必要であるため、連続して実行されます。

カーネルプリエンプションを有効にするには、マウントと他のタスクを同時に実行できますが、これらの大規模なカーネルロックを削除する必要があります。大変なことです。

歴史的に、SMP(マルチCPUサポート)のサポートが絶えず増加するにつれて、これは非常に緊急になりました。初めて真のマルチCPUマザーボードが登場しました。後で複数のCPU(「コア」)が単一のチップに統合され、今日の真のマルチCPUマザーボードはまれです(通常は高価なサーバーシステムに見られます)。そして真のシングルコアシステム(単一のCPU、単一のコア)はまれです。

したがって、あなたの質問に対する答えは常にプリエンプションであるため、「非プリエンプションの理由は何ですか」ではありません。本当の質問は、プリエンプティブカーネルの実行が本当に必要な理由。答えは、マルチCPUとマルチコアシステムの比率が増え続けているということです。

答え3

これは技術的な答えではなく、歴史的な答えです。特定の問題OPが質問しました。 「以前のLinuxカーネルでプリエンプトされていないのはなぜですか?」

(@peterhが彼の答えと意見で説明したように、OPは「非線形」として次の事実の1つまたは両方を参照していると仮定します。1つのユーザープロセスのみがカーネル(API内)内で実行でき、および/または大規模カーネルロック。

Linus Torvaldsは、オペレーティングシステムがどのように機能するかを学ぶことに興味があり、彼が学んだ方法はオペレーティングシステムを書くことでした。彼のモデル、基盤、初期の開発環境は、教育目的で使用される既存のオペレーティングシステムであるMinixでした(つまり、本番OSではありません)。これは無料ではありませんでした(当時オープンソースがそうだったように - 誰にとってもビールのように無料ではありませんでした)。

それで彼はプリエンプション(他の答えで言及された大きなカーネルロック)なしでカーネルを作成しました。トレーニング目的で新しいOSをすばやく起動して実行するには、次の手順を実行します。これにより、はるかに簡単になります。ユーザープログラムとデバイスの同時マルチプログラミングをサポートするカーネルは十分に困難です。極度にカーネル自体を並行性にすることは困難です。

彼がLinuxがどれほど人気が​​あり、有用で重要になるかを知っていたら、彼も同じことをしたでしょう。 (私の考えには一体何を考えていたのか分からない。) 走るには先に歩かなければならないからだ。

これらの状態は長い間続きました。その理由は、a)Linuxを今日の外観(または当時の外観)にするために必要な作業がはるかに多かったことです。b)Linuxを変更するのは難しい作業でした。答えは)で説明されています。

関連情報