遅いシステムコールと高速システムコールの違いは何ですか?プロセスがいくつかの信号を捕捉すると、遅いシステムコールがブロックされる可能性があることを理解してください。これは、捕捉された信号がブロックされたシステムコールを起こす可能性があるためです。しかし、このメカニズムを完全に理解することはできません。どんな例でも大いに感謝します。
答え1
実際、システムコールは3つのレベルに分けられます。
- 一部のシステムコールはすぐに返されます。 「即時」は、必要な唯一のことは、わずかなプロセッサ時間だけであることを意味する。支出できる期間には厳しい制限はありません。リアルタイムシステム)、しかし、これらの通話は十分に長い間予約された後に戻ります。
これらの電話はしばしば呼び出されます。非遮断。非ブロック呼び出しの例には、システム状態を少しだけ読み取る呼び出し、または次のようにシステム状態を単純に変更する呼び出しがあります。getpid
、gettimeofday
、getuid
またはsetuid
。たとえば、一部のシステムコールは状況に応じてブロックまたは非ブロック化される可能性があります。read
ファイルが非ブロック読み取りをサポートするパイプまたは他の種類の場合は、ブロックしないでください。O_NONBLOCK
バナー設定しました。 - いくつかのシステムコールは完了するのに時間がかかるかもしれませんが、永遠ではありません。典型的な例は次のとおりです。
sleep
。 - 一部のシステムコールは、特定の外部イベントが発生した後にのみ返されます。このような通貨は次のとおりです。ブロックする。例えば、
read
ブロックファイル記述子への呼び出しはブロックです。wait
。
「高速」システムコールと「遅い」システムコールの違いは、非ブロック対ブロックに近いですが、今回はカーネル実装者の観点から見たものです。クイックシステムコールは、ブロックや待機なしで完了することが知られているシステムコールです。カーネルは、クイックシステムコールに会うとすぐにシステムコールを実行し、同じプロセスをスケジュールできることを知っています。 (一部のオペレーティングシステムでは、非線点型マルチタスク、高速システムコールは非線点型にすることができます。通常のUNIXシステムではそうではありません。 )一方、遅いシステムコールは他のタスクが完了するのを待つ必要があるため、カーネルは呼び出しプロセスを一時停止して他のタスクを実行する準備をする必要があります。
場合によっては少し灰色の領域です。たとえば、通常のファイルでは、ディスクの読み取りは通常、他のプロセスを待たずにディスクをread
待つため、非ブロックと見なされます。一般的に、応答には数分しかかからず、永遠に待つことはありません。 (これは上記の2の場合です)。ただし、カーネルの観点からは、プロセスはディスクドライバが完了するのを待つ必要があるため、これは確かに遅いシステムコールです。
答え2
遅いシステムコールはTCPソケットread()に似ています。 O_ASYNC(またはその他)を設定しないと、永遠に待つことができます。
クイックシステムコールは、カーネルがすぐに使用できる情報をプロセスに返すgettimeofday()またはgetpid()に似ています。
ディスク読み取りは、低速システムコールカテゴリに属します。プロセスが物理ディスクファイル、ファイル記述子に対してread()を実行する場合、カーネルは読み取り要求を満たすために1つ以上のディスクブロックを読み取る必要があります。基本ファイルシステムのディスク構造に応じて、これは「間接ブロック」のディスクブロック番号を取得するためにディスクinodeを読み取り、データブロックを取得するために間接ブロックを読み取り、データブロック自体を読み取ることを意味します。少なくともディスクアクセスあたりのCPUサイクルの観点からはかなり時間がかかり、おそらく以前よりも悪いでしょう。
私はこれが起こっていることを長い間見たことはありませんが、古いUnixディスクドライブデバイスドライバコードの「サブハーフ」は、ディスクファイルシステムの整合性をより簡単に保つために信号/割り込みをブロックします。時には、問題のあるドライバや障害が発生したディスクがプロセスによって要求されたディスクブロックを提供しないため、プロセスが永久にスリープ状態になることがあります。 kill-9も役に立ちません。