このページでは、OSの全体像と、カーネル・デバイスドライバ・ファイルシステムなどの制御プログラム、カーネルモードとユーザモード、カーネルの作り方の違いがわかります。
- 一言で言うと:
- OS(オペレーティングシステム)が「どんな部品でできていて、どう分担して、どうやって自分の身を守っているか」という話。ソフトウェア分野全体の入口。
OSの全体像(基本ソフトウェア)→ 中核の3部品(制御プログラム)→ OSを守る2つのモード(カーネルモードとユーザモード)→ カーネルの作り方2種
覚え方の軸
- OSは「広い」と「狭い」の2つの意味がある:
- 広義のOS=制御プログラム+言語プロセッサ+サービスプログラム。狭義のOS=制御プログラムだけ
- 制御プログラムは3部品:
- 頭脳(カーネル)、手足(デバイスドライバ)、本棚(ファイルシステム)
- カーネルの仕事は「〇〇管理」で並べる:
- ジョブ管理、タスク管理、記憶管理、割込み管理、入出力管理 + システムコール
- 「大きな単位 → 小さな単位」:
- ジョブ(利用者から見た仕事)→ ジョブステップ → タスク(CPUを割り当てる単位)
- 守りの仕組みは「特権があるか」で分ける:
- カーネルモード(何でもできる)⇔ ユーザモード(危ない命令はできない → システムコールで頼む)
基本ソフトウェアの構成:OSは3つでできている
- 広義のOS(基本ソフトウェア):
- 広い視野でとらえたときの基本ソフトウェア
- 制御プログラム(狭義のOS)を中核に、言語プロセッサとサービスプログラムで構成される
- OS:
- オペレーティングシステム
- 言語プロセッサ:
- プログラムを翻訳するソフトウェア(詳しくは後の「言語処理ツール」)
- サービスプログラム:
- ユーティリティともいう
- 業種や業務に関係なく必要になる処理を行う、実用的なソフトウェア
- 例:
- テキストエディタ、分類併合プログラム、ソートプログラム、ファイル変換プログラム
制御プログラム:OSの本体
- 制御プログラムの3部品:
- カーネル、デバイスドライバ、ファイルシステム
- 応用プログラム → 制御プログラム(カーネル・ファイルシステム・デバイスドライバ)→ 入出力装置、という位置関係
- ファイルシステム:
- 記憶装置の中にファイルを記録する仕組み
- 応用プログラムに、統一的なファイル入出力インタフェースを提供する
- カーネル(kernel):
- 主記憶装置に常駐する制御プログラムのモジュール群
- スーパバイザプログラムともいう
- スケジューリングや資源の割振りなど、すべてのプログラムの実行を制御する。OSの中核
- 主な機能:
- ジョブ管理、タスク管理、記憶管理、割込み管理、入出力管理、応用プログラムへのシステムコールサービス
- ジョブ:
- 利用者から見た仕事の単位。コンピュータで実行される、ひとまとまりの処理
- 構成:
- ジョブ → 1つ以上のジョブステップ → ジョブステップはタスク(またはプロセス)でできている
- ジョブ管理:
- ジョブとジョブステップの実行を監視・制御する
- 機能:
- JCL(ジョブ制御言語)を介してジョブを連続的にスムーズに処理する
- スプーリング
- 複数ジョブのスケジューリング
- 補足:
- ジョブは、ジョブスケジューラを構成するリーダ → イニシエータ → ターミネータ → ライタの順に処理される
- スプーリング:
- 遅い入出力処理と、プログラムの実行を切り離す機能(例:印刷データをいったんディスクにためて、CPUは先に次の仕事をする)
- スループット(単位時間あたりの仕事量)の向上に役立つ
- タスク管理:
- CPUの割当て単位であるタスクを管理する
- 同時に動く複数のタスクに、CPU効率を考えた順番でCPU時間を与える(CPUの有効活用)。詳しくは後述
- 記憶管理:
- プログラムを実行するアドレス空間を管理し、有効活用する。詳しくは後述
- デバイスドライバ:
- 入出力装置を直接操作・管理するプログラム
- 装置に依存した処理をするので、装置の種類ごとに用意される。1つのデバイスドライバで1台または複数台の装置を制御する
- カーネルと入出力装置の間のインタフェース
- 流れ:
- 応用プログラムの入出力要求をカーネルが受け取る → カーネルはデバイスドライバに処理を頼み、すぐに次の処理(他のタスク)にとりかかる
- 補足:
- デバイスドライバをカーネルに組み込むと、新しいデバイスを追加するたびにカーネルのリコンパイルが必要になり、柔軟性に欠ける。そのため、カーネルから独立させている
- プラグアンドプレイ(Plug and Play):
- 新しい周辺装置の接続を検知して、デバイスドライバの組込みや各種設定を自動で行う機能
カーネルモードとユーザモード:OSを壊されないための2つのモード
- 目的:
- あるプログラムが誤ってOSを壊すのを防ぐため、CPUには2つの実行モードがある
- ユーザモード:
- ユーザプログラムの実行を許すモード
- 入出力命令などの特殊命令は実行できない
- カーネルモード(特権モード):
- カーネルだけが実行できるモード
- 入出力命令などの特殊命令(特権命令)を実行できる
- システムコール(スーパバイザコール:SVC):
- ユーザプログラムが、カーネルに処理を頼むための呼出し
- 例:
- ファイルを読み書きしたいとき、ユーザモードでは入出力命令を実行できないので、システムコールを呼ぶ → カーネルは要求の内容とパーミッションを確認してから処理を実行する
- 例え:
- お客さん(ユーザプログラム)は金庫を直接開けられないので、窓口(システムコール)で銀行員(カーネル)に頼む。銀行員は本人確認(パーミッション)をしてから金庫を開ける
- パーミッション:
- あるデータに対する、読み・書き・実行の権限
マイクロカーネルとモノリシックカーネル
| 種類 | カーネルに持たせる機能 | 長所 | 短所 |
|---|---|---|---|
| マイクロカーネル | タスク管理や記憶管理など必要最小限だけ。他の機能はサーバプロセスとして、必要なときに呼び出す | カーネルが小さい。機能ごとに変更しやすい | サービスを実行するたびにプロセスの切替えが多くなる |
| モノリシックカーネル | OSのほとんどすべての機能(monolithic=一枚岩的な) | プロセスの切替えが少ない(処理が高速) | カーネルサイズが大きく、主記憶を有効に使えない。特定の機能だけを変えるのが難しい |
混同しやすいペア
- 広義のOS(制御プログラム+言語プロセッサ+サービスプログラム)/狭義のOS(制御プログラムだけ)
- カーネル(OSの中核。スーパバイザプログラム)/デバイスドライバ(装置ごとの操作プログラム。カーネルから独立)
- ジョブ(利用者から見た仕事)/タスク(CPUを割り当てる単位)
- カーネルモード(特権モード。特殊命令OK)/ユーザモード(特殊命令NG → システムコールで頼む)
- マイクロカーネル(最小限。変更しやすいが切替えが多い)/モノリシックカーネル(全部入り。速いが大きく変えにくい)
- スプーリング(遅い入出力と実行を切り離す)/プラグアンドプレイ(装置の追加を自動で設定する)