0

ここに問題があります。各プロセスは異なる状態にある可能性があり、さまざまなイベントによってプロセスが 1 つの状態から別の状態に移行します。これは、状態図を使用して表すことができます。状態図を使用して、サスペンド キュー セマフォの実装方法を説明します。【10点】

私の図は正しいですか、それとも質問を誤解していますか? http://i.imgur.com/dC5RG6o.jpg

サスペンド キュー セマフォは、現在のプロセスがクリティカル セクションを終了したときにブロックを解除するプロセスを (おそらくランダムに) 選択するブロックされたプロセスのリストを保持していると理解しています。したがって、状態図の待機状態です。

pending_queue_semaphore の疑似コード。

struct suspended_queue_semaphore
{
  int count;
  queueType queue;
};
void up(suspended_queue_semaphore s)
{
  if (s.count == 0)
  {
    /* place this process in s.queue /*
    /* block this process */
  }
  else
  {
    s.count = s.count - 1;
  }
}
void down(suspended_queue_semaphore s)
{
  if (s.queue is not empty)
  {
    /* remove a process from s.queue using FIFO */
    /* unblock the process */
  }
  else
  {
    s.count = s.count + 1;
  }
}
4

1 に答える 1

1

プロセスまたはセマフォの状態図であり、どのセマフォについて話しているのか。最も単純なセマフォ: バイナリ セマフォ (つまり、実行できるプロセスは 1 つだけ) で、操作 wait() (共有リソースへのアクセス要求) と signal() (リソースへのアクセス終了) を行います。

プロセスの状態図には、Start 状態と Terminate 状態に加えて、Queued (Q) と Running (R) の 2 つの状態しかありません。状態図は次のようになります。

START = 待ちます。CAN_RUN
CAN_RUN = suspend.QUEUED + run.RUNNING
QUEUED = run.RUNNING
RUNNING = signal.END

セマフォには、Empty と Full の 2 つの状態があります。セマフォの状態図は次のようになります。

開始 = 空
空 = wait.RUN_PROCCESS + RUN_PROCESS
RUN_PROCESS = run.FULL
FULL = signal.EMPTY + wait.SUSPEND_PROCESS
SUSPEND_PROCESS = suspend.FULL

編集:状態図の表記法を修正し (私のプロセス計算がさびれていて申し訳ありませんでした)、内部プロセス CAN_RUN、SUSPEND_PROCESS、および RUN_PROCESS を追加しました。内部メッセージの実行と中断。

説明: プロセスは「待機」メソッドを呼び出し (擬似コードで)、CAN_RUN 状態に移行します。そこから、「実行」または「一時停止」メッセージを受け取るかどうかに基づいて、RUNNING を開始するか、QUEUED になることができます。QUEUED の場合、「run」メッセージを受信すると RUNNING を開始できます。RUNNING の場合は、終了する前に「シグナル」(疑似コードでダウン) を使用します。

セマフォは EMPTY で開始し、'wait' を取得すると RUN_PROCESS に入り、'run' メッセージを発行して FULL になります。FULL になると、さらに「待機」すると SUSPEND_PROCESS 状態になり、プロセスに「サスペンド」が発行されます。「シグナル」が受信されると、EMPTY に戻り、キューが空であるかどうかに基づいて、そこに留まるか、再び RUN_PROCESS に進むことができます (これらの内部状態をモデル化したり、キューをシステムとしてモデル化したりしませんでした。 )

于 2013-05-08T05:13:58.373 に答える