Windows system >> Windowsの知識 >  >> Linuxシステムチュートリアル >> LinuxシステムFAQ >> 実現のセマフォのLinuxカーネルソース

実現のセマフォのLinuxカーネルソース

  
        —セマフォ共有リソースを保護するためにスピンロックを使用するLinuxカーネルの同期スピンロックのブログの導入に先立ち、今日は別のLinuxカーネルの同期メカニズム&mdashを導入しました。カーネルにセマフォを使用しては非常に広く共有資源の多様性を保護するために使用されます。セマフォとスピンロックの実装メカニズムは有用性は同じではありませんが、同じではありません。まず、スピンロックとセマフォは、共有リソースへのプロセスの同時アクセス最大数を可能にするためにカウンタを表すために使用されるが、共有カウント値スピンロックは、任意の時間が共有コード領域で実行されている唯一のプロセスが存在することを意味し、1である信号容量は、カウントが1よりも大きい共有させた、すなわち、共有リソースが同時に異なる複数のプロセスへのアクセスを許可され、もちろん、セマフォカウンタも1に設定され、この場合もまた、ミューテックスセマフォと呼ばれます。第二に、短期的なスピンロックを使用中に、操作を完了するために、共有リソースを保護するために使用、プロセスがスリープ状態にできるようにとの切り替えのプロセスはありません。セマフォは、一時的にリソースを共有するために使用買収がスリープ状態にプロセスを失敗した場合、得られないこと、中断することはできませんリソースのみのリリースでプロセスをウェイクアップします。最後に、割り込みサービスルーチンで使用することができ、スピンロック、セマフォが割り込みサービス・ルーチンを使用することはできません、割り込みサービスルーチンは、睡眠のプロセスので、許可されていません。セマフォの基本的な知識がのは、内部のカーネル内のセマフォを実装して見てみましょう、完成説明してきた、紙は、カーネルのバージョンは、Linux-2.6.24で説明しています。カウント、カウント値が共有され、枕木は、現在スリープセマフォに入るのを待っている:セマフォのデータ構造の3つのデータメンバを含む構造体のセマフォを使用して、構造体のセマフォが{; INT枕木と、wait_queue_head_t待つ; atomic_tカウント}
1つのデータ構造プロセスの数は、現在のセマフォ待ちキューを待ちます。 2セマフォが使用するセマフォを使用する前に初期化するために、実際には、単に株式数を設定し、キューを待って、プロセスの睡眠初めの数は0です。このセマフォの使用と実装を説明するためのキー。 APIセマフォ操作:
静的インラインボイドダウン(構造体のセマフォ* SEM)//セマフォを取得し、取得アップ(構造体のセマフォ* SEM)静的インラインボイドをスリープ状態に失敗したセマフォを解放し、ウェイクアップを待つ//セマフォ待ちキューで待機、セマフォ失敗したプロセスは、睡眠を中断されることはありません得るために、値をカウントします。プロセスが解放するセマフォは、キュー内の最初のプロセスを待って目覚めます。ダウン3セマフォ実装3.1(SEM)第一のルック定義関数:
静的インラインボイドダウン(構造体セマフォ* SEM){might_sleep(); __asm__ __volatile __("#アトミックダウン操作する\\ n \\ T" LOCK_PREFIX" /* --sem->カウント* /" JNS 2F \\ n"" \\ tleaの%0、%% EAX \\ n \\ T"" __down_failed \\を呼び出すN""%0 \\ n \\ T"赤緯2:":" + M"(SEM->カウント)::"メモリ", axの);}これは、アセンブリコードの数を含ん%0は、SEM->表すカウント。その最初のSEM->カウントマイナス1、LOCK_PREFIXは、縮小操作がアトミックであることを確認するために、この命令バスロックの実行を表します。マイナス1の後に0以上2に等しい数字を実行した場合、それは__down_failed関数テールに直接スキップし、関数がセマフォを取得成功を返し、保存又は1台のSEM->の後、カウントが実行順序0未満であります後から機能を__down_failed。その後__down_failed関数の定義を見て:
ENTRY(__ down_failed)CFI_STARTPROCのFRAME PUSHL%EDX CFI_ADJUST_CFA_OFFSET 4 CFI_REL_OFFSET EDX、0 PUSHL%ECX CFI_ADJUST_CFA_OFFSET 4 CFI_REL_OFFSET ECX、0コール__down POPL%ECX CFI_ADJUST_CFA_OFFSET -4 CFI_RESTORE ECX POPL%EDX CFI_ADJUST_CFA_OFFSET -4 CFI_RESTORE EDX eNDFRAME RET CFI_ENDPROC END(__ down_failed)PUSHL POPLとレジスタを保存および復元するための、命令アラインメント調整用CFIプレフィックス命令。一見、次のフォーカス機能__down、関数の定義:
fastcall無効__sched __down(構造体のセマフォ* SEM){構造体task_structの*のTSK =現在、DECLARE_WAITQUEUE(TSK、待つ); unsigned long型のフラグ。tsk->状態= TASK_UNINTERRUPTIBLE; spin_lock_irqsave(& SEM-> wait.lock、フラグ); add_wait_queue_exclusive_locked(& SEM->待って、&待つ); SEM->枕木++;(;;){int型の枕木のため= SEM - >枕木; /* *追加"他のみんな"私たちはwait_queue_head *でスピンロックを所有しているため、それに彼らは、*演奏ではありません* /(atomic_add_negative(枕木の場合 - 1、&!... SEM->))カウント{SEM->枕木= 0;ブレーク;} SEM->枕木= 1; /*米国 - 参照-1上記* /spin_unlock_irqrestoreを(& SEM-> wait.lock、フラグ);スケジュール(); spin_lock_irqsave(& SEM-> wait.lock、フラグ); tsk->状態= TASK_UNINTERRUPTIBLE;} remove_wait_queue _locked(AMP&; SEM->待って、&待つ); wake_up_locked(& SEM->待つ); spin_unlock_irqrestore(& SEM-> wait.lock、フラグ); tsk->状態= TASK_RUNNING;}
Copyright © Windowsの知識 All Rights Reserved