Windows system >> Windowsの知識 >  >> Linuxシステムチュートリアル >> LinuxシステムFAQ >> Linuxカーネルの設計と実装 - カーネルの同期化

Linuxカーネルの設計と実装 - カーネルの同期化

  

カーネルの同期化

同期化の概要

重要なセクション:重要なセクションとしても知られる、アクセスと共有データを操作するコードスニペット。

競合条件:2つ以上のスレッドがクリティカルセクションで同時に実行されると、競合状態が発生します。

同期化は、重要なセクションでの競争条件の形成を防ぎます。

クリティカルセクションにアトミック操作がある(つまり、操作全体が完了する前に中断されない)場合は、当然競合条件はありません。ただし、実際のアプリケーションでは、クリティカルセクションのコードはそれほど単純ではないことが多いため、同期を維持するためにロックメカニズムが導入されています。しかし、ロックにはいくつか問題があります。

デッドロックの条件:1つ以上の実行スレッドと1つ以上のリソースを確保するために、各スレッドはいずれかのリソースを待機していますが、すべてのリソースは既に使用中です。そのため、スレッドは互いに待機しますが、すでに持っているリソースを解放することはありません。その後、どのスレッドも続行できず、デッドロックが発生します。

自動ロック:実行スレッドがすでに保持しているロックを取得しようとすると、ロックが解放されるのを待つ必要があります。しかし、このロックを待つのは忙しいので、ロックを解除することはできず、デッドロックが発生します。

スターベーションは、スレッドが必要なリソースを長時間取得できず、実行できない現象です。

同時実行の原因

割り込み - mdash; - mdash;割り込みはいつでも非同期に発生する可能性があります。つまり、現在実行中のコードにいつでも割り込みできます。

ソフト割り込みとタスクレット - mdash; - mdash;カーネルは、割り込みとタスクレットをいつでも起動またはスケジュールして、現在実行中のコードに割り込むことができます。

カーネルプリエンプション - mdash; - mdash;カーネルはプリエンプティブなので、カーネル内のタスクは別のタスクによってプリエンプションされる可能性があります。

スリープとユーザースペースの同期 - mdash; - mdash;カーネルで実行されているプロセスがスリープ状態になる可能性があります。これによりスケジューラが起動し、新しいユーザープロセスの実行がスケジュールされます。

対称型マルチプロセッシング - mdash; - mdash; 2つ以上のプロセッサが同時にコードを実行できます。

デッドロックを回避するための簡単な規則

ロックの順序は重要です。ネストしたロックを使用するときは、ロックが同じ順序で取得されるようにする必要があります。これにより、致命的なハグタイプのデッドロックを防ぐことができます。他の人がこの順序でそれらを使用できるように、ロックの順序を記録するのが最善です。

飢餓が起きないようにします。このコードの実行が終了するかどうかを確認してください。もしAが起こらなければ、Bはずっと待たなければなりませんか?

同じロックを繰り返し要求しないでください。

ロックスキームが複雑になるほど、デッドロックが発生する可能性が高くなります。 ---デザインはシンプルであるべきです。

ロックの粒度

ロックの粒度は、ロックによって保護されているデータのサイズを表すために使用されます。過度に厚いロックはサブシステムのすべてのデータ構造などの大きなデータブロックを保護し、過度に薄いロックは大きなデータ構造内の要素などの小さなデータを保護します。

ロックするときは、デッドロックを回避するだけでなく、ロックの細分性も考慮します。

ロックの粒度はシステムのスケーラビリティに大きな影響を与えますので、ロックするときは、ロックが複数のスレッドで頻繁に使用されるかどうかを検討してください。

ロックが頻繁に競合する可能性がある場合は、ロックの粒度を調整する必要があります。

複数のプロセッサを使用する場合は、ロックを調整することでパフォーマンスが向上します。

同期メソッド

アトミックオペレーション

アトミックオペレーションとは、実行中に他のコードパスによって中断されないオペレーションのことで、カーネルコードで安全に呼び出すことができます。中断されることなく。

アトミック操作は、整数アトミック操作とビットアトミック操作に分けられます。

spinlock spin lock

スピンロックの特徴は、スレッドがロックを取得しようとしたときに、ロックが再度使用可能になるまで、ロックを取得しようとする他のスレッドがループで待機することです。

スレッドは実際にこのロックを獲得するためにループするので、CPU処理時間の浪費の原因となります。したがって、迅速に処理できるクリティカルセクションにはスピンロックを使用するのが最善です。

スピンロックを使用する際の注意点は2つあります。

1.スピンロックは再帰的ではなく、同じスピンロックを持つ再帰的要求は自動的にロックされます。

2.スレッドがスピンロックを取得する前に、現在のプロセッサの割り込みを無効にする必要があります。たとえば、現在のスレッドがスピンロックを取得した後、クリティカルセクションの割り込みハンドラによって割り込まれ、割り込みハンドラはロックを取得するだけでよいため、割り込みハンドラは現在のスレッドを待機します。スレッドはロックを解除し、現在のスレッドもクリティカルセクションを実行してロックコードを解除する前に割り込みの実行を待機しています。

割り込み処理の下半分でスピンロックを使用するには、特別な注意が必要です。

1.下半分のプロセスとプロセスコンテキストがデータを共有する場合、下半分の処理がプロセスを横取りできます。コンテキストのコード、プロセスコンテキストは共有データをロックする前に下半分の実行を禁止し、ロック解除時に下半分の実行を許可する必要があります。

2.割り込みハンドラ(上半分)と下半分が共有データを処理する場合、割り込み処理(上半分)が下半分の実行を横取りし、下半分が共有データに追加されます。ロック前は割り込み処理(上半分)は禁止され、ロック解除時は割り込みの実行が許可されます。

3.同じタスクレットを同時に実行することはできないため、同じタスクレット内の共有データを保護する必要はありません。

4.異なるクラスのタスクレットでデータを共有する場合、同じプロセッサ上ではタスクレットのプリエンプションが発生しないため、ロックを取得した後でタスクレットの1つが他のタスクレットの実行を禁止する必要はありません。

5.同じタイプまたは異なるタイプのソフト割り込みでは、データを共有するときに下位半分を無効にする必要はありません。同じプロセッサで互いに割り込まれるソフト割り込みがないためです。

読み書きスピンロック

クリティカルセクションによって保護されているデータが読み書き可能である場合、書き込み操作がない限り、同時操作で読み取りをサポートできます。書き込み操作のみが相互に排他的であるというこの要件では、まだスピンロックを使用している場合、明らかにこの要件を満たすことはできません(読み取り操作には無駄が多すぎます)。この目的のために、カーネルは別のロック読み取り/書き込みスピンロックを提供します読み取りスピンロックは、共有スピンロックとも呼ばれます、書き込みスピンロックは、排他スピンロックとも呼ばれます。

読み書きスピンロックは、スピンロックの粒度よりも小さいロックメカニズムで、「スピン」の概念は保持されていますが、書き込みの場合、書き込みプロセスは1つだけです。読み取り操作に関しては、同時に複数の読み取り実行ユニットが存在する可能性がありますが、読み取りと書き込みを同時に実行することはできません。

スピンロックはこれを達成するための迅速で簡単な方法を提供します。ロック時間が長くなく、コードがスリープしない場合は、スピンロックを使用するのが最善の選択です。ロック時間が長くなる可能性がある場合、またはロックを保持している間にコードがスリープする可能性がある場合は、セマフォを使用してロック機能を完了するのが最善です。

セマフォ

Linuxのセマフォはスリープロックで、タスクがすでに占有されているセマフォを獲得しようとすると、そのセマフォはそれを待機キューに入れます。それからそれを眠らせる、そしてプロセッサは他のコードを実行する自由を取り戻すことができ、そしてセマ​​フォプロセスがセマフォを解放するとき、待ち行列キューのどのタスクが起こされてセマフォを得る。

1)ロックが再び使用可能になるのを待っている間競合セマフォのプロセスがスリープ状態になるため、セマフォはロックが長時間保持されている場合に適用され、逆にロックが短時間保持されている場合に適用されます。セマフォの使用はあまり適していません。スリープ、待機キューの維持、および起動のコストは、ロックが占有されている合計時間より長くなる可能性があります。

2)ロックが競合していると実行スレッドがスリープするので、セマフォロックは割り込みコンテキストではスケジュールできないため、プロセスコンテキストでのみ取得できます。 3)他のプロセスが同じセマフォを取得しようとしても、それらがデッドロックされることはないため、セマフォを保持したままスリープ状態に入ることができます(プロセスは単にスリープ状態になり実行を継続するため)。

4)セマフォを使っている間はスピンロックをかけることはできません。セマフォを待っている間に眠ることがあり、スピンロックをしている間は眠ることができないからです。

5)セマフォでは同時に任意の数のロックホルダーを使用できますが、スピンロックでは一度に1つのタスクで保持できます。その理由は、セマフォにカウント値があるためです。たとえば、カウント値は5です。つまり、5つのスレッドが同時にクリティカルセクションにアクセスできます。セマフォの初期値が1から始まる場合、このセマフォは相互セマフォ(MUTEX)です。 1より大きいゼロ以外の値のセマフォの場合は、カウントセマフォとも呼ばれます。一般ドライバが使用するセマフォは、相互に排他的なセマフォです。

セマフォは、次の2つのアトミック操作をサポートしています。P /Vプリミティブ操作(ダウン操作およびアップ操作とも呼ばれます):

P:セマフォ値が0より大きい場合は、セマフォを減少させます。プログラムの値は実行を継続します。それ以外の場合、スリープ待機セマフォはゼロより大きくなります。

V:インクリメントセマフォの値インクリメントセマフォの値が0より大きい場合、待機中のプロセスはウェイクアップされます。

ダウン操作には2つのバージョンがあります。これらはスリープ中に割り込み可能で、スリープ中に割り込み不可能です。

読み書き可能セマフォ

読み書き可能セマフォとセマフォの関係は、読み書き可能スピンロックと通常のスピンロックの関係に似ています。

Copyright © Windowsの知識 All Rights Reserved