萌えハッカーニュースリーダー

2025/06/03 16:45 Technical Guide to System Calls: Implementation and Signal Handling in Modern OS

出典: https://mohitmishra786.github.io/chessman/2025/03/31/Technical-Guide-to-System-Calls-Implementation-and-Signal-Handling-in-Modern-Operating-Systems.html
hakase
博士

やあ、ロボ子。今日はシステムコールについて話すのじゃ。

roboko
ロボ子

システムコールですか、博士。ユーザーアプリケーションとOSカーネルのインターフェースのことですね。

hakase
博士

そうじゃ!システムコールには「高速」と「低速」があるのを知っておるか?

roboko
ロボ子

はい、記事に書いてありました。高速システムコールはすぐに完了できる操作で、低速システムコールは外部イベントを待つ必要がある操作のことですね。

hakase
博士

その通り!例えば、`getpid()`は高速じゃ。プロセスIDを取得するだけだからな。一方、`read()`は低速になることがある。パイプやソケットからの読み込みを待つ必要があるからじゃ。

roboko
ロボ子

`read()`が低速になるのは、外部からのデータが来るのを待つからですね。もしデータが来るまでずっと待つ場合、どうなるんですか?

hakase
博士

良い質問じゃな!そういう時にシグナルが役に立つんじゃ。プロセスが低速システムコールでブロックされている時にシグナルが届くと、カーネルはシステムコールを中断するのじゃ。

roboko
ロボ子

なるほど!シグナルハンドラが実行される機会を与えるんですね。でも、システムコールは中断されたらどうなるんですか?

hakase
博士

`EINTR`というエラーコードを返すのじゃ。プログラムはこのエラーを処理して、コールを再開するかどうかを決定する必要があるぞ。

roboko
ロボ子

記事に`SA_RESTART`フラグについても書かれていました。これを使うと、シグナルハンドラが完了した後、カーネルが自動的にシステムコールを再開してくれるんですね。

hakase
博士

そうじゃ!便利じゃろ?でも、常に`SA_RESTART`を使うのが良いとは限らないぞ。状況によっては、中断されたことを知って、別の処理をしたい場合もあるからな。

roboko
ロボ子

状況に応じて使い分ける必要があるんですね。ところで、ディスクI/Oはどう分類されるんですか?記事には、ユーザー視点からはノンブロッキングに見えるけど、カーネル視点からは低速システムコールだと書いてありました。

hakase
博士

鋭いな、ロボ子!ディスクI/Oは、OSのキャッシュやI/Oスケジューリングのおかげで高速化されているけど、本質的には低速システムコールなんじゃ。カーネルはディスクドライバが操作を完了するのを待つ必要があるからな。

roboko
ロボ子

なるほど。I/O処理の進化についても書かれていましたね。ブロッキングI/Oから始まって、非同期I/OやI/O Uringまであるんですね。

hakase
博士

そうじゃ!`select()`、`poll()`、`epoll()`などのI/O多重化も重要じゃぞ。これらを使うと、複数のファイルディスクリプタを監視して、準備ができたものだけを処理できるんじゃ。

roboko
ロボ子

応答性の高いアプリケーションを作るには、ノンブロッキングI/Oを検討すべきと記事にありました。アプリケーションのニーズに合わせてI/Oパラダイムを選ぶのが大切ですね。

hakase
博士

その通り!最後に実践的なアドバイスじゃ。低速システムコールからの`EINTR`リターンを常にチェックして処理すること。そして、シグナルハンドラを登録するときは、必要に応じて`SA_RESTART`を使うことじゃ。

roboko
ロボ子

勉強になりました、博士!

hakase
博士

ところでロボ子、システムコールって、まるで忍者の合言葉みたいじゃな。カーネルに「エイヤ!」ってお願いする感じじゃ。

roboko
ロボ子

博士、それちょっと違います…。

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search