回答:
I / Oは、プロセスによって呼び出されるシステムコールによって処理されます。最終的に、そのようなシステムコールは、実際のI / O操作を実行するために、適切な低レベルのデバイスドライバー関数にまで細流します。
I / Oは注意が必要です。実際にデバイスとの間でデータをやり取りするには、順番に、場合によってはタイミング要件に従って、さまざまな手順に従う必要があります。これらの手順がアトミックに完了していない場合、次にそれらが試行されたときに、デバイスが応答しない、誤動作する、またはシステムがロックアップする可能性があります。これらの手順はデバイスごとに異なり、固有であるため、デバイスドライバーが非常に多いのはなぜですか。
適切に作成されたデバイスドライバーは、サービスを提供しようとしているデバイスの処理方法を知っている必要があるため、ドライバーのバグがないか、デバイスに間違ったドライバーを使用しているか、物理デバイスに障害が発生していない限り、通常、問題は発生しません。
Maurice Bach著の「The UNIX of the Unix Operating Systems」を読んだので、この質問に自分で答えましょう。
つまり、I / Oを割り込み不可能にすることは、I / Oタスクをシグナルに干渉されることなく、できるだけ早く完了することを目的としています。
本から得たいくつかの関連知識:
カーネル内の一部のコードパスは、割り込み不能とマークされています。これは、ほとんどの場合、コードが(デバイスに応答するために)厳密なタイミングに準拠する必要があるか、干渉を認めない何かを実行しているためです。Linuxの場合、前者のほとんどは独立したカーネル内のトレッドに押し出されており、2番目のものはほとんど根絶されています(現在のマルチCPUマシンからの圧力がほとんどかかっていると思います)。つまり、無停電睡眠のプロセスを見たことがないのは、しばらく前のことです。
write(2)
早期に戻ることが許可されており、書き込まれた実際のバイト数を返します。これは、3番目の引数として渡されたバッファー長よりも短くなる場合があります。