I/Oを中断せずにする原理は何ですか? I / Oを処理するプロセスが信号を処理することを許可されている場合、否定的な結果は何ですか?
答え1
すべてのI / Oは、プロセスによって呼び出されるシステムコールによって処理されます。結局のところ、これらのシステムコールは、実際のI / O操作を実行するために適切な低レベルのデバイスドライバ機能に流れます。
I/O はトリッキーかもしれません。実際にデバイスからデータを移動するには、様々なステップを順次実行する必要があり、タイミング要件が適用されることがある。これらの手順が自動的に完了しない場合は、次の手順を試してもデバイスが応答しなくなったり、予期せず動作したり、システムがロックされたりする可能性があります。これらの手順はデバイスごとに異なり、一意であるため、デバイスドライバが多すぎます。
よく書かれたデバイスドライバはサービスしたいデバイスを処理する方法を知る必要があるため、ドライバのバグがあるか、誤ったデバイスドライバを使用するか、物理デバイスにエラーが発生しない限り、通常は問題は発生しません。
答え2
今私はMaurice Bachの本「The Design of the Unix Operating System」を読んだので、この質問に自分で答えてみましょう。
つまり、I/O を中断できないようにすることは、信号干渉なしに I/O 操作をできるだけ早く完了できるようにすることです。
本から得たいくつかの関連知識は次のとおりです。
- 「絶え間ない」という言葉は、「絶え間ない睡眠」を意味しなければなりません。プロセスが中断せずにスリープモードになっていると、信号に目を覚ますことができず、信号を処理することもできません。
- プロセスは、次の場合に信号を処理します。カーネルモードで実行しており、ユーザーモードに戻ろうとしています。 b。睡眠が中断したら、睡眠状態に入って出ようとします。
- 信号によって睡眠プロセスが目覚めた場合はどうなりますか?信号を処理し、デフォルトの動作はプロセスを終了することです。プロセスがI / Oが完了するのを待っている場合、プロセスが早期に終了することを望まないでしょう。
答え3
カーネルの特定のコードパスは、コードが厳密なタイミング(デバイスへの応答)に準拠する必要があるか、干渉を許可しない操作を実行するため、中断不可能としてマークされます。 Linuxに関する限り、前者のほとんどは別々のカーネルスレッドにプッシュされ、後者のほとんどは削除されました(主に現在のマルチCPUシステムの圧迫のため)。言い換えれば、邪魔にならない睡眠過程を見たのはかなり古いです。