counter=0」のとき、プロセスのタイム スライスはクロック割り込みによって更新されます; 3. デバイス ドライバーが長く反復的なタスクを実行するとき、スケジューラは直接呼び出されます; 4 、プロセスが割り込み、例外、およびシステムコールからユーザーモードに戻ったとき。"/> counter=0」のとき、プロセスのタイム スライスはクロック割り込みによって更新されます; 3. デバイス ドライバーが長く反復的なタスクを実行するとき、スケジューラは直接呼び出されます; 4 、プロセスが割り込み、例外、およびシステムコールからユーザーモードに戻ったとき。">

ホームページ  >  記事  >  運用・保守  >  Linux プロセスのスケジューリングはどのような状況で発生しますか?

Linux プロセスのスケジューリングはどのような状況で発生しますか?

WBOY
WBOYオリジナル
2022-07-27 15:32:322793ブラウズ

Linux のプロセス スケジューリングで何が起こるか: 1. プロセスの状態が変化した瞬間、プロセスは終了し、プロセスはスリープし、プロセスは「sleep()」や「exit」などの関数を呼び出す必要があります。 ()" を使用して状態遷移を実行します。これらの関数 スケジューラはプロセスのスケジューリングのためにアクティブに呼び出されます。 2. 現在のプロセスの「current->counter=0」の場合、プロセスのタイム スライスはクロック割り込みによって更新されます。 3. デバイス ドライバーがスケジューラーを直接呼び出して、長く反復的なタスクを実行するとき; 4. プロセスが割り込み、例外、システム コールからユーザー モードに戻るとき。

Linux プロセスのスケジューリングはどのような状況で発生しますか?

#このチュートリアルの動作環境: linux7.3 システム、Dell G3 コンピューター。

Linux プロセスのスケジューリングはどのような状況で発生しますか?

Linux スケジューラは、プロセスを切り替えるかどうかを決定する Schedule() と呼ばれる関数です。いわゆるスケジューリング タイミングとは、スケジューラが実行される状況を指します。

Linux プロセス スケジューリングはプリエンプティブ マルチタスクを使用するため、プロセスの一時停止と実行の継続に相互の協力は必要ありません。

主な状況はいくつかあります:

  • #プロセス状態遷移の時間: プロセスの終了、プロセスのスリープ;

プロセスは、状態遷移のために sleep() や exit() などの関数を呼び出す必要があります。これらの関数は、プロセスのスケジューリングのためにスケジューラを積極的に呼び出します。 #現在のプロセス タイムスライスがなくなると (current->counter=0);

  • プロセスのタイムスライスはクロック割り込みによって更新されるため、これは状況とタイミング4は同じです。

デバイス ドライバー

  • デバイス ドライバーが長く反復的なタスクを実行する場合、スケジューラが直接呼び出されます。繰り返される各ループで、ドライバーは need_resched の値をチェックし、必要に応じてスケジューラーのschedule() を呼び出して積極的に CPU を放棄します。

プロセスが割り込み、例外、システム コールからユーザー モードに戻るとき;

  • 前述のように、いいえ割り込み、例外、システム コールからの復帰のいずれであっても、最終的には ret_from_sys_call() が呼び出され、この関数はスケジューリング フラグを検出し、必要に応じてスケジューラを呼び出します。

  • 拡張知識

Linux では、プロセスは、割り当てられたタイム スライスを超えて実行できません。プリエンプティブ マルチタスクが使用されるため、プロセスは一時停止したり継続したりできます。彼らの間で何の協力も得られずに実行されます。 Linux などのマルチタスク システムでは、複数のプログラムが同じリソースを使用するために競合する可能性があります。この場合、短時間の集中的な作業を実行し、入力を待つために一時停止する方が、プログラムを実行するよりも優れていると考えられます。計算のためにプロセッサを継続的に占有するか、入力が到着したかどうかを確認するためにシステムを継続的にポーリングします。私たちは、パフォーマンスが良いプログラムを「良いプログラム」と呼びますが、この「良いプログラム」はある意味、計算できるものです。オペレーティング システムは、nice 値に基づいてプロセスの優先度を決定します。プロセスの nice 値はデフォルトで 0 に設定されており、プログラムのパフォーマンスに基づいて変化し続けます。長時間継続して実行されるプログラムは、一般に優先度が低くなります。

システムコールから戻るときにスケジューラを呼び出す必要があるのはなぜですか?

これはもちろん効率性を考慮したものです。システムコールからの復帰とは、カーネル状態を抜けてユーザー状態に戻ることを意味し、状態遷移にはある程度の時間がかかるため、ユーザー状態に戻る前にシステムはカーネル状態で処理すべきことをすべて完了していることになります。カーネルの状態。

各クロック割り込みが発生したときにカーネルが行う動作を簡単に見てみましょう。まず、この最も頻繁に実行されるスケジューリングの機会について一般的に理解してから、スケジューラの特定の作業プロセスについて詳しく説明します。

各タイマー割り込みが発生すると、schedule()、do_timer()、ret_form_sys_call() の 3 つの関数が連携してプロセスの選択と切り替えを完了します。

schedule(): プロセスの選択 (スケジューリング) を完了するプロセス スケジューリング関数;

do_timer(): 一時的にクロック関数を呼び出し、この関数はクロック割り込みサービス プログラム内で呼び出されます。は、クロック割り込みサービス ルーチンの主要コンポーネントです。この関数が呼び出される周波数は、クロック割り込みの周波数であり、1 秒あたり 100 回です (100 Hz または 100Hz と呼ばれます);

ret_from_sys_call (): システムコールのReturn関数。

システム コールまたは割り込みが完了すると、信号処理やコア タスクなどの仕上げ作業を処理するためにこの関数が呼び出されます。

推奨学習:

Linux ビデオ チュートリアル

以上がLinux プロセスのスケジューリングはどのような状況で発生しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。