Windows system >> Windowsの知識 >  >> Linuxシステムチュートリアル >> Linuxチュートリアル >> Linuxカーネルでの同期とタスクスケジューリング

Linuxカーネルでの同期とタスクスケジューリング

  

まとめ:同期の概念は、マルチスレッドとマルチプロセスプログラミングで完全に解釈されてきました。同期メソッドは、それらが生成された理由(スレッドまたはプロセスの同時実行性が唯一の理由)についてあまり考えなくても、ユーザーアプリケーションに簡単に使用できます。ただし、カーネル内の同期プロセスははるかに複雑であるため、開発者はカーネル内のタスクをどのようにスケジュールしてカーネル内の同期を効果的に制御するかを知っておく必要があります。そのため、この記事では、カーネル・タスク・スケジューリングを組み合わせ、カーネル内の同期測度を分析し、そして例を組み合わせて、カーネル内でさまざまな同期方式を使用する方法について説明します。

並行性、競合、そして同期:並行性、競合、そして同期の概念は、誰もが知っていると思いますが、この記事は繰り返さない。私たちの議論の焦点は、カーネルが並行処理であるときに何が起こるのでしょうか?カーネルの同時実行を防ぐ方法同期方法は何ですか?そして、これらの方法の特徴とその使い方は何ですか?

次の段落では、上記の概念間の一般的な関係について説明します。これはカーネルにも当てはまります。

マルチスレッド開発者にとって、面倒なプロセス間通信を避けるために、共有データへのマルチスレッドアクセスがよく使用されます。ただし、共有データへのマルチスレッド同時アクセスは競合を引き起こし、データを矛盾した状態にする可能性があるため、共有データを保護するためにいくつかの同期方法が必要です。マルチスレッド同時実行は、スレッドのプリエンプティブスケジューリングによるものです - 共有データアクセス中に1つのスレッドがスケジューラによって中断されている(まだ完了していない)場合は、別のスレッドを操作中にします - mdash;スレッドもこの共有データにアクセスする必要があるため、競合が発生します。競合を避けるためには、スレッドが共有データにシリアルにアクセスするようにする必要があります。つまり、アクセスを同期させる必要がある場合、一方の当事者がデータへのアクセスを終了した後、もう一方が同じデータにアクセスできます。

コア並行性の原因上記の状況は、同時ユーザースペースの一般的な原因ですカーネルにとって、並行性の理由は似ていますが、状況はより多様で複雑です。

1台の加工機では状況は比較的単純です。 2.6カーネルより前のLinuxカーネルでは、カーネルタスクが実行されるまで中断されることはありませんでしたが、この場合、カーネル内でプログラムを同時に実行することはまれです。 Br>

1:割り込みは非同期に実行され、割り込みは非プリエンプティブカーネルで現在実行中のカーネルコードに割り込む唯一の方法であるため、割り込みは明らかに他のカーネルコードと同時に実行できます。そのため、割り込み操作と中断されたカーネルコードが同じカーネルデータにアクセスすると、競合が発生します。

2:スリープとスケジュール変更、プロセスコンテキスト内のカーネルタスク(後述)がスリープ(スリープとはプロセッサを放棄する)ことができ、スケジューラは他のプログラムの実行をスケジュールします(最初にスケジュールされたタスクを実行します)。キュー内のカーネルタスクは、次にソフト割り込みなどを実行し、最後に実行キューから優先順位の高いユーザープロセスを選択して実行します。もちろん、これもカーネルによる同時アクセスを引き起こし、スリープ状態のカーネルタスクと新しく起動されたカーネルタスクが同じ共有データにアクセスすると、競合が発生します。参考文献1を参照してください。

2.6カーネルはプリエンプティブカーネルになります - カーネルは実行中のカーネルコードをいつでもプリエンプションすることができます。そのため、カーネルでの同時実行の状況は大幅に増加しました。カーネルプリエンプションは、カーネルプログラムの同時実行性のもう1つの可能性となっています。そのため、プリエンプティブカーネルコードを開発するときは、プリエンプションの競合に注意する必要があります。

単一プロセッサ上での並行処理は論理的な擬似並行処理で、実際にはいわゆる並行カーネルプログラムは実際にはプロセッサをインターリーブ方式で使用します。真の同時実行プログラムは、対称型マルチプロセッサに依存しなければなりません。しかし、それが論理的並行性であるか真の並行性であるかにかかわらず、競合が生じ、それらの処理は同じです。しかし、対称型マルチプロセッサでは、2つ以上のプロセッサが同時にコードを実行できるため、異なるプロセッサで実行されるカーネルコードが同時に同じコードにアクセスする場合、カーネルに並行性をもたらすことは避けられません。データを共有し、競争が生まれます。したがって、言うまでもなく、対称型マルチプロセッシングはカーネル同時実行性のもう1つの可能性です。参考文献2

を参照してくださいLinuxカーネルが進化し続けるにつれて、カーネルはシステムをより包括的にサポートし、タスクスケジューリングはより効率的になり、同時にカーネルに対してより多くの並行性をもたらします。競争を引き起こしやすいです。カーネルの高い安定性を保証するためには、上記のさまざまな同時実行状況をカーネル内で効果的に処理する必要があります。

割り込みによる同時実行性、スリープによる同時実行性、またはカーネルのプリエンプションによる同時実行性のいずれかをカーネル開発で回避するには、本質的にそれらの同時発生性の理由を理解する必要があります。カーネルタスクのスケジューリングメカニズムを習得した後に初めて、同時実行性の予測を真に達成し、次に同時実行性を回避するために適切な同期方法をロックすることができます。

以下でタスクスケジューリングについて説明します。並行生成の条件を比較して、カーネル内でスケジューリングが行われる条件を分析します。

カーネルでのタスクスケジューリング:ここで話しているタスクスケジューリングは、よく言われるプロセススケジューリングとは異なります。プロセススケジューリングは、次のとおりです。カーネル内のスケジューラは、プロセス実行キュー内で適切な(優先度の高い)プロセス実行を選択します。カーネルタスクスケジューリングとは、カーネル内のタスクに実行機会が与えられることを意味します。カーネルの同時実行性のためには、カーネルタスク間の関係が特に重要です。

最初に、カーネルが持っているタスクとそれぞれの特徴を見てみましょう。

コアタスクの種類ハード割り込み操作:

ハード割り込みは、プロセッサ以外の周辺機器によって生成された割り込みで、プロセッサによって受信され、カーネル内の割り込みハンドラに渡されます。処理しています。最初に、ハード割り込みが非同期に生成され、割り込みが発生した直後に割り込みが処理されます。つまり、割り込み操作はカーネル内で実行中のコードを横取りすることができます。これはとても重要です。次に、割り込み操作は割り込みのコンテキストで発生します(いわゆる割り込みコンテキストは、どのプロセスからも独立しているコンテキストを指します)。割り込みコンテキストでは、プロセス関連のリソースは使用できず、スケジュールもできません。参照2を参照してください。


ソフト割り込み操作:

ソフト割り込みは、完了した時間を超えてハード割り込み操作を実行するLinuxのプッシュ後実行メカニズムです。ハード割り込み処理中の割り込みは破棄されるため、ハード割り込みは危険な時期に実行されます。安全でない時間はできるだけ短くする必要があるため、ソフト割り込みを使用してほとんどのタスクを実行し、ハード割り込みでは完了できない時間のかかるタスクを安全な時間で実行します(ソフト割り込み中に割り込み信号は破棄されません)。

ソフト割り込みは、ハード割り込みのようにいつでも実行できます一般的に、ソフト割り込みは、カーネル処理タスクの処理後にユーザーレベルプログラムに戻る前に処理されます。具体的には、ハードウェア割り込み操作が完了した後、カーネルスケジューラが終了したとき、システムコールが戻ったとき(もう一方のカーネルスレッドksoftirqdサイクルがソフト割り込みを実行したとき)に3回実行されます。ソフト割り込みの実行も割り込みコンテキスト内にあるため、割り込みコンテキストはハード割り込みと同じになるように制限します。

Taskletと下半分

Taskletと下半分は、ソフト割り込みに基づいて構築された2種類の遅延メカニズムです。具体的な違いは、ソフト割り込みは静的に割り当てられ、類似のソフト割り込みは複数のCPUで同時に実行可能、タスクレットは動的に割り当てることができ、さまざまな種類のタスクレットは複数のCPUで同時に実行できますが、類似のタスクレットは実行できず、下半分は静的にしか割り当てることができません。優先度の高いタスクレットは、タイプが異なり、異なるCPUで実行されている場合でも、他の下位半分と同時に実行されます。

Copyright © Windowsの知識 All Rights Reserved