オペレーティングシステムの基本概念(続き)
マルチユーザシステムにおけるユーザ管理とアクセス制御
マルチユーザシステムでは、各ユーザに個人用のディスク領域が割り当てられ、ファイルの保存やメールの受信に利用されます。この領域は、所有者だけがアクセスできるように保護されており、不正なシステムアプリケーションの悪用によって侵害されないようにする必要があります。
すべてのユーザは、ユーザID(UID) と呼ばれる一意の番号によって識別されます。通常、コンピュータシステムは利用できるユーザを制限しており、ユーザがログインする際には、システムがログイン名とパスワードを要求します。
また、データを他のユーザと共有できるように、各ユーザは 1つ以上のユーザグループ に所属します。グループは、グループID(GID) と呼ばれる一意の番号で識別され、各ファイルも必ず1つ以上のグループに属します。この仕組みにより、ファイルのアクセス権限を次のように設定できます。
- ファイル所有者:読み書き可能
- 同じグループのメンバー:読み取り専用
- その他のユーザ:アクセス不可
これにより、適切な権限管理が可能になります。
ルートユーザとその権限
すべてのUNIX系オペレーティングシステムには、ルート(スーパーユーザ、スーパーバイザとも呼ばれる) という特別な権限を持つユーザが存在します。システム管理者は、ユーザアカウントの管理、システムのバックアップ、プログラムの更新などの管理作業を行うために、ルートユーザとしてログインする必要があります。
ルートユーザは、システム上でほぼすべての操作を実行できます。これは、通常のアクセス制御がルートユーザには適用されないためです。例えば、ルートユーザは以下のような権限を持ちます。
- システム上のすべてのファイルにアクセスできる
- 動作中のすべてのユーザプログラムを制御できる
この強力な権限のため、ルートユーザの操作は慎重に行う必要があります。
プロセスとは
オペレーティングシステムには、「プロセス」という基本的な概念があります。プロセスとは、「実行中のプログラムのインスタンス」 または 「動作中のプログラムの実行コンテキスト」 と定義できます。
従来のオペレーティングシステムでは、プロセスは1つのアドレス空間の中で1つの命令シーケンス(命令の並び)を実行します。ここでいうアドレス空間とは、そのプロセスが参照可能なメモリアドレスの集合を指します。
一方、近代的なオペレーティングシステムでは、1つのプロセスが複数の処理の流れ(スレッド)を持つことが可能になっています。つまり、同じアドレス空間内で複数の命令シーケンスを並行して実行できるようになっています。
マルチプログラミングとマルチプロセッシング
マルチユーザシステムでは、複数のプロセスが同時に動作し、CPUやメモリなどのシステム資源を共有します。これを実現するオペレーティングシステムの仕組みを、以下のように分類できます。
マルチプログラミング(Multiprogramming)
複数のプロセスを同時に動作状態にし、CPUの利用効率を高める仕組みマルチプロセッシング(Multiprocessing)
複数のCPU(マルチコア含む) を用いて、複数のプロセスを並行実行する仕組みプロセスの実行形態として、以下の2つのケースが考えられます。
- 複数のプロセスが並行して同じプログラムを実行する(例:複数のユーザが同じアプリケーションを実行)
- 同じプロセスが複数のプログラムを順次実行する(例:シェルが異なるコマンドを実行)
単一プロセッサシステム(シングルコアCPU)では、ある瞬間に実際にCPUを使用できるのは1つのプロセスのみです。ただし、オペレーティングシステムがプロセスを短時間で切り替えることで、ユーザには複数のプロセスが同時に実行されているように見えます。
スケジューラとプリエンプション
CPUをどのプロセスに割り当てるかを決定するのは、スケジューラと呼ばれるオペレーティングシステムの機能です。スケジューラには、次の2つの方式があります。
プリエンプト不可(Non-Preemptive)
プロセスが自発的にCPUを手放したときのみ、スケジューラが次のプロセスを選択する
例:古いバッチ処理システム
プリエンプト可能(Preemptive)
一定時間ごとにスケジューラがCPUの割り当てを変更し、すべてのプロセスに公平な実行機会を提供する
例:マルチユーザシステム(UNIX など)
マルチユーザシステムでは、プリエンプト可能なスケジューリングが必須です。オペレーティングシステムは各プロセスがCPUを使用した時間を管理し、定期的にスケジューラを作動させることで、公平なリソース分配を実現します。
UNIXはプリエンプト可能なプロセスを備えたマルチプロセッシングOSです。たとえユーザがログインしておらず、アプリケーションが動作していない場合でも、システムプロセスが周辺デバイスを監視しています。
プロセスのライフサイクルとUNIXの仕組み
UNIX系オペレーティングシステムでは、ユーザのログインやアプリケーションの起動に応じて、プロセスの生成と管理が行われます。
ユーザのログインとプロセスの流れ
- システムの特定のプロセスが、ユーザのログインを待機
- ユーザがログイン名を入力すると、パスワード認証プログラムを起動
- 認証が成功すると、新しいプロセスを作成し、シェル(コマンド入力環境)を実行
- ユーザがコマンドを入力すると、シェルプロセスが新たなプロセスを起動し、コマンドを実行
グラフィカル環境では、次のようにプロセスが管理されます。
- ウィンドウマネージャのプロセスが起動
- 各ウィンドウがそれぞれ独立したプロセスとして動作
- シェルプロセスが別のプロセスを起動し、ユーザの操作に対応
プロセスとカーネルの関係
UNIX系オペレーティングシステムは、プロセス/カーネルモデルを採用しています。このモデルでは、各プロセスは「自分がシステム上で唯一のプロセスである」と錯覚します。
システムコールとカーネルモード
プロセスがシステムリソースを使用する際には、システムコールを発行します。
- プロセスがシステムコールを実行
- ハードウェアがユーザモードからカーネルモードに切り替え
- カーネル内の手続きが実行される(アクセス制限あり)
- 要求が完了すると、ハードウェアがユーザモードに戻る
- プロセスはシステムコールの続きから実行を再開
この仕組みにより、プロセスは安全にオペレーティングシステムのサービスを利用できるようになっています。