システムコールとは?アプリがOSに機能を頼むための窓口

公開: 更新: カテゴリ: テクノロジ系

30秒で結論

システムコールとは(全体像)

システムコールは、アプリがOSの機能を使いたいときに呼ぶ、決められた頼み方のこと。アプリは自分でハードウェアをさわれないので、OSに「ファイルを開いて」「メモリをちょうだい」とお願いする。この頼み口がシステムコールだ。

身近にたとえると、会社の総務部への依頼だ。社員(アプリ)が「資料がほしい」と思っても、自分で金庫を開けず、受付(ライブラリ)→総務部(システムコール)を通して頼む。総務部が金庫(ハードウェア)から取り出して渡す。

押さえるのは、OSの機能はすべてシステムコールを通して使う、ということ。


詳しく:呼び出しの階層とPOSIX・Win32だけ覚えれば戦える

ここが記事の心臓部。まず代表的なシステムコールを見ましょう。

代表的なシステムコール

系統代表用途
実行制御fork・exec・waitプロセスを作る・動かす
ファイルI/Oopen・read・write・closeファイルの読み書き
メモリmmap・brkメモリの確保
ネットワークsocket・send・recv通信

これらを組み合わせて、ほぼすべてのOS機能が表せます。

次に、アプリがシステムコールを呼ぶときの順番(階層)です。

呼び出しの階層

何をするか
①アプリ`fopen`などの便利な関数を呼ぶ
②ライブラリ(libc)中でシステムコールを呼ぶ“包み紙”
③システムコールOSへ機能を要求し、カーネルモードへ切り替え
④カーネル実際の処理を行う

ここで取り違えやすいのが「ライブラリ関数=システムコール」という誤解です。ライブラリ関数はシステムコールを包んだもの(ラッパー)で、別物です。たとえば`printf`は、中で`write`というシステムコールを呼んでいます。

最後に、システムコールの標準規格。Unix系のPOSIXと、WindowsのWin32 APIがあり、これも取り違えやすいポイントです。

POSIXとWin32

規格対象
POSIXUnix系(Linux・macOSなど)共通の標準
Win32 APIWindows専用(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(システムコールの役割)

📝 オリジナル問題 1 システムコールの役割

システムコールに関する次の記述のうち、正しいものはどれか。

  1. システムコールはアプリがOSに機能を頼む窓口で、ファイル操作などはこれを通して実行する
  2. システムコールはアプリがハードを直接さわるための命令で、OSを通さないものとされている
  3. システムコールは紙に印刷する装置のことで、OSの機能とは無関係なものとされているのだ
  4. システムコールはOSがアプリに広告を送る機能のことで、機能要求とは関係ないものとされる
テクマスター
テクマスター 解答・解説

解答は 1 ですよ。

システムコールはアプリがOSに機能を頼む窓口で、ファイル操作などはこれを通して行いますね。総務部への依頼のようなものです。

選択肢2の「ハードを直接さわる」、選択肢3の「印刷する装置」、選択肢4の「広告を送る機能」はどれも誤りですよ。

選択肢判定理由
1OSへの機能要求の窓口
2OSを通して操作する
3印刷する装置ではない
4広告を送る機能ではない

オリジナル問題2(ライブラリ関数との関係)

📝 オリジナル問題 2 ライブラリ関数との関係

ライブラリ関数とシステムコールに関する次の記述のうち、正しいものはどれか。

  1. ライブラリ関数とシステムコールはまったく同じもので、階層の違いはないものとされている
  2. ライブラリ関数はシステムコールを包んだもので、printfは中でwriteを呼んでいる
  3. ライブラリ関数はシステムコールより下の層にあり、カーネルが直接呼ぶものとされているのだ
  4. ライブラリ関数は紙に印刷する手順のことで、システムコールとは無関係なものとされている
テクマスター
テクマスター 解答・解説

解答は 2 ですよ。

ライブラリ関数はシステムコールを包んだもので、printfは中でwriteのシステムコールを呼びますね。両者は別物の階層です。

選択肢1の「同じもの」、選択肢3の「下の層でカーネルが呼ぶ」、選択肢4の「印刷する手順」はどれも誤りですよ。

選択肢判定理由
1階層が違う別物
2ライブラリはsyscallの包み紙
3ライブラリはアプリ側の上の層
4印刷する手順ではない

オリジナル問題3(POSIXとWin32)

📝 オリジナル問題 3 POSIXとWin32

POSIXとWin32 APIに関する次の記述のうち、正しいものはどれか。

  1. POSIXもWin32もまったく同じ規格で、WindowsアプリはそのままLinuxで動くものとされる
  2. POSIXはWindows専用の規格で、Win32はUnix系共通の規格だとされているものだ
  3. POSIXはUnix系共通の標準、Win32 APIはWindows専用で、両者は別系統の規格である
  4. POSIXもWin32も紙に印刷する装置のことで、OSの規格とは無関係なものとされているものだ
テクマスター
テクマスター 解答・解説

解答は 3 ですよ。

POSIXはUnix系共通の標準、Win32 APIはWindows専用で、両者は別系統ですね。WindowsアプリはそのままLinuxで動きません。

選択肢1の「同じ規格」、選択肢2のPOSIXとWin32が逆、選択肢4の「印刷する装置」はどれも誤りですよ。

選択肢判定理由
1別系統で互換性なし
2POSIXとWin32の説明が逆
3POSIXはUnix系・Win32はWindows
4印刷する装置ではない

まとめ

押さえどころ

次に学ぶ


執筆: SikakuQuest編集部

勉強は、クエストになった。

資格の勉強を、冒険に変えるRPG学習アプリ

App Storeで見る