2017-02-14 3 views
1

マルチコアCPUで以下のケースを考慮してください。簡単にするため、Linuxカーネルに固執してください。OSで2つのI/Oブロックされたプロセスとキーストロークイベント

wait_char() 
{ 
    while (1) 
    { 
     ch = readchar(); 
     putchar(ch); 
    } 
} 
  1. 私は2つの端子A及びBを開いて、プロセスAおよびプロセスBの両方がブロックされ、キーボードのための待ちI/O待ち行列に入れられ
  2. 各々が来る割り込みでwait_char()コードを実行します。貸し付けは、Aは、そのキュー
  3. に先駆けBのある今、私は
  4. CPUは、当然のことながら、私は、入力されたキーが表示されますカーネルモード
  5. でキーボード割り込みサービスルーチンを実行し、私のキーボードからのキーを具体的に、端末Bを選択し、入力コンソールにエコー表示されます。

カーネルは、B(I/Oキューの後ろにいた)のためにカーネルはどのように判断しましたか?

+0

私は100%確実ではないと思います。 bashは入力したプログラムに 'fork'と' execv'を行います。子プロセスと親プロセスは 'stdin'と' stdout'を含む 'PD'テーブルのすべてのエントリを共有します。あなたがプログラムAを実行した最初に開いたbashであなたのキーを入力し、そこにあなたの入力をタイプすると、bashは中断し、OSはその入力を処理します。プログラムAとbashだけがその入力を受け取りました。プログラムBではなく、セカンドオープンのbash。 –

答えて

0

プロセスがI/Oを待っているキューにありません。ターミナルBに何かを入力すると、デバイスドライバはターミナルBからのものであることを認識します。デバイスが割り込みを引き起こす可能性があります。 OSはターミナルBで保留中の読み取り要求を持っている人にデータを送信します。

ターミナルBから読み取るプロセスが2つあった場合は、その情報を取得するのはランダムです。

関連する問題