PR

Part2では,プロセス管理,メモリー管理など,OSのカーネルが持つ主な基本機能について解説していこう。

 コンピュータシステムはハードウエアとソフトウエアで構成され,ソフトウエアは応用(アプリケーション)ソフトウエアとシステムソフトウエアで構成される。そして,システムソフトウエアは,基本ソフトウエアとミドルウエアで構成される。ミドルウエアは,基本ソフトウエアとアプリケーションソフトウエアの中間的な性格を持つソフトウエアで,基本ソフトウエアよりも高機能のサービスを提供する。データベース管理システム(DBMS)がその代表例だ。

 基本ソフトウエアには,(1)カーネル,(2)言語プロセッサ,(3)ユーティリティが含まれ,これを「広義のOS」と呼ぶ(図1)。最近のクライアントではデスクトップ環境の利用が前提となっているので,広義のOSにはウインドウシステムも必須となっている(米MicrosoftのWindowsではウインドウシステムがカーネルと一体化している)。

図1●ソフトウエアの分類
図1●ソフトウエアの分類

 ここで,カーネルとは「OSの中核部分」のことであり,「制御プログラム」と呼ぶこともある。これが「狭義のOS」である。

 カーネルは,アプリケーションソフトウエアとは異なり,すべてのハードウエアにアクセスできる。いわば,システムの全権を委任された状態で動作している。このため,カーネルはプロセッサを「特権モード」(プロセッサの操作に全く制限がない状態)に設定して,実行される。

 これに対して,カーネルの支配下で動くアプリケーションソフトウエアは,通常のモード,すなわち「ユーザーモード」(プロセッサの一部の操作が制限される状態)で実行され,ハードウエアへの直接アクセスは許されない。アプリケーションソフトウエアがハードウエアにアクセスしたい場合には,カーネルに処理を委託する。

 リーナス・トーバルズ氏が開発したLinuxは「カーネル」であり,これだけではユーザーが利用するアプリケーションソフトウエアを動かすことはできない。我々が日常利用しているOSとしての「Linux」は,GNUプロジェクトなどが提供する言語プロセッサ(プログラミング言語のコンパイラやインタプリタ)やユーティリティ(エディタやディスク圧縮ソフトなど),ウインドウシステムといったソフトウエアを添付した「ディストリビューション」が該当し,これは「広義のOS」に当たる。

 以下では,狭義のOS(カーネル)の基本的な機能を紹介しよう。

プログラムの実行単位を管理する

 1つ目の基本機能は,プロセス管理だ。

 「プロセス」とはOSから見たプログラムの実行単位のことであり,同義語として「タスク」がある。さらに,「スレッド」という用語もあり,こちらも同じくプログラムの実行単位だ。スレッドは,プロセスをより小さな処理単位にしたもので,その分,処理の切り替えを簡便に行えるという利点がある。プロセスは1つ以上のスレッドで構成される。本講座では,OSからみたプログラムの実行単位を表す用語として主に「プロセス」を用いる。

 プロセス管理で最も重要な機能が,複数のプログラムを同時並行的に実行する機能である。これを,マルチタスク(あるいはマルチプログラミング)と呼ぶ(1つのプログラムしか実行できないOSをシングルタスクと呼ぶ,図2)。

図2●マルチタスク(マルチプログラミング)
図2●マルチタスク(マルチプログラミング)
1つのプロセッサ上で,複数のプログラムを切り替えて実行する

 プロセッサは常に1つのプログラムしか実行できないため,マルチタスクでは,複数のプログラムを切り替えて実行しなければならない。このプログラムの切り替え方式には,「プリエンプティブ方式」と「ノンプリエンプティブ方式」がある。

 プリエンプティブ方式は,OSがプロセッサの実行権限を管理し,プロセスの実行を切り替える方式である。現在のOSは,プリエンプティブ方式が主流だ。

 一方ノンプリエンプティブ方式(「擬似マルチタスク方式」とも呼ぶ)は,プロセスの切り替えをプログラム自身に任せる方式である。ただし,ノンプリエンプティブ方式では,あるプログラムがプロセッサを長時間占有することも可能で,この場合はシングルタスクと同じになってしまう。昔のMac OSやWindows 3.1は,ノンプリエンプティブ方式である。

 現在ではIntelやAMDから1つのパッケージに2個以上のプロセッサを搭載するマルチコアプロセッサが出荷されている。例えば,2個のプロセッサを搭載したマルチコアプロセッサのシステムで,かつOSのプロセス管理が複数プロセッサでの実行に対応していれば,2つのプロセスを完全に同時実行できることになり,かなりの性能向上が期待できる。なお,以下ではシングルコアプロセッサを前提に話を進めることにする。