2012-03-16 4 views
3
Wait(semaphore sem) {       
    DISABLE_INTS 
    sem.val-- 
    if (sem.val < 0){ 
     add thread to sem.L 
     block(thread) 
    } 
    ENABLE_INTS 

Signal(semaphore sem){ 
    DISABLE_INTS 
    sem.val++ 
    if (sem.val <= 0) { 
     th = remove next 
     thread from sem.L 
     wakeup(th) 
    } 
    ENABLE_INTS 

block(thread)が実行されていない場合、どのように、どこから、いつ戻ってくるのですか?ウェイト/シグナル(セマフォ)実装の擬似コードはどのように「動作しますか」?

に続く割り込みを許可するスレッドはどれですか? block()と呼ばれるthreadは、別のスレッドがwakeup(thread)を呼び出すまで返さないでください。

  • 他のスレッドはどのように実行されますか?
  • スレッドスイッチはどこで正確に行われますか?
+0

このコードはどこから来たのですか? –

+0

講義スライドから... http://web.cecs.pdx.edu/~walpole/class/cs333/fall2006/slides/5.ppt –

答えて

1

block(thread)そのように動作します:

  1. はこの上wakeup(thread)まで待機する(オペレーティングシステムまたは最も単純なケースではビジーウェイトによって提供された)メカニズムを待っているのいくつかの種類を使用します
  2. 割り込みを許可スレッドが呼び出されます。これは、この時点で、threadがその時間をスケジューラに与えることを意味する。
  3. 割り込みを無効にして返します。
+0

待機機構は**原子操作**を使用しています。たとえば、1つのアトミックプロセッサ命令のフラグをチェックする)、割り込みを有効にして作業することができます。 –

0

はい、異なるスレッドから呼び出されたときにDOWN UPとはほとんど有用であるが、あなたが一つのスレッドでこれらを呼び出すことは不可能ではありません - あなたは> 0の値でセマフォ開始した場合、同じスレッドはクリティカルセクションに入り、DOWN(前)とUP(後)の両方を実行できます。セマフォを初期化する値は、一度にクリティカルセクションに入ることができるスレッドの数を示します。これは1(ミューテックス)またはその他の正の数です。

スレッドはどのように作成されますか?これは講義スライドには表示されていません。これは、擬似コードを使用してセマフォがどのように機能するかという原則に過ぎないためです。しかし、アプリケーションでこれらのセマフォをどのように使用するかは、まったく別の話です。

関連する問題