アプリケーションがOSのカーネル機能を呼び出すための仕組み。
システムコールとは、アプリ(=アプリケーション、利用者が動かすプログラム)が、自分ではできない特権操作(ファイル・デバイス・メモリの操作など)をOS(=オペレーティングシステム、基本ソフト)に依頼する仕組みのことです。
身近な例で考えると、レストランで注文するのに似ています。客(アプリ)は厨房に勝手に入って料理できませんが、店員(OS)に注文すれば作ってもらえます。危険な操作や共有資源(ファイルなど)は、責任をもつOSに任せるのです。
上のツールで▶ボタンを押すと、アプリがシステムコールを発行し、OSが処理して結果を返すまでの流れを順番に確認できます。
CPU(=中央処理装置、計算の中心)には2つの動作モードがあります。それぞれの役割は次のとおりです。
・ユーザモード:権限が制限された状態。ふだんアプリはこのモードで動き、ハードウェアを勝手に操作できません
・カーネルモード:特権を持った状態。OSの中核(カーネル)だけがこのモードでハードウェアを直接操作できます
システムコールを発行すると、CPUはユーザモードからカーネルモードへ切り替わり、OSが処理を行います。処理が終わるとまたユーザモードへ戻り、アプリは続きを実行します。
この仕組みがあるおかげで、アプリのバグや悪意あるプログラムがあっても、いきなりハードウェアを壊したりはできません。特権が必要な操作は必ずOSを経由させることで、システム全体を守っているのです。上のツールのモード境界線をまたぐ矢印で、この切替を確認できます。
システムコールが使われる代表的な操作には、次のようなものがあります。いずれもアプリ単独ではできず、OSに依頼する必要がある処理です。
・ファイルのopen/read/write:ファイルを開く・読む・書く操作
・プロセス生成(fork):新しいプログラムの実行単位を作る操作
・メモリ確保:プログラムが使う記憶領域をOSから受け取る操作
・ネットワーク通信:他のコンピュータとデータをやり取りする操作
逆に、変数どうしの足し算のような自分だけで完結する計算には、システムコールは要りません。アプリはユーザモードのまま自由に計算できます。「外の資源(ファイル・デバイス・他のプログラム)に手を伸ばすときだけOSにお願いする」と覚えると分かりやすいです。
なぜアプリがハードウェアを直接触れないようにするのか。理由はシステム全体の安全を守るためです。もしアプリが自由にハードウェア(ディスクやメモリなど)を操作できると、次のような問題が起きます。
・バグのあるアプリが他のアプリのデータを誤って書き換える
・悪意あるプログラムがパスワードなどの重要データを盗む
・ハードウェアを壊す操作をしてシステム全体がクラッシュする
そこで、危険な操作は必ず責任をもつOS(カーネル)だけが行うようにしました。アプリは「こうしてほしい」とシステムコールでお願いするだけで、カーネルが代わりに安全に実行して結果を返します。建物でいえば、電気や水道の工事はプロの業者(カーネル)しか手を触れられないようにして、住人(アプリ)は「使いたい」と伝えるだけにする、というイメージです。
システムコールが発生してから戻るまでの流れを5ステップで整理します。上のツールの▶ボタンで同じ流れを動かして確認できます。
・①アプリが処理を必要とする(例:ファイルを読みたい)
・②システムコールを発行する(OSへ「ファイルを開いて」と依頼)
・③CPUがカーネルモードに切り替わる(アプリのコードを一時停止)
・④OSが処理を実行する(ファイルを実際に開く、ハードウェアを制御)
・⑤結果を受け取り、ユーザモードに戻る(アプリがファイルの中身を得る)
この一連の流れで重要なのは、アプリは待っているだけで、危険な操作はすべてOSが肩代わりしている点です。また、モードの切り替えには少し時間がかかるため、システムコールの回数をなるべく減らすことが処理を速くするコツになります。