Windows system >> Windowsの知識 >  >> Linuxシステムチュートリアル >> Linuxチュートリアル >> スピンロックとLinuxカーネルスケジューリングの関係

スピンロックとLinuxカーネルスケジューリングの関係

  
スピンロックの使用法に関する記事はたくさんありますが、詳細のいくつかでは不十分です。私は個人的に誰かが尋ねるのが簡単だと思う場所を見てみましょう。

スピンロック(スピンロック)はじめ

スピンロックは唯一の重要な領域に存在することが許された時間でこれだけつのスレッドを同時にカーネルタスクまで保持することができます。これは、シングルプロセッサ上で実行されているプリエンプティブカーネルで必要なマルチプロセッシングマシンやロックサービスに適用できます。

第二に、ここではセマフォのプロフィール

も、その使用スピンロックと同様の場所であるため、セマフォの下概念を導入します。セマフォ

Linuxは、スリープロックです。タスクがすでに保持されているセマフォを取得しようとすると、セマフォはそれを待機キューにプッシュしてからスリープさせます。この時点で、プロセッサは他のコードを自由に実行できます。プロセスがセマフォのセマフォが解放される保持している場合は、キューにあるタスクは、彼らはセマフォを得ることができるように、起こされるのを待っています。多くの場所は、任意の使用を選択することができますロックやセマフォのスピンで

3つのスピンロックとセマフォは

コントラストが、唯一のそれらのいずれかを選択することができますいくつかの場所があります。 2つのうちのいくつかの使用法を比較しましょう。
ログイン表1-1比較スピンロックとセマフォが


セマフォ又はロックスピンロック
低いオーバーヘッド(高速実行時間クリティカルゾーン)アプリケーション<ロック
低オーバーヘッドロック(長い時間のためのクリティカルセクションの実行)
優先セマフォ
クリティカル領域は、睡眠のコード
原因がすることができます、スピンロックを選択することはできません含めることができますBR>好みのスピンあなたがセマフォを選択した場合でも、重要な領域は非プロセス・コンテキストに配置されて
セマフォを選択し、この時点では唯一の非閉塞的

使用することができ、好みのスピンロックを
眠ることができませんBr>
4、スピンロックとLinuxカーネルプロセス私たちは、重要な領域は、あなたがスピンロックを使用することはできません睡眠の原因となるコードが含まれていることができれば、それは可能性があり、(他のいくつかの例では簡単には理解する)を以下の表に
ケース3 1-1
関係をスケジュール話し合いますデッドロックなぜスピンロックを行うことができない眠ることができ、信号の保護コードの量を



、スピンロックバーの実装を見て、実質的にスピンロックの形は以下:

spin_lock(&#038を、mr_lock); //クリティカルな領域spin_unlock(&#038; mr_lock); < (&#038; mr_lock)BR> spin_lockを追跡するの#define spin_lock
実装(ロック)_spin_lock(ロック)
の#define _spin_lock(ロック)__LOCK(ロック)
の#define __LOCK(ロック)\\
実行{preempt_disable(); __acquire(ロック);(ボイド)(ロック);}(0)
ログイン注目&'ながら、preempt_disable()'、この関数が呼び出さ&'れる; OFF&'プリエンプション;(プリエンプション機能はspin_unlockでオンに戻ります)。図から分かるように、作業領域を保護するためにスピンロックの使用は非プリエンプティブな状態にある。でも、中に&'ロックされていませ;スピン'も状態のプリエンプションを無効にします。これを知って、スピンロック保護のためのコードがスリープできない理由を理解できるはずです。スピンロックで保護されたコードの途中でスリープし、この時点でプロセスのスケジューリングが行われると、別のプロセスがスピンロックで保護されたコードを再度呼び出すことがあります。スピン'そして、我々は今、ロック&'を取得するよりもさらに小さい知っている状態、また押収することは禁止し、&'され、スピン'とダイナミックが、眠れないだろう、それはプロセッサでありますこれ以上プロセススケジューリングはありませんので、デッドロックは自然に起こります。

我々は次のスピンロックの特性を要約することができます
リットルシングルプロセッサ非プリエンプティブカーネル:スピンロックがコンパイル時に無視され、
リットルユニプロセッサカーネルプリエンプション下:セルフのみプリエンプティブカーネルスイッチとして提供ツイストロック、マルチプロセッサ
1:完全にスピンロックスピンロックコアの役割を再生するには、この時間は、複数のプロセッサが同時に重要なアクセスを防止するために設計されていますゾーン、カーネルの横取りによる競合を防ぐため。 linuxをつかむために時間をつかむで
5、Linuxは前回の理解に発生した起こった、ユーザとカーネルプリエンプションに分けつかむつかみます。次の場合に生成さ

ユーザープリエンプション:カーネルプリエンプションがシステムに発生します割り込みハンドラ

ユーザ空間からLリターン
ユーザ空間に戻ります
リットルコール:
割り込みハンドラからカーネル空間を返すときに、その時点でカーネルがプリエンプティブになっているとき。
カーネルコードがもう一度プリエンプティブになっているとき。 (のような:spin_unlock)の
リットルタスクがカーネル内でブロックされている場合、明示的にスケジュール()の
リットルを呼び出すの中核タスクの場合。

基本的なプロセスのスケジューリングは何が起こったかクロックが中断された後、および検出プロセスがタイムスライスにわたり使用されてきた、
プロセスは、プリエンプションを発生します。通常、我々は、割り込みハンドラは、時間のカーネル空間のようなI /O操作のリアルタイムの数向上させるために、この機能のカーネルプリエンプションすることができ返す使用します。I /Oイベントを時間であり、対応する割り込みハンドラが場合に起動されますプロセスがこのI /Oイベントを待っているとき、プロセスはwaitプロセスを起動し、現在実行中のプロセスのneed_reschedフラグを設定するので、割り込みハンドラが戻ったときにスケジューラが起動してI /Oを待っていることがわかります。イベントのコース(最も可能性が高いが)ので、I /Oイベント(ミリ秒)に比較的迅速な応答を確保し、実行する権利を得ることができます。 I /Oイベントが発生したときに、見ることができるように、処理手順I /Oイベントに関係なくタイムスライススケジューリングシステムの応答速度の長さの、現在のプロセスをプリエンプト。

Copyright © Windowsの知識 All Rights Reserved