カーネルとは?その目的と機能のまとめ【UNIX系】

thumbnail

カーネルとは

カーネルとは、OSの中核をなすプログラムにあたります。

OSは、いわゆるMacやWindowsといった、コンピュータを動かすための基礎的なプログラムの集合です。

つまりMacやWindowsを動かす中核がカーネルというわけです。

カーネルには、具体的には次のような機能があります。

  • メモリ
  • CPU
  • 入出力

まさにコンピュータの基盤となる機能を提供しているというわけですね。

カーネルの目的

カーネルの主な目的は、以下の2つです。

  • コンピュータの物理的な構成に関わる低水準なハードウェアを制御する
  • ユーザプログラムの実行環境を提供する

ほかにも、UNIX系のOSなどではカーネルがハードウェアを隠蔽する役割も担っています。

ユーザプログラムから直接操作されることを防ぐわけですね。

ユーザプログラムがハードウェアを利用したいときには、

  • OSに要求を発行
  • カーネルが要求を評価
  • ハードウェアの利用が許された場合は、カーネルはユーザプログラムの代わりにハードウェアの操作を行う

というわけですね。

この機能を実現するために、ハードウェアにも機能が備わっています。

たとえばCPUには少なくとも2つの実行モードがあります。

  • ユーザプログラム用の非特権モード
  • カーネル用の特権モード

一部の操作をカーネルだけに許可することで、ユーザプログラムがハードウェアを直接操作することを防ぐわけですね。

UNIX系カーネルの代表的な機能

次に、UNIX系カーネルの代表的な機能について説明しますね。

ユーザ

マルチユーザシステム

マルチユーザシステムとは、複数のユーザが、同時に、他のユーザに影響を与えることなくアプリケーションを実行することのできるシステムです。

マルチユーザシステムを実現するためには、以下の機能が必要になります。

  • 認証機能
  • 他のアプリケーションの動作に影響を与えるユーザプログラムに対する保護機構
  • 悪意あるユーザに対する保護機能
  • 各ユーザに割り当てられるハードウェア資源を制御するアカウンティング機構

「どのユーザか」を識別するためには、ユーザID(UID)という一意の番号がつけられます。

他のユーザからの保護

マルチユーザシステムには、複数のユーザが存在します。

そのため、ほかユーザから次のように資源を保護します。

  • ユーザがセッションを開始するときは、ログイン名とパスワードを要求する
  • ディスク領域などがユーザに割り当てる
  • その所有者だけが参照できるようにする

グループによるデータの共有

これだと、「一部のユーザに対して資源を共有する」というケースに対応できません

そのためUNIX系カーネルには、グループという機能があります。

各ユーザは1つ以上のグループのメンバとなっています。

そして各ファイルも必ず1つのユーザ・グループに属し、それぞれに対するアクセス権を設定することができます。

グループ単位で権限を絞ることで、一部のユーザに対して特定の操作を許可することができるようになるわけです。

ちなみにグループもユーザと同じように一意な番号が割り当てられており、グループID(GID)と呼ばれています。

ルートユーザ

権限がガチガチに絞られてしまうと、システム管理者が管理作業を行うときなどに困難です。

そのためUNIX系カーネルでは、ルートユーザ(あるいはスーパユーザ)と呼ばれる、特殊なユーザがいます。

ルートユーザには通常の保護機構を適用されません。

システム上の全てのファイルにアクセスでき、動作中の全てのユーザプログラムの実行を制御することができるわけです。

プロセス管理

プロセスとは、実行中のプログラムのインスタンスのことです。

プロセスにはアドレス空間と呼ばれるメモリアドレスの集合が渡され、そこで命令シーケンスを実行していきます。

マルチプロセッシングシステム

マルチユーザシステムでは、複数のプロセスが同時に実行可能であり、システム資源を取り合います。

このように複数のプロセスが同時に動作状態になれるシステムのことを、マルチプロセッシングシステムといいます。

スケジューラ

一般的に、使用できるCPUの数は限られています。

そのため同時に実行できるのは、数プロセスのみです。

したがってOSの中のスケジューラと呼ばれる部分が、各プロセスがCPUを獲得している時間を管理し、実行するプロセスを制御しています。

ファイル管理

UNIX系カーネルにおけるファイルは、バイト列として構造化された情報の入れ物です。

ディレクトリ

ファイルはツリー構造の名前空間に系統立てられており、末端以外のノードは全てディレクトリの名前を表します。

ツリーのルートにあたるディレクトリはルートディレクトリと呼ばれ、名前は慣習的に「/」です。

カレントディレクトリ

UNIXでは、プロセスごとにカレントディレクトリがあります。

カレントディレクトリは、プロセスが現在使用しているディレクトリを特定します。

パス名

パス名とは、プロセスが特定のファイルを指し示すためのものです。

パス名の先頭が「/」の場合は絶対パス、そうでなければ相対パスと呼ばれます。

絶対パスはルートからの位置、相対パスはカレントディレクトリからの位置を示します。

iノード

iノードとは、ファイルを取り扱うのに必要な実データ以外の情報をまとめるデータ構造です。

具体的には種類、サイズ、アクセス権、所有者、実データへのポインタなどが含まれます。

各ファイルはiノードと対応づけられ、それにより管理されています。

ハードリンク

ハードリンクとは、同じiノードを持つ異なるファイルを作る機能です。

ハードリンクには以下のような特徴があります。

  • ディレクトリのハードリンクを作ることができない
  • 同じファイルシステム内のファイルに対してのみ生成することができる
  • ハードリンクの元ファイルを削除しても、ハードリンクは機能する。

シンボリックリンク

シンボリックリンクは、元ファイルの位置情報を記憶したものです。

シンボリックリンクには以下のような特徴があります。

  • ディレクトリのソフトリンクも作ることができる
  • 異なるファイルシステム内のファイルに対しても生成することができる
  • 元ファイルが削除されたり、移動すると、シンボリックリンクからは参照できなくなる

モジュールによる拡張

モジュールとは、カーネルの機能を拡張することのできるオブジェクトファイルです。

特定のプロセスとして実行されるのではなく、静的にリンクされてるカーネル関数と同様にカーネルモードで実行されます。

またモジュールは機能が必要になったときのみカーネルに組み込まれるため、必要がなくなれば削除し、メインメモリの使用量を削減することができます。

まとめ

カーネルの目的、そしてUNIX系カーネルの代表的な機能についてまとめていきました。

技術の移り変わりが早い時代と言われています。

そんな時代だからこそ、こういった長い間変わらない基盤的な知識は補っていきたいですね!


@dorarep
小学生の頃からフリーゲーム作ってました。今はフリーランスでフルスタックエンジニアしてます。