質問の前で少し議論。カーネルモードでシステムコールを処理しているときにcontext-switchが必要な場合は、set_need_reschedを実行してフラグを立ててから、ユーザーモードに戻ると、フラグを立ててコンテキストスイッチを実行します。linux 2.6スケジューリングとプリエンプション - preempt_countの使用
先行カーネルを持つlinux 2.6と比較することができます。 カーネルを2.4にしてset_need_resched(raiseフラグ)をschedule()(ディスケジューリングのディレクティブ実行)に変更することはできません。Linuxカーネル2.6では、spin_lock()で毎回増加するカウンタpreempt_countがあり、 on spin_unlock()。
実際には、このフィールド "preempt_count"は、カーネルがプリエンプトできるかどうかを決定します。たとえば、クロック割り込みからの復帰時に、条件:
(current->need_resched == 1) && (current->preempt_count == 0)
がtrueの場合、カーネルはコンテキストスイッチを実行します。
この質問は、タイプ2.6のスピンロックのロックが保持されている場合、Linux 2.6のカーネルがプリエンプションを防止する理由です。
カーネルがプリエンプションを防止しなかった場合に起こり得るシナリオは何ですか?できるだけ詳しく具体的な例を教えてもらえますか?
ありがとうございます。
カーネルコードがスピンロックを保持した後にlinuxがカーネルプリエンプションを無効にする理由(https://stackoverflow.com/questions/18254713/why-linux-disables-kernel-preemption-after-the-kernel-コードホールドスピンロック) – Tsyvarev