Linuxでは,多くのアプリケーション・プログラムを動作させることができます。これらのプログラムは,すべてカーネルのコントロール下で動作しています。今回から2回にわたって,カーネルがどのようにアプリケーション・プログラムをコントロールしているのかを解説します。

マルチタスクOSではプロセス管理が重要になる

 前回解説したように,Linuxカーネルはさまざまな機能を提供しています。代表的な機能の一つがプロセス管理(実行管理)です。

 Linuxは,複数のプログラムを同時に稼働させられるマルチタスクOSです。また,複数のユーザーが同時にシステムにログインして並行して作業できるマルチユーザーOSでもあります。

 マルチユーザーやマルチタスクを実現するには,OS側にさまざまな機能が必要になります。例えば,安全にマルチユーザー環境を提供するために,Linuxのファイルやディレクトリには所有者やアクセス許可属性などの情報が設定されています。ディレクトリやファイルの中を見るには,open()やread()といったシステム・コールを発行する必要があります。システム・コールとは,カーネルに仕事を依頼する特別な手続きです。カーネルは,ユーザー権限をチェックして,アクセス権がないときにはエラーを返します(図1)。アクセス権限を適切に管理することで,他のユーザーの重要なファイルをのぞき見たりする行為を禁止できます。

図1●所有者情報や許可属性でアクセス制御を実現
図1●所有者情報や許可属性でアクセス制御を実現
安全なマルチユーザー環境を提供するために所有者情報などによるアクセス制御機能が提供されています。

 また,マルチユーザー/マルチタスクOSでは,複数のユーザーが同時にプログラムを実行したり,1人のユーザーが同時に複数のプログラムを実行することができるため,これらのプログラムを支障なく並列に実行する仕組みが必須になります。

 1台のコンピュータで複数のプログラムを安全に動作させるには,何をすべきでしょうか。一番考えなければならないのが,他のプログラムの干渉を防ぐことです。例えば,ユーザーが実行するプログラムは予期できない動作をして他のプログラムやシステムを破壊する可能性があります。Linuxカーネルは,さまざまな工夫でプログラム同士の干渉や,システムの破壊を防止しています。

 工夫の一つが,プログラム単位ではなく「プロセス」という単位でプログラムの実行を管理することです。Linuxではユーザーがプログラムを起動すると,その一つひとつが異なるプロセスとして動作します。各プロセスには起動時にユニークな番号(プロセスID)が割り振られ,これを基に管理されます。

 プログラムそのものではなく,プログラムの実行状態であるプロセスという概念を利用するのは,同じプログラムを同時に稼働させても,そのそれぞれを区別して管理できるメリットがあるためです。例えば,ディレクトリのファイルを表示するlsコマンドを,違うディレクトリで2つ同時に動かしてみたとします。同じlsコマンドを起動しているので,プログラム単位で管理するとこの2つを区別できません。しかし,プロセス単位で管理すればプロセスIDにより区別できますから,この2つを干渉しないように実行できます(図2)。

図2●プロセス単位で管理することでプログラムの干渉を避けられる
図2●プロセス単位で管理することでプログラムの干渉を避けられる
同じプログラムを同時に起動しても,それぞれが別のプロセスとして管理されるため,干渉が生じません。

 プロセスを管理するため,Linuxカーネルではさまざまな情報を記録しています。その一つがプロセスIDですが,ほかにも,どのようなプログラムを起動してできたプロセスであるか,どのユーザーが起動したかなどの情報を記録しています。これらの情報はpsコマンド*1で確認できます(図3)。

図3●psコマンドでプロセス管理情報を閲覧できる
図3●psコマンドでプロセス管理情報を閲覧できる
psコマンドの出力から,プロセスIDや起動したユーザーなどの情報を得ることができます。

メモリー領域の区別も必要

 プログラム同士の干渉を避けるには,プロセスを区別するだけでは十分ではありません。プログラム自身やデータを記録するメモリー領域も,プロセスごとにきちんと区別して管理する必要があります。