システムコールとは(全体像)
システムコールは、アプリがOSの機能を使いたいときに呼ぶ、決められた頼み方のこと。アプリは自分でハードウェアをさわれないので、OSに「ファイルを開いて」「メモリをちょうだい」とお願いする。この頼み口がシステムコールだ。
身近にたとえると、会社の総務部への依頼だ。社員(アプリ)が「資料がほしい」と思っても、自分で金庫を開けず、受付(ライブラリ)→総務部(システムコール)を通して頼む。総務部が金庫(ハードウェア)から取り出して渡す。
押さえるのは、OSの機能はすべてシステムコールを通して使う、ということ。
詳しく:呼び出しの階層とPOSIX・Win32だけ覚えれば戦える
ここが記事の心臓部。まず代表的なシステムコールを見ましょう。
代表的なシステムコール
| 系統 | 代表 | 用途 |
|---|---|---|
| 実行制御 | fork・exec・wait | プロセスを作る・動かす |
| ファイルI/O | open・read・write・close | ファイルの読み書き |
| メモリ | mmap・brk | メモリの確保 |
| ネットワーク | socket・send・recv | 通信 |
これらを組み合わせて、ほぼすべてのOS機能が表せます。
次に、アプリがシステムコールを呼ぶときの順番(階層)です。
呼び出しの階層
| 段 | 何をするか |
|---|---|
| ①アプリ | `fopen`などの便利な関数を呼ぶ |
| ②ライブラリ(libc) | 中でシステムコールを呼ぶ“包み紙” |
| ③システムコール | OSへ機能を要求し、カーネルモードへ切り替え |
| ④カーネル | 実際の処理を行う |
ここで取り違えやすいのが「ライブラリ関数=システムコール」という誤解です。ライブラリ関数はシステムコールを包んだもの(ラッパー)で、別物です。たとえば`printf`は、中で`write`というシステムコールを呼んでいます。
最後に、システムコールの標準規格。Unix系のPOSIXと、WindowsのWin32 APIがあり、これも取り違えやすいポイントです。
POSIXとWin32
| 規格 | 対象 |
|---|---|
| POSIX | Unix系(Linux・macOSなど)共通の標準 |
| Win32 API | Windows専用(POSIXとは別系統) |
POSIXとWin32はまったく別の系統で、WindowsのアプリをそのままLinuxで動かすことはできません。
わかりやすく言い換えると
要するに、総務部のたとえで覚えるとラクです。
①システムコール … 総務部への正式な依頼(OSの機能はすべてこれを通す)
②ライブラリ関数 … 受付の包み紙(中でシステムコールを呼ぶ・システムコールそのものではない)
③POSIXとWin32 … Unix系の標準とWindowsの標準で、別系統
つまり、「OSの機能はシステムコール経由」「ライブラリ関数はその包み紙」、この2点が試験の急所です。
試験のツボ
🔴 一番出る:システムコールはOSへの機能要求の窓口
①アプリは直接ハードをさわれず、システムコールでOSに頼む
②代表 = fork・exec(実行)/open・read・write(ファイル)
🔴 次に出る:ライブラリ関数との関係
①ライブラリ関数はシステムコールを包んだもの(ラッパー)
②`printf`は中で`write`というシステムコールを呼ぶ(別物)
🟡 押さえると安定:POSIXとWin32
①POSIX = Unix系(Linux・macOS)共通の標準
②Win32 API = Windows専用(POSIXとは別系統)
よくある間違い
①「ライブラリ関数とシステムコールは同じもの」→ ✗ ライブラリ関数はシステムコールを包んだもの(ラッパー)。printfは中でwriteを呼ぶ。
②「POSIXとWin32は同じ規格」→ ✗ POSIXはUnix系、Win32はWindows専用で別系統。WindowsアプリはそのままLinuxで動かない。
③「アプリはOSを通さずハードウェアを直接操作できる」→ ✗ アプリは直接さわれない。OSにシステムコールで頼んで操作してもらう。
試験での出題パターン
実際の問題でたしかめてみよう。
オリジナル問題1(システムコールの役割)
システムコールに関する次の記述のうち、正しいものはどれか。
- システムコールはアプリがOSに機能を頼む窓口で、ファイル操作などはこれを通して実行する
- システムコールはアプリがハードを直接さわるための命令で、OSを通さないものとされている
- システムコールは紙に印刷する装置のことで、OSの機能とは無関係なものとされているのだ
- システムコールはOSがアプリに広告を送る機能のことで、機能要求とは関係ないものとされる
解答は 1 ですよ。
システムコールはアプリがOSに機能を頼む窓口で、ファイル操作などはこれを通して行いますね。総務部への依頼のようなものです。
選択肢2の「ハードを直接さわる」、選択肢3の「印刷する装置」、選択肢4の「広告を送る機能」はどれも誤りですよ。
| 選択肢 | 判定 | 理由 |
|---|---|---|
| 1 | ✓ | OSへの機能要求の窓口 |
| 2 | ✗ | OSを通して操作する |
| 3 | ✗ | 印刷する装置ではない |
| 4 | ✗ | 広告を送る機能ではない |
オリジナル問題2(ライブラリ関数との関係)
ライブラリ関数とシステムコールに関する次の記述のうち、正しいものはどれか。
- ライブラリ関数とシステムコールはまったく同じもので、階層の違いはないものとされている
- ライブラリ関数はシステムコールを包んだもので、printfは中でwriteを呼んでいる
- ライブラリ関数はシステムコールより下の層にあり、カーネルが直接呼ぶものとされているのだ
- ライブラリ関数は紙に印刷する手順のことで、システムコールとは無関係なものとされている
解答は 2 ですよ。
ライブラリ関数はシステムコールを包んだもので、printfは中でwriteのシステムコールを呼びますね。両者は別物の階層です。
選択肢1の「同じもの」、選択肢3の「下の層でカーネルが呼ぶ」、選択肢4の「印刷する手順」はどれも誤りですよ。
| 選択肢 | 判定 | 理由 |
|---|---|---|
| 1 | ✗ | 階層が違う別物 |
| 2 | ✓ | ライブラリはsyscallの包み紙 |
| 3 | ✗ | ライブラリはアプリ側の上の層 |
| 4 | ✗ | 印刷する手順ではない |
オリジナル問題3(POSIXとWin32)
POSIXとWin32 APIに関する次の記述のうち、正しいものはどれか。
- POSIXもWin32もまったく同じ規格で、WindowsアプリはそのままLinuxで動くものとされる
- POSIXはWindows専用の規格で、Win32はUnix系共通の規格だとされているものだ
- POSIXはUnix系共通の標準、Win32 APIはWindows専用で、両者は別系統の規格である
- POSIXもWin32も紙に印刷する装置のことで、OSの規格とは無関係なものとされているものだ
解答は 3 ですよ。
POSIXはUnix系共通の標準、Win32 APIはWindows専用で、両者は別系統ですね。WindowsアプリはそのままLinuxで動きません。
選択肢1の「同じ規格」、選択肢2のPOSIXとWin32が逆、選択肢4の「印刷する装置」はどれも誤りですよ。
| 選択肢 | 判定 | 理由 |
|---|---|---|
| 1 | ✗ | 別系統で互換性なし |
| 2 | ✗ | POSIXとWin32の説明が逆 |
| 3 | ✓ | POSIXはUnix系・Win32はWindows |
| 4 | ✗ | 印刷する装置ではない |
まとめ
押さえどころ
- 🔴 システムコール = アプリがOSに機能を頼む窓口。ファイル操作やメモリ確保はすべてこれを通る。
- 🔴 ライブラリ関数との関係 = ライブラリ関数はシステムコールを包んだもの。printfは中でwriteを呼ぶ(別物)。
- 🟡 POSIXとWin32 = POSIXはUnix系共通、Win32はWindows専用。別系統で互換性なし。
次に学ぶ
- カーネルモードとユーザモード ── システムコールのときに切り替わる、CPUの権限のしくみ。
- OS(オペレーティングシステム) ── システムコールを受け取るカーネルを含む、OSの構成と役割。
執筆: SikakuQuest編集部