1
マルチコアCPUで以下のケースを考慮してください。簡単にするため、Linuxカーネルに固執してください。OSで2つのI/Oブロックされたプロセスとキーストロークイベント
wait_char()
{
while (1)
{
ch = readchar();
putchar(ch);
}
}
- 私は2つの端子A及びBを開いて、プロセスAおよびプロセスBの両方がブロックされ、キーボードのための待ちI/O待ち行列に入れられ
- 各々が来る割り込みでwait_char()コードを実行します。貸し付けは、Aは、そのキュー
- に先駆けBのある今、私は
- CPUは、当然のことながら、私は、入力されたキーが表示されますカーネルモード
- でキーボード割り込みサービスルーチンを実行し、私のキーボードからのキーを具体的に、端末Bを選択し、入力コンソールにエコー表示されます。
カーネルは、B(I/Oキューの後ろにいた)のためにカーネルはどのように判断しましたか?
私は100%確実ではないと思います。 bashは入力したプログラムに 'fork'と' execv'を行います。子プロセスと親プロセスは 'stdin'と' stdout'を含む 'PD'テーブルのすべてのエントリを共有します。あなたがプログラムAを実行した最初に開いたbashであなたのキーを入力し、そこにあなたの入力をタイプすると、bashは中断し、OSはその入力を処理します。プログラムAとbashだけがその入力を受け取りました。プログラムBではなく、セカンドオープンのbash。 –