UNIX 概要

■コンピュータの構成

■オペレーティング・システムの構成要素

UNIXオペレーティング・システムは、カーネル、サーバ、 シェル、コマンド群、各種ライブラリ関数、といった要素から構成されています。

図1: オペレーティング・システムの構成要素

図1: オペレーティング・システムの構成要素

◆カーネル

カーネルkernel ) は、直接ハードウェアを制御する、オペレーティング・システムの中心部です。
たとえば、ハードディスクやキーボードとの入出力を行ったり、 ネットワークを制御したりします。

UNIXのカーネルは、ファイル、プロセス、 プロセス間通信といったシステムの基本的な機能を提供します。 具体的には、ファイルのアクセス権の確認、プロセスの保護、 CPU資源のスケジューリング、パイプ、ソケット、 TCP/IPによるプロセス間通信機能等があります。

◆シェル

シェル ( shell ) は、カーネルを取り囲んでいる殻という意味です。 シェルは、利用者と対話しながら、利用者からの入力を解析し、 それにしたがってプログラム(コマンド)を実行します。シェルのことを、 コマンド・インタプリタ (command interpreter ) ともいいます。

標準入力 (stdin)、標準出力 (stdout)、標準エラー (stderr)、パイプによる結合、 入出力の切り換えは、シェルの仕事です。

◆コマンド群

コマンドcommand ) は、利用者がシェルに要求する指令です。
UNIXのシェルは、指令を受け取っても、具体的な仕事をほとんど何もしません。 cd, exit, set, umask のような、 自分自身の状態を変えたりプログラムの実行環境を変えるものを除いて、 全部外部のプログラムを実行させます。 シェル自身が実行するコマンドを 組込みコマンドbuilt-in command )、 そうでないものを 外部コマンド といいます。

UNIXでは、ディレクトリの一覧表、 ファイルのコピーと画面への表示などの基本的な仕事も、 それぞれ ls, cp, cat といった外部コマンドにより実行されます。

◆システム・コールとライブラリ

UNIXを使って仕事をする人(利用者、ユーザ)にとって大事なものは、 シェルとコマンドです。
UNIX 上でプログラムを書く人 (プログラマ) にとって大事なことは、 システム・コール (system call) とライブラリ (library) です。

システム・コールは、カーネル(システム)の機能を呼出すことです。 たとえば、ファイルの入出力を考えると、単純な読込み read() や、 単純な書込み write() がシステム・コールです。
システム・コールをより使いやすい形にしたものが、ライブラリです。 たとえば、ファイルの内容を1行読み込む fgets()や、 書式付きの出力を行う printf() などがライブラリにはあります。

システム・コールもライブラリも、C言語からは、 関数呼出しの形で使えるようになっており、 一見区別がつきませんが、マニュアルを見ると、 システム・コールは2章、ライブラリは3章にあります。

man コマンドで見た時に、最初の行の右端が"read(2)"のように "(2)" となっていればシステム・コール、 "printf(3S)" のように"(3)" になっていれば、ライブラリです。

システム・コールは、トラップ命令(trap instruction)を含んでいます。 これは、カーネルに制御を移します。 この部分は、アセンブリ言語で書かれています。 ライブラリ関数は、アセンブリ言語で書かかれているものもありますが、 大部分はC言語で書かれています。

システム・コールとライブラリの集合を API (Application Programming Interface) といいます。
たとえC言語で書かれていても、 API が違うとコンパイルして機械語に変換しても、実行はできません。

ライブラリやシステム・コールは、 コンパイルされてオブジェクト・コードの形で保存されています。 これらは、実行形式を作る時に抜き出され、 アプリケーション・プログラマが作成したオブジェクト・コードと結合されます。 この操作を、 リンク(link) (リンケージ・エディット(linkage edit) 結合編集)といいます。

リンクには、静的リンクと動的リンクの2種類があります。

静的リンク(static link) では、 プログラムを実行する前(実行形式を作成する時点)に、 ライブラリ関数の呼出しをすべて機械語の手続き呼び出し命令にしたり、 データへの参照を絶対番地に変換します。
通常静的ライブラリは *.a という名前です。 システムのライブラリは /usr/lib にあります。

動的リンク(dynamiclink) では、 プログラム実行中に必要に応じてリンク処理します。
通常動的ライブラリは *.so(sl) という名前です。 システムのライブラリは /usr/lib にあります。

動的リンクでは、 しばしば共有ライブラリ(shared library) を使います。 これは、複数のプロセスで共通に使うライブラリを動的リンクで共有します。
動的リンクを使うことで、 実行時の環境に応じてプログラムの動きを変えられます。 この機能を使って、たとえば、 古いバージョンのシステムでコンパイルされた実行形式を 新しいバージョンのシステムで動作できます。 また、共有ライブラリを使うと、それぞれの実行形式が小さくなるので、 メモリの節約になります。

◆デーモン

デーモン (daemon) とは、本来オペレーティング・システムの一部ですが、 他のプログラムと同じようにプロセスとして活動しているプログラムで、 通常終了することはありません。

たとえば、プリント・デーモンは、カーネルと同じように、 いろいろな利用者からの仕事(プリント)を請け負います。

デーモンは UNIX の言葉で、 一般的には、サーバ・プロセス (server process) といいます。 これは、サービスを提供するプロセスという意味です。

◆ゾンビ

すべてのプロセスは init(PID=1) の子プロセスです。 終了したプロセスの親プロセスがその子プロセスの終了を待っていないと、 終了した子プロセスは OS によってゾンビプロセスとされます。 カーネルは、ゾンビプロセスによって使われていたすべての資源を解放しますが、 プロセスとしてはそのまま残ります。

◆ウィンドウ・システム

最近では、 GUI (Graphical User Interface) を提供するコンピュータが普通です。 GUI を提供するための中心的なシステムはウィンドウ・システムです。

ウィンドウ・システムも、シェルと同様、 コンピュータの利用者に対する見え方を決定する重要な要素です。

Xウィンドウでは、 モニタやキーボードを管理するサーバ・プロセスとそれらを利用する クライアント・プロセスに分かれています。