FE EXAM

システムコール(OS機能の呼び出し)

アプリケーションがOSのカーネル機能を呼び出すための仕組み。

INTERACTIVE VISUALIZATION
ユーザモード
カーネルモード
フェーズ
idle
動作モード
ユーザ
状態
通常実行
シナリオ
ステップ1 / 6
STEP 1/6アプリが通常実行中(ユーザモード)アプリ(=アプリケーション、利用者が動かすプログラム)はふだん「ユーザモード」で動いています。ユーザモードとは、勝手にハードウェアをいじれないよう権限が制限された状態のことです。この状態では計算など自分でできる処理だけを行います。
ユーザモード(権限制限)カーネルモード(特権)アプリケーション計算など自分でできる処理カーネル(OSの中核)特権が必要な処理ハードウェア(ディスク等)
解説

📌
システムコールとは

アプリOS(カーネル)依頼

システムコールとは、アプリ(=アプリケーション、利用者が動かすプログラム)が、自分ではできない特権操作(ファイル・デバイス・メモリの操作など)をOS(=オペレーティングシステム、基本ソフト)に依頼する仕組みのことです。

身近な例で考えると、レストランで注文するのに似ています。客(アプリ)は厨房に勝手に入って料理できませんが、店員(OS)に注文すれば作ってもらえます。危険な操作や共有資源(ファイルなど)は、責任をもつOSに任せるのです。

上のツールで▶ボタンを押すと、アプリがシステムコールを発行し、OSが処理して結果を返すまでの流れを順番に確認できます。

🔄
モード切替の仕組み

ユーザカーネルユーザ処理が終わると戻る

CPU(=中央処理装置、計算の中心)には2つの動作モードがあります。それぞれの役割は次のとおりです。
ユーザモード:権限が制限された状態。ふだんアプリはこのモードで動き、ハードウェアを勝手に操作できません
カーネルモード:特権を持った状態。OSの中核(カーネル)だけがこのモードでハードウェアを直接操作できます

システムコールを発行すると、CPUはユーザモードからカーネルモードへ切り替わり、OSが処理を行います。処理が終わるとまたユーザモードへ戻り、アプリは続きを実行します。

この仕組みがあるおかげで、アプリのバグや悪意あるプログラムがあっても、いきなりハードウェアを壊したりはできません。特権が必要な操作は必ずOSを経由させることで、システム全体を守っているのです。上のツールのモード境界線をまたぐ矢印で、この切替を確認できます。

📋
代表例

ファイルopen/read/writeプロセスforkメモリ確保通信ネットワークOSに依頼する操作の例

システムコールが使われる代表的な操作には、次のようなものがあります。いずれもアプリ単独ではできず、OSに依頼する必要がある処理です。
ファイルのopen/read/write:ファイルを開く・読む・書く操作
プロセス生成(fork):新しいプログラムの実行単位を作る操作
メモリ確保:プログラムが使う記憶領域をOSから受け取る操作
ネットワーク通信:他のコンピュータとデータをやり取りする操作

逆に、変数どうしの足し算のような自分だけで完結する計算には、システムコールは要りません。アプリはユーザモードのまま自由に計算できます。「外の資源(ファイル・デバイス・他のプログラム)に手を伸ばすときだけOSにお願いする」と覚えると分かりやすいです。

📌
なぜモードを分けるのか

ユーザモード(制限あり)アプリが動く領域。ハードウェアを直接触れないシステムコールで越える壁カーネルモード(特権)OSだけが入れる領域。ハードウェアを直接制御

なぜアプリがハードウェアを直接触れないようにするのか。理由はシステム全体の安全を守るためです。もしアプリが自由にハードウェア(ディスクやメモリなど)を操作できると、次のような問題が起きます。
・バグのあるアプリが他のアプリのデータを誤って書き換える
・悪意あるプログラムがパスワードなどの重要データを盗む
・ハードウェアを壊す操作をしてシステム全体がクラッシュする

そこで、危険な操作は必ず責任をもつOS(カーネル)だけが行うようにしました。アプリは「こうしてほしい」とシステムコールでお願いするだけで、カーネルが代わりに安全に実行して結果を返します。建物でいえば、電気や水道の工事はプロの業者(カーネル)しか手を触れられないようにして、住人(アプリ)は「使いたい」と伝えるだけにする、というイメージです。

📌
システムコールの流れを整理

①アプリが要求②システムコール発行③カーネルモードへ④OS処理⑤結果を返す①〜⑤で1回のシステムコールが完結する

システムコールが発生してから戻るまでの流れを5ステップで整理します。上のツールの▶ボタンで同じ流れを動かして確認できます。
①アプリが処理を必要とする(例:ファイルを読みたい)
②システムコールを発行する(OSへ「ファイルを開いて」と依頼)
③CPUがカーネルモードに切り替わる(アプリのコードを一時停止)
④OSが処理を実行する(ファイルを実際に開く、ハードウェアを制御)
⑤結果を受け取り、ユーザモードに戻る(アプリがファイルの中身を得る)

この一連の流れで重要なのは、アプリは待っているだけで、危険な操作はすべてOSが肩代わりしている点です。また、モードの切り替えには少し時間がかかるため、システムコールの回数をなるべく減らすことが処理を速くするコツになります。

練習問題

🎯
基本情報技術者 練習問題

Q1.システムコールの説明として最も適切なものはどれか。
A.アプリがOSのカーネル機能を呼び出すための仕組み
B.複数のCPUを束ねて高速化する仕組み
C.プログラムを機械語に変換する仕組み
D.ネットワーク上の機器に名前を付ける仕組み
Q2.システムコールを発行したときのCPUの動作モードの変化として正しいものはどれか。
A.カーネルモードからユーザモードへ切り替わる
B.ユーザモードからカーネルモードへ切り替わり、処理後にユーザモードへ戻る
C.ユーザモードのまま変化しない
D.カーネルモードのまま変化しない
Q3.システムコールが使われる処理の例として適切でないものはどれか。
A.ファイルのopen/read/write
B.プロセスの生成(fork)
C.メモリの確保
D.変数どうしの足し算

関連コンテンツ