【しすてむこーる】

システムコール とは?

最終更新:
💡 アプリケーションから、カーネルへ処理を頼む入口

アプリケーションがOSのカーネルへ処理を要求する仕組み。Linuxでは、ファイルの読み書きなどをライブラリの関数経由で呼び出すことが多い。通常の関数呼び出し全てがシステムコールになるわけではなく、ユーザー空間だけで済む処理とも区別する。

📌 このページのポイント
カーネルへ処理を頼み、結果を受け取る ユーザー空間:アプリ・ライブラリ アプリ readなどの関数 カーネル空間:OSの処理 ファイル操作など 呼び出し 結果を返す 通常の関数全てが、この境界を越えるわけではない
Linuxでファイルの読み取りを要求する例。呼び出しでカーネルに入り、結果を返す。mallocの割り当てやvDSOの時刻取得など、利用側で済む処理もある。
ひよこ ひよこ
アプリがOSに頼むってこと?
ペンギン先生 ペンギン先生
例えばLinuxでは、アプリがファイルを読むためにライブラリの関数を呼び、その先でカーネルへ読み取りを要求するよ。カーネルへ入って処理を頼む仕組みがシステムコールなんだ。
ひよこ ひよこ
普通の関数と何が違う?
ペンギン先生 ペンギン先生
通常の関数はユーザー空間の中だけで処理できることもあるよ。システムコールはカーネルで処理する入口を使う。ライブラリが必要な引数などを準備するため、プログラム側では普通の関数呼び出しのように見える場合があるんだ。
ひよこ ひよこ
メモリを確保するたびに呼ぶ?
ペンギン先生 ペンギン先生
必ずではないよ。例えばLinuxのglibcのmallocは、必要に応じてカーネルから領域を得るけれど、得た領域をライブラリ側で管理して割り当てる。mallocの呼び出しとシステムコールが毎回一対一になるとは考えないようにしよう。
ひよこ ひよこ
時刻取得も毎回カーネルへ入る?
ペンギン先生 ペンギン先生
Linuxでは、gettimeofdayなどの処理をvDSOの関数で済ませられる場合があるよ。カーネルが利用側へ公開した情報を使う通常の関数呼び出しになるので、その場合はカーネルへ入るシステムコール自体を避けられるんだ。
ひよこ ひよこ
どんな呼び出しか調べられる?
ペンギン先生 ペンギン先生
Linuxのstraceは、プロセスとカーネルのやり取りを調べる道具だよ。システムコールの回数や結果を確認できる。ただし、vDSOで済んだ処理はそのシステムコールとして現れない。記録だけで全ての関数呼び出しを見たとは考えないようにしよう。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「システムコール」って出てきたら「アプリケーションから、カーネルへ処理を頼む入口」と思えばだいたいOK!
📖 おまけ:英語の意味
「System Call」 = システムへの呼び出し
💬 OSのカーネルへ処理を要求する呼び出しを表す名前だよ。ソースコードに見える関数名と、実際にカーネルへ渡されるシステムコールが同じ形とは限らないんだ。

参考資料

← 用語集にもどる