通常、プロセスが利用できないイベントを待機したい場合は、プロセスをスリープ状態にして、後でイベントが発生したときにウェイクアップすることができます。
以下のよく知られたコードは、このタスクを実行します。
while (!events) {
DEFINE_WAIT(wait);
prepare_to_wait(&q, &wait, TASK_INTERRUPTIBLE);
if (!events)
schedule();
finish_wait(&q, &wait);
}
想像プリエンプティブカーネルプロセスAは、プロデューサとプロセスBは、消費者である、二つのプロセスが存在します。プロセスBは上記のコードを実行しており、プロセスAによって生成されたいくつかのデータが有効になるのを待っています。
さて、2つのプロセスの実行パスが以下のようになっていると、プロセスBはウェイクアップのチャンスを失うと思います。
while
ステートメント内のイベントをチェックし、falseを返します。DEFIN_WAIT(wait)
ます。DEFIN_WAIT(wait)
前にいくつかのデータを生成しprepare_to_wait(&q, &wait, TASK_INTERRUPTIBLE);
ます。prepare_to_wait(&q, &wait, TASK_INTERRUPTIBLE);
ます。if (!events)
ます。プロセスBの状態が現在であるため、TASK_INTERRUPTIBLE
CPUに再度スケジュールされることはありません。ですから、プロセスBは決して目覚めないだろうと思います。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加