I / Oが中断できないのはなぜですか?


11

I / Oを無停止にする理由は何ですか?I / Oを処理するプロセスがシグナルを処理することを許可された場合、どのような悪影響がありますか?


write(2)早期に戻ることが許可されており、書き込まれた実際のバイト数を返します。これは、3番目の引数として渡されたバッファー長よりも短くなる場合があります。
Peter Cordes、2018

回答:


9

I / Oは、プロセスによって呼び出されるシステムコールによって処理されます。最終的に、そのようなシステムコールは、実際のI / O操作を実行するために、適切な低レベルのデバイスドライバー関数にまで細流します。

I / Oは注意が必要です。実際にデバイスとの間でデータをやり取りするには、順番に、場合によってはタイミング要件に従って、さまざまな手順に従う必要があります。これらの手順がアトミックに完了していない場合、次にそれらが試行されたときに、デバイスが応答しない、誤動作する、またはシステムがロックアップする可能性があります。これらの手順はデバイスごとに異なり、固有であるため、デバイスドライバーが非常に多いのはなぜですか。

適切に作成されたデバイスドライバーは、サービスを提供しようとしているデバイスの処理方法を知っている必要があるため、ドライバーのバグがないか、デバイスに間違ったドライバーを使用しているか、物理デバイスに障害が発生していない限り、通常、問題は発生しません。


5

Maurice Bach著の「The UNIX of the Unix Operating Systems」を読んだので、この質問に自分で答えましょう。

つまり、I / Oを割り込み不可能にすることは、I / Oタスクをシグナルに干渉されることなく、できるだけ早く完了することを目的としています。

本から得たいくつかの関連知識:

  1. 「途切れない」という言葉は「途切れない睡眠」を指すべきです。プロセスが割り込み不可能なスリープ状態のとき、シグナルによって起こされることも、シグナルを処理することもできません。
  2. プロセスは次の場合にシグナルを処理します。カーネルモードで実行されており、ユーザーモードに戻ります。b。スリープが中断されると、スリープ状態に入り、スリープ状態から出ようとしています。
  3. スリープ状態のプロセスがシグナルによって起こされるとどうなりますか?シグナルを処理し、デフォルトのアクションはプロセスを終了します。プロセスがI / Oの完了を待っているときは、当然、プロセスが途中で終了することは望ましくありません。

2

カーネル内の一部のコードパスは、割り込み不能とマークされています。これは、ほとんどの場合、コードが(デバイスに応答するために)厳密なタイミングに準拠する必要があるか、干渉を認めない何かを実行しているためです。Linuxの場合、前者のほとんどは独立したカーネル内のトレッドに押し出されており、2番目のものはほとんど根絶されています(現在のマルチCPUマシンからの圧力がほとんどかかっていると思います)。つまり、無停電睡眠のプロセスを見たことがないのは、しばらく前のことです。


3
傷のあるCDを読み取ってみます。
Joshua

1
または、sshfsを使用してマウントし、ネットワークコードを引きます。根底にあるメディア/ストレージが機能しているときでさえ、今日でも途方もない睡眠は起こります。そして、それは通常、対処するお尻の血の痛みです。
Nubarke 2018
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.