遅いシステムコールと速いシステムコールの違い


13

遅いシステムコールと速いシステムコールの違いは何ですか?プロセスがいくつかのシグナルをキャッチすると、遅いシステムコールがブロックされる可能性があることを学びました。キャッチされたシグナルはブロックされたシステムコールを呼び起こすことがありますが、このメカニズムを正確に理解することはできません。どんな例でも歓迎されます。

回答:


19

実際、システムコールには3つの段階があります。

  1. 一部のシステムコールはすぐに戻ります。「ただちに」とは、必要なのはわずかなプロセッサ時間だけであることを意味します。(リアルタイムシステムを除く)所要時間に厳しい制限はありませんが、これらの呼び出しは、十分に長くスケジュールされたらすぐに戻ります。
    これらの呼び出しは通常、ノンブロッキングと呼ばれます。非ブロッキング呼び出しの例としては、以下のようなだけで、システムの状態のビットを読み、またはシステム状態に簡単な変更を加える呼び出し、あるgetpidgettimeofdaygetuidまたはsetuid。一部のシステムコールは、状況に応じてブロックまたは非ブロックになります。たとえばread、ファイルがパイプまたは非ブロッキング読み取りをサポートする他のタイプであり、O_NONBLOCKフラグが設定されている場合はブロックしません。
  2. いくつかのシステムコールは完了するまでに時間がかかる場合がありますが、永久にではありません。典型的な例はsleepです。
  3. 一部のシステムコールは、外部イベントが発生するまで戻りません。これらの呼び出しはブロックしていると言われています。たとえばread、ブロッキングファイル記述子で呼び出されるのはブロッキングであり、そうですwait

「高速」システムコールと「低速」システムコールの違いは、ノンブロッキングとブロッキングに近いですが、今回はカーネル実装者の観点から見てください。高速システムコールとは、ブロックまたは待機せずに完了できることが知られているシステムコールです。カーネルは、高速のシステムコールに遭遇すると、すぐにシステムコールを実行し、同じプロセスをスケジュールできることを認識します。(非プリエンプティブマルチタスクを使用する一部のオペレーティングシステムでは、高速のシステムコールはプリエンプティブではない場合があります。これは通常のUNIXシステムには当てはまりません。)呼び出しプロセスを一時停止し、別のタスクを実行する準備をする必要があります。

いくつかのケースは少し灰色の領域です。たとえば、(read通常のファイルからの)ディスク読み取りは、別のプロセスを待機していないため、通常は非ブロッキングと見なされます。ディスクを待つだけで、通常は答えるのにほんの少しの時間しかかかりませんが、永遠にはかかりません(したがって、上記のケース2になります)。しかし、カーネルの観点から見ると、プロセスはディスクドライバーが完了するまで待機する必要があるため、間違いなく遅いシステムコールです。


ありがとうございます!しかし、ファイルがパイプの場合、ファイルをブロックしないで読み取りますか?その参照www2.hawaii.edu/~esb/2007spring.ics612/apr10.html
KayKay

「遅い読み取り/書き込み(例えば、パイプまたはターミナル上)」を
意味する-KayKay

@KayKay:パイプの場合、O_NONBLOCKフラグの状態に応じて両方を持つことができます。フラグが設定されている場合、システムコールは他の何も待たずに完了できるため、非ブロッキングであり、カーネルはそれを高速システムコールとして扱うことができます。
ジル 'SO-悪であるのをやめる'

つまり、O_NONBLOCKフラグに依存します!
ケイケイ

3

遅いシステムコールは、TCPソケットread()のようなものです-O_ASYNC(または何でも)が設定されていない場合、それは永遠に待機できます。

高速システムコールはgettimeofday()やgetpid()のようなもので、どちらもカーネルがすぐに利用できるプロセスに情報を返します。

ディスク読み取りは、遅いシステムコールのカテゴリに分類されます。プロセスが真のディスクファイル、ファイル記述子でread()を実行する場合、カーネルは読み取りを満たすために1つ以上のディスクブロックを読み取る必要がある場合があります。基盤となるファイルシステムのディスク上の構造に応じて、これはディスク上のiノードを読み取って「間接ブロック」のディスクブロック番号を取得し、間接ブロックを読み取ってデータブロックを取得してから、データブロック自体を読み取ることを意味する場合があります。少なくともディスクアクセスあたりのCPUサイクルの観点では、かなり時間がかかりますが、今日は古き良き時代よりもひどいでしょう。

私はこれを昔から見ていませんが、古いUnixディスクドライブのデバイスドライバーコードの「下半分」は、ディスク上のファイルシステムの整合性を維持しやすくするために、信号/割り込みをブロックします。場合によっては、バグのあるドライバーや障害のあるディスクが、プロセスが要求したディスクブロックをまったく送信せず、プロセスが永久にスリープすることがありました。-9を殺しても何もしませんでした。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.