5

これがWikiから引用された説明です

Linuxカーネルは、特定の条件下でプリエンプティブスケジューリングを提供します。カーネルバージョン2.4までは、プロセスのみがプリエンプティブでした。つまり、タイムクォンタムの有効期限に加えて、動的優先度の高いプロセスがTASK_RUNNING状態になると、ユーザーモードでの現在のプロセスの実行が中断されていました。Linux 2.6に向けて、カーネルコードを実行するタスクを中断する機能が追加されましたが、カーネルコードのすべてのセクションをプリエンプトできるわけではありません。

それからそれはまたこれを言います、

プリエンプションにより、レイテンシーが改善され、応答性が向上し、Linuxがデスクトップおよびリアルタイムアプリケーションにより適したものになります。古いバージョンのカーネルには、カーネル全体で同期するためのいわゆるビッグカーネルロックがありました。これは2011年にArndBergmannによって最終的に削除されました

では、カーネルのプリエンプションが条件付きであるという現在のLinuxカーネルについて、上記のステートメントは当てはまりますか?たとえば、プロセスがシステムコールを行うことによってカーネルモードにトラップされた場合、このプロセスはプリエンプティブスケジューリングの下にありませんか?

ユーザーモードとカーネルモードの両方でのLinuxスケジューリングに関する最新の紹介記事/本はどこにありますか?

4

2 に答える 2

4

もちろん、カーネルのプリエンプションは条件付きです。排他ロックを保持している間、またはデバイス ドライバー内の時間に敏感なハードウェア レジスタに書き込みを行っている間、カーネルがタスクを切り替えることは望ましくありません。

ただし、Linux カーネルは、できるだけ早くプリエンプションを実行するために、これらの条件を最小限に抑えるために最善を尽くします。

このカーネル内プリエンプションは、コンパイル オプション CONFIG_PREEMPT が yes の場合にのみカーネルにコンパイルされることに注意してください。カーネルが明示的にチェックしたときにのみタスクの切り替えを行う CONFIG_PREEMPT_VOLUNTARY もあります。

カーネルのプリエンプションにはコストがかかります。タスクをすばやく切り替えるには、実際の作業ではなく、ほとんどが無駄なハウスキーピング作業を行う必要があります。これにより、システム全体の速度が低下し、実行される作業が少なくなります。そのため、これらのコンパイル オプションが存在します。データベースまたは Web サーバー用に構築された Linux カーネルは、プリエンプションをまったく使用しないでください。HPC 用に構築されたカーネルは、1 秒に 1 回以下のタスクのみを切り替えるように変更されることがあります。

リアルタイム タスクではすべてが変わります。これらのタスクは、信頼できる時間枠内で迅速に対応することに依存しています。デフォルトの Linux カーネルはこれに非常に優れていますが、「-rt パッチ」と呼ばれるパッチ セットがあり、これが非常に優れています。パッチ セットは、割り込みハンドラーの優先順位付けやカーネル ロックの変更など、あらゆる種類のことを行い、ロックを解除して後で再起動できるようにします。

于 2012-12-06T19:49:46.360 に答える
3

CPU スケジューリングの決定は、プロセスが次の場合に行われる場合があります。

1. Switches from running to waiting state (e.g. I/O request)
2. Switches from running to ready state (e.g. Interrupt)
3. Switches from waiting to ready (e.g. I/O completion)
4. Terminates

1 と 4 のスケジューリングはプリエンプティブではなく、他のすべてのスケジューリングはプリエンプティブであり、操作 (システム コール) が不完全になる可能性に対処する必要があります。

はい Linux は、カーネルがプリエンプションなしで完了するまでスケジュールする一部の Unix バリアントとは異なり、特定の条件下でプリエンプティブ スケジューリングを提供します。Linux 2.6 では、カーネルは、ロックを保持しておらず再スケジュールしても安全でない限り、実行中のタスクをプリエンプティブにしました。

Older versions of the kernel had a so-called big kernel lock for synchronization 
across the entire kernel.

各ユーザー レベル スレッドは、1 つのカーネル スレッドのみにマップされます。

于 2012-12-06T19:53:51.853 に答える