高等学校工業/ソフトウェア技術/カーネルとユーザーランド

カーネルとは編集

カーネルは、コンピュータのオペレーティングシステムの中核となるコンピュータプログラムであり、システム内のすべてのものを完全に制御します。 カーネルは、「オペレーティングシステムコードのうち、常にメモリ内に常駐する部分」であり、ハードウェアコンポーネントとソフトウェアコンポーネント間の相互作用を促進します。 カーネルは、デバイスドライバを介してすべてのハードウェアリソース(I/O、メモリ、暗号など)を制御し、これらのリソースに関するプロセス間の競合を仲裁し、CPUやキャッシュの使用、ファイルシステム、ネットワークソケットなどの共通リソースの利用を最適化します。ほとんどのシステムでは、カーネルは起動時に最初に読み込まれるプログラムの一つです(カーネルを読み込むブートローダ自身の後)。 カーネルは、起動時の残りの部分や、メモリ、周辺機器、ソフトウェアからの入出力(I/O)要求を処理し、中央処理装置のデータ処理命令に変換します。

カーネルの重要なコードは通常、メモリの別の領域にロードされ、アプリケーション・ソフトウェアやオペレーティングシステムの他の重要度の低い部分からのアクセスから保護されています。 カーネルは、この保護されたカーネル領域で、プロセスの実行、ハードディスクなどのハードウェアデバイスの管理、割り込みの処理などのタスクを実行します。 一方、ブラウザやワープロ、オーディオ・ビデオプレーヤーなどのアプリケーションプログラムは、ユーザースペースという別のメモリ領域を使用します。 これにより、ユーザーデータとカーネルデータが互いに干渉して不安定さや遅さの原因となることを防ぎ、また、誤動作したアプリケーションが他のアプリケーションに影響を与えたり、OS全体がクラッシュしたりすることを防ぐことができます。

カーネルのインターフェースは、低レベルの抽象化レイヤーです。プロセスがカーネルにサービスを要求する場合、通常はラッパー関数を介してシステムコールを呼び出す必要があります。

カーネルアーキテクチャには様々なデザインがあります。

モノリシックカーネル
単一のアドレス空間ですべてを実行し、CPUは主にスピードを重視してスーパーバイザモードで実行されます。
マイクロカーネル
主に耐障害性とモジュール性のために、ユーザープロセスのように、サービスのほとんど(すべてではない)をユーザー空間で実行します。

現在のコンピュータのオペレーティングシステムに於いては、モノリシックカーネルの特徴を持ったマイクロカーネルや、マイクロカーネルな特徴を持ったモノリシックカーネルなどが存在し、両者の区別は絶対的なものではなくなりつつあります。

カーネルは、コンピューター・システムの中心となるコンポーネントで、プログラムの実行を担います。 カーネルは、実行中の多数のプログラムのうち、どのプログラムをプロセッサに割り当てるべきかをいつでも決定する責任を負います。

カーネル以外編集

仮想メモリに代表されるメモリ管理、マルチタスクなどのプロセス管理、アカウンティングなどのユーザー管理などは、カーネルの機能の一部です。しかし、ウィンドウシステムやその上に構築されるデスクトップなどのユーザーインターフェース、キャラクタ端末での対話を行うシェル(shell)、データベース管理システムなどのミドルウェア、ファイル管理ソフトやエディター、各種設定ツールなどのユーティリティー、ウェブブラウザや時計などのアクセサリは、(主にマーケッティング上の理由で)オペレーションシステムに含まれる場合がありますが、これらはカーネルの一部ではありません。

アプリケーション・プログラミング・インターフェース(API)編集

アプリケーション・プログラミング・インターフェース(API)とは、コンピュータプログラム間またはコンピュータ間の接続であり、他のソフトウェアにサービスを提供するソフトウェアインターフェースの一種です。

APIは、カーネルのほかミドルウェア、ネットワックサービスが提供する場合があります。

このような接続やインターフェースを構築する方法を記した文書や規格をAPI仕様と呼びます。 この規格を満たすコンピュータシステムは、APIを実装している、または公開していると言われます。 APIという用語は、仕様を指す場合と実装を指す場合があります。

APIは、コンピュータと人間を結びつけるユーザーインターフェースとは対照的に、コンピュータやソフトウェアを相互に結びつけるものです。 APIは、ソフトウェアに組み込むコンピュータ・プログラマー以外の人(エンドユーザー)が直接使用することを意図していません。 APIは、多くの場合、プログラマーが利用できるツールやサービスとして機能するさまざまなパーツで構成されています。 これらのパーツを使用するプログラムやプログラマーは、APIのその部分を呼び出すと言われています。 APIを構成するコールは、サブルーチン、メソッド、リクエスト、エンドポイントなどとも呼ばれます。 API仕様は、これらのコールを定義するものであり、コールの使用方法や実装方法を説明するものである。

APIの目的の一つは、システムがどのように動作するかという内部的な詳細を隠すことであり、プログラマーが有用と考える部分のみを公開し、内部的な詳細が後に変更されても一貫性を保つことができます。 APIは、特定のシステムの組み合わせのためにカスタマイズされている場合もあれば、多くのシステム間の相互運用性を可能にする共有規格である場合もあります。

ライブラリとランタイム編集

ライブラリ編集

プログラム作成のさい、三角関数などの、よく使うアルゴリズムは、すでに、プログラミング言語の作成者によりプログラムが用意されている場合があり、プログラマーは、いちいち自分でアルゴリズムを書きおこさなくても、プログラミング言語の用意してくれるアルゴリズムを呼びだすためのコードだけを書けばいい。

このような仕組みを、ライブラリ(library)という。

プログラミング言語やオペレーティングシステムなどが、すでに、プログラミング制作において良く必要になるライブラリを用意してくれている場合がある。

プログラミング言語の専門書を読めば、その言語で使えるライブラリが紹介されているだろう。

また、OSの用意するライブラリは、別々のアプリケーションでも、利用できる。


さて、技術的に重要なこととして、ライブラリは、単にプログラム作成者の作業の負担を減らすだけでなく、さらに、そのプログラムを検査する人の負担も減らす事に気づいてほしい。

また、プログラムのコードの長さを減らすことは、一般に、そのプログラムが使用するメモリの量を減らす事につながりやすく、ハードウェアの利用効率の向上にも、つながる。

どうしても、よくあるアルゴリズムを使用するさいに、既存のライブラリを使用せずに自分でアルゴリズムを記述したい場合でも、せめて、そのアルゴリズムは、再利用をできるように、してほしい。


なお、OSの提供するライブラリは、OSが異なると使用できないのが一般的である。

たとえば、windowsの提供するライブラリは、LinuxやMacなどでは、普通の方法では、利用できない。

windowsのアプリケーションなどで、そのファイルの中身が表示されているアプリケーションである場合に、拡張子が「.dll」のファイルのものを見かけることがある。この「.dll」ファイル形式こそ、windowsアプリケーションにおいてライブラリのような機能を使っているファイルである。dllは「ダイナミック・リンク・ライブラリ」(Dynamic Link Library)のことである。

※ なお linux では「.so.」などとファイル名にあるものが、ライブラリ的な機能を用いている。

なお、アプリケーションがOSの機能を呼び出すときの命令のライブラリのことをAPI(エーピーアイ、application programming interface)という場合もある。


また、なお、冒頭の節ではゲームプログラミングを例に構造化プログラミングを説明したが、しかし、OSや一般のプログラミング言語は、こういうゲーム制作専用のライブラリを提供しない。(ゲーム制作ソフトなどが、こういうゲーム制作専用の、ライブラリと似た機能を提供していたりする。ただし、名称は異なり、ゲーム制作ソフトなどでは、このようなコードの再利用の仕組みがあっても、「ライブラリ」とは呼ばないのが一般的である。詳しい仕様は、そのゲーム制作ソフトごとに異なるし、そもそも本科目はゲーム制作の科目ではないので、本書では、これ以上は深入りしない。)


範囲外: 「ランタイム」編集

なお、「Java」(ジャバ)というプログラミング言語でつくられたアプリケーションを動かすさいに「Javaランタイム」などと呼ばれるプログラムをインストールしておく作業が必要になる。

「ランタイム」といわれる種類のプログラムも、このライブラリと似たようなものである。


例として、パソコン用のゲーム制作用ソフトで制作されたゲームを、通常のプレイヤー(遊び手)が遊ぶ場合考えよう。(なお、Javaは別にゲーム制作ソフトではないので、誤解しないように。)

一般のプレイヤーにとっては、プログラミングの機能は不要である。また、もしプレイヤーがゲームをプレイするさいに、プログラミングのファイルを実行してしまっては、混乱のもとになる。なので、ゲームを配布するさいに、プログラミングの機能のためのファイルは、配布しないでおくか、プログラミングの勉強をした希望者だけに配布するなどの工夫が必要である。

しかし、そのゲーム制作ソフトの用意している専用ライブラリ(またはライブラリのような物)が、プレイヤーのパソコン内にインストールされていないと、そのゲーム制作ソフトで制作されたゲームは、作動しないか、異常終了する。(なぜなら、そのゲームが、専用ライブラリを用いているから。「ライブラリを参照しろ」とプログラム内に書かれているゲームの起動作業において、参照先のライブラリがパソコンに無ければ、そのゲームが起動しないか異常終了するのは、当然である。)

なので、そのゲームを配布するさい、なんらかの方法で、専用ライブラリを、プレイヤーのパソコンにインストールさせるか、もしくはプレイヤーのパソコン内で利用可能な状況に設定する必要がある。

そのためには、そのゲーム制作ソフトの用意するライブラリ群などゲーム動作に必要なものを、あらかじめ、まとめて、1つのパッケージにしておいて、配布する必要がある。(ゲーム制作ソフトの生産企業などが、こういう仕事を行っていたりする。)

いっぽう、ゲームごとに、ゲーム作家が別々のライブラリ郡を配布するのは、非効率であるし、そのライブラリ郡を検証するのに余計な手間が掛かる。

なので、ゲーム制作ソフトの生産企業が、ライブラリ群などを、あらかじめ、まとめて、1つのパッケージにして配布したりするわけがある。

そのゲーム制作ソフトの用意するライブラリ群をインストールさえしておけば、プレイヤーは、あとはゲームそのものを入手するだけで、ゲームをプレイできる、・・・という仕組みである。


このように、アプリケーションを動作させるために、ライブラリなどのような、アプリケーション動作のために追加する必要のあるものをまとめたパッケージ郡のことを「ランタイム」(runtime)という。あるファイルを「ランタイム」という場合、通常は、開発・制作などの機能は、外してあるのが一般的である。

例として、ゲーム制作ソフトを例にあげたが、「ランタイム」は別にゲーム産業にかぎった用語ではない。

OSの提供する、さまざまな機能編集

プロセス管理編集

マルチタスクを実現する機構。タスク管理とも。

シグナル編集

ソフトウェア的な割り込み処理。例外処理(特に構造化された例外処理)とも。

プロセスグループとセッション編集

親子関係を持ったプロセスの維持管理。

メモリ管理編集

プロセスが実行される際に、プロセスのアドレス空間のすべての内容が常駐している必要はありません。プロセスがメインメモリに常駐していないアドレス空間の一部を参照する場合、システムは必要な情報をメモリにページングします。

仮想記憶編集

仮想記憶は、「あるマシンで実際に利用可能なストレージリソースの理想的な抽象化」を提供するメモリー管理技術であり、「非常に大きなメインメモリーがあるようにユーザーに錯覚させる」技法といえます。

カーネルは、ハードウェアとソフトウェアの組み合わせにより、仮想アドレスと呼ばれるプログラムが使用するメモリーアドレスをコンピューターのメモリー上ーの物理アドレスにマッピングします。 プロセスやタスクから見たメインストレージは、連続したアドレス空間または連続したセグメントの集合体として表示されます。 カーネルは、仮想アドレス空間と、仮想メモリーへの実メモリーの割り当てを管理します。 メモリー管理ユニット(MMU)と呼ばれるアドレス変換ハードウェアは、仮想アドレスを物理アドレスに自動的に変換します。 カーネルは、これらの機能を(ページフォルトにより介入することで)拡張して、実メモリーの容量を超える仮想アドレス空間を提供し、コンピューターに物理的に存在するよりも多くのメモリーを参照することができます。

仮想記憶の主な利点は、アプリケーションの共有メモリー空間を管理からの開放、プロセス間で共有可能なライブラリー、メモリーの分離によるセキュリティの向上、メモリーの分離による頑強性の向上、そしてなによりページングやセグメンテーションの技術を用いて物理的に利用可能なメモリーよりも多くのメモリーを概念的に使用できることなどです。

I/O システム編集

多くのOSでは、I/Oはデータ・バイトのストリーム、つまりI/Oストリームとして扱います。

ファイルシステム編集

ファイルはバイトの直線的な配列であり、ユーザープログラムから読み書きが可能な他、所有権、保護、使用に関する情報を保存していおりカーネルはそれを適用・維持・管理します。

ファイルストレージ機構編集

ローカルファイルシステムは、階層的な名前付け、ロック、クォータ、属性管理、保護などを提供します。 ローカルファイルシステムは、ストレージメディア上のデータの編成とその管理を行います。 記憶媒体上のファイルの内容をレイアウトするのは、カーネルの機能の1つであるファイルストアの責任です。

ネットワークファイルシステム編集

端末管理編集

プロセス間通信編集

ネットワーク通信編集

システム運用編集

ブートストラップ時の、自動的なシステム構成の取得と初期化など。