OSの概要
OS(Operating System、オペレーティングシステム)はコンピュータを操作するための基本ソフトウェアです。「コンピュータはソフトウェアがないとだだの箱に過ぎない」とはよく言われる言葉ですが、ここで言われるソフトウエアには様々なものがあります。皆さんが一番にイメージするのは、ユーザの希望を実現してくれるソフトウェアではないでしょうか。しかし、ソフトウエアはそれだけではありません。
1 アプリケーションソフトだけではだめなのか?
ソフトウエアがないと、「コンピュータはただの箱」といわれるのは、コンピュータが単なる電子回路の装置の組み合わせにすぎないからです。この電子回路には様々なものがあります。コンピュータの頭脳ともいうべきCPUや、記憶装置のメモリ、その他、CPUに利用者の希望を伝えるためのキーボードやマウス、またCPUの計算結果を表示するための画像ディスプレイモニタなどです。ネットワークにつながって通信をする場合には、ネットワークとのインターフェース(ボード)を制御する必要もあります。これらを一手に引き受けているのがOSです。
ではこのOSはどういう経緯で発明されたのでしょうか?コンピュータは開発当初は大変高価な装置でしたので、大人数で1台のコンピュータを使うという方法がとられました。コンピュータでプログラムを動かしたいという人は自分でプログラムを書き、それを紙テープやパンチカードに記入して、コンピュータルームにいるオペレータに渡していました。プログラムを受け取ったオペレータは、順番にプログラムをコンピュータに読み込ませて、実行結果を利用者に渡すという手順で、作業が行われました。
この時代は、コンピュータという限られた資源をどのように使うか、例えば、プログラムをどういう順序で実行するかなどは、全て人の判断にゆだねられていました。
 |
アプリケーションがハードウェアを制御する方式 |
やがてコンピュータの性能が上がり、ユーザに要求されたプログラムの実行以外の処理を行う余裕が出てくると、それまで人手で行っていた資源配分をコンピュータにやらせてしまおうというアイデアが生まれます。
最初はプログラムの実行管理に始まって、キーボード、マウス、画像ディスプレイ、ディスク、プリンターなどの周辺機器の制御、メモリの管理、複数プログラムの同時実行など、更に他のコンピュータとの通信といった様々な機能がOSに取り込まれるようになっていきました。
 |
OSがハードウェアとアプリの仲立ちをする |
1.1 互換性
人々のコンピュータを使う目的は様々で、ハードウェアはその目的に従って作られます。画像処理に特化したハードウエアや、科学計算処理に特化したハードウェアや、事務処理用のハードウェア、サーバに特化したものなど様々です。そして、目的に従って、作成されたハードウェアは、それぞれCPUが違っていたり、メモリが違っていたり、データの書き順が違っていたり、計算順が違っていたり、周辺装置の制御の方法が違っていたりします。
同じ目的のハードウェアでも、製作会社が違えば違うのは当たり前でした。このような状態でOSがないと考えてみてください。アプリケーションソフトでハードウェアも直接制御しなくてはなりません。ハードウェアを制御する部分は、他の会社の、あるいは同じ会社のものでも、コンピュータの機種が違うと、使えないということになります。そうすると、ハードウェア毎に、アプリケーションソフトを作る必要があります。そもそも、アプリケーションソフトのプログラマーに、ハードウェアレベルの知識を求めること自体が、無理な注文なのですが、それに加えて、ハードウェア毎に別のアプリケーションプログラムを作らなくてなならないということになります。
人々のコンピュータを使用する目的は様々ですので、目的ごとのハードウェアが作られます。しかし、コンピュータをある程度共通化することはできます。コンピュータのハードウェアをある程度共通化して、ソフトウェアから見た時に、動作に支障がない程度に似ているようにすると、一つのプログラムでも、ある程度の機種の上で動くようになります。これが互換性の考え方で、プログラムから見た時に同じように見えるハードウェア同士は「互換性がある」といいます。
ただし、ハードウェア側だけで互換性を実現しようとすると、ハードウェアの進歩を妨げてしまうという欠点があります。ハードウェアは技術の進歩に合わせて日々高性能化していますが、ソフトウェアから見た時に「同じに」見えなくてはならないという条件に縛られると、日々進歩するハードウェアの機能を生かすことができません。ここに、OSの意味があります。OSは、ハードウェアとアプリソフトの中間に立って橋渡しの役割を果たすことができます。アプリは、直接ハードウェアに命令を出すのではなく、まずOSに命令を出します。OSはその命令を解釈してハードウェアに適合する形にして制御を実行します。ハードウェアの性能が違ってくると、OSはそれに合わせて命令をハードウェアに最適な形に変換して命令を実行します。
1.2 汎用性
汎用性とは、一つの機器(コンピュータ)やシステムを特定の目的に限定せず、いろいろな目的に使用できるということです。開発当初はロケットの弾道計算専門のコンピュータや、暗号解析専門のコンピュータなどが普通でした。その後、コンピュータには汎用性が求められるようになります。どんな目的にも利用できるといっても、アプリケーションソフトだけでそれを実現するのは大変です。個々のハードウェアにマッチするようなアプリケーションを、ハードウェア毎にどんどん作っていくという途方もない作業が要求されます。しかし、OSを使えば、汎用性を実現するのは大分簡単になります。
OSとしてはWindowsやUNIX、Linuxなどが有名ですが、これらのOSに合わせて、アプリケーションを作ればいいと言う状況があれば、プログラムが作りやすくなります。そして、そのプログラムは同じOSが稼働しているコンピュータに移植しやすくなります。バージョンが合わずに動かないという場合もあるでしょうがそのような場合でも、少しの手直しで動くようになります。また、あるソフトで作成したデータやプログラムが他のソフトでも動かせるように(動かせ易く)なります。
1.3 OSがあるといいこと、互換性と汎用性のもたらしたものは?
OSに合わせてアプリケーションプログラムを作ればいいので、ソフトウエアは安価にたくさん作られるようになります。また、互換性のおかげで、特定のOSを対象にしたアプリケーションは、他のパソコンでも使えるようになります。使いやすいソフトウェアが、安価にどんどん使えるようになると、パソコンを使う人が増えて、パソコンがよく売れるようになります。こうなると、量産効果が生まれて、パソコンの値段も手ごろなところに下がってきてくれるようになります。こうなるとハードウェアや、ソフトウェアの高性能化にも拍車がかかって来るということになり。ますます便利になるということになります。
OS同士も高性能化や操作性などを競い合うことになります。アプリケーションソフトなども、競争効果でますますよくなると期待されます。多分、OSがなかったら、こんなにうまい具合にはいかなかったことでしょう。
2 OSってどんなことをしているの?
OSはコンピュータの全ての動きを総合的に管理しています。具体的にはコンピュータが起動してから、終了するまで、コンピュータの動作を管理しています。ユーザが利用したいアプリケーションがあれば、それを呼び出し、実行を助けます。アプリケーションソフトは全て目的をもって作られています。そして、アプリケーションソフトはユーザの希望を実現する部分だけが記述されています。しかし、アプリケーションソフトだけでは、ユーザの希望を実現することはできません。ユーザの希望を実現するにはアプリケーションソフトだけではなく、ハードウェアの制御も必要ですが、この部分はアプリケーションソフトには記述されていないからです。
ワープロソフトを使って文章を記述し、それをプリンタから打ち出す場合を考えてみましょう。ユーザはキーボートを打ちます。この指示はキーボードから来ているのか、マウスから来ているのか判断できないのでは、仕方がありません。キーボードから来ている指示であると分かったら、その押されたキーは何なのか分からなくてはなりません。そして、キーの押された回数は1回なのか、2回なのか判断できなくてはなりません。ワープロで文章を書いていたら、突然セキュリティソフトが動き出して、ウィルスチェックを始めたとします。CPUは一度に1つのことしかできませんので、今までの作業をどこかに退避しておかなくてはなりません。今までの作業をメモリのどこに退避して、今度始めるときにはどこから始めるかを、全部記憶しておいてから、新しい作業を始める必要があります。作業が終わったら、また元の作業に戻ります。文章が書き終わったら、そのまま文章をプリンターに渡して、プリントすることができます。ファイルに保存してからプリントすることもできます。プリンターから打ち出す場合は、インクがあるか、紙の大きさ、解像度などを確認して、プリントの命令を出します。このような補助的作業はOSにゆだねられています。
2.1 システムコールとライブラリー
OSはアプリケーションソフトの機能を補助するためのプログラムの集まりです。これらの中にはアプリケーションソフトから直接呼び出されるプログラムも数多くあります。このように、アプリケーションソフトやOS内部から呼び出し可能となっている機能を「システムコール(system
call)」といいます。
システムコールに非常によく似ているのがライブラリー(library)です。システムコールもライブラリーもC言語などでは共に関数呼び出しで使えるので、あまりはっきり区別ができません。区別する必要もないという考え方もあるかも知れませんが、ここでは違いをはっきりさせておくことにします。アプリケーションで何かをしようとするときに、OS内部(カーネル)の機能を呼び出して、この機能(関数)に全部丸投げして、後はお願いしますとやってしまうのがシステムコールです。
※ちょっと難しいことを言う、ファイル入出力で、単純な読み込みread()や、単純な書き込みwrite()がシステムコールです。
ライブラリーはもっと使い勝手がいいように自由度を高めたものです。自由度を最高に高めるには自分で関数自体を作ってしまうのが一番いいのですが、そこまで行くと大変です。誰にでもできるというものではありません。そこで、いろいろの要求にマッチできるように、様々な関数をあらかじめ作っておき、その都度、使う人(アプリケーションソフト)が取捨選択して、最も適切なものを使うというのがライブラリーです。例えていえば、ガソリンスタンドで店員に丸投げしてしまうのがシステムコールで、セルフサービスで、お客さんが自由にガソリンを入れるのがライブラリーという感じと思ってください。
※UNIXのマニュアルではシステムコールは第2章、ライブラリーは第3章に記述されています。manコマンドを見た時に例えば、READ(2)の様に(2)になっていればシステムコールで、PRINTF(3)のように(3)になっていれば、ライブラリーとなります。C言語のライブラリーとしては、代表的なものに、printf()(印刷)、putchar()(1文字表示)、gets()(文字列読み込み)、sqrt()(平方根の計算)、fabs()(絶対値の計算)、exec()(プログラムの起動)、exit()(プログラムの終了)などがあります。
※システムコールもライブラリも同じ関数ですが、システムコールはOS内部に予め用意されている関数です。これに対して、ライブラリーはOSの内部に用意されているわけではありません。作業手順としてあらかじめ用意されているだけで、OSの中に用意されているわけではないのです。アプリケーションソフトはその手順をプログラムの中に取り込んで使います。ただし、この手順は関数として、すでに出来上がっているので、自分で作る必要はありません。つまり、ライブラリーは多くの人によって使われているプログラムですので、バグが含まれている可能性が極めて低いと言っていいでしょう。ライブラリーを使と簡単にバグの少ないプログラムを作ることができます。
システムコールとライブラリーの集合はAPI(Application Programming Interface)といいます。
2.2 ソフトウェアの階層構造
今までの説明で、ソフトウェアはユーザの希望を実現するためのアプリケーションソフトと、それを補助するためのソフトウェアであるオペレーティングシステムに分けられることが分かりました。また、アプリケーションソフトの作成を容易する目的で、どのアプリケーションからも共通に使えるような関数群が予め用意されています。この関数をライブラリーといいます。アプリケーションソフトのプログラマーは、必要ならばライブラリーをアプリケーションの中に取り込む(リンクさせる)ことで容易にアプリケーションソフトを作成することができます。
また、OSも自身が提供する機能を呼び出すための手段として、システムコールという仕組みを持っています。
コンピュータの内部で様々なプログラムが連携して動作する様子を整理するためによく利用されるのが階層構造です。次はハードウェアとアプリケーションが描かれた図です。ハードウェアはコンピュータの装置を表しています。
次の図では、ハードウェアを複数のアプリが利用しています。このような使い方ができるのはOSがアプリケーションとハードウェアの仲立ちをしてくれるからです。ハードウェアをアプリケーションで直接制御する場合には、CPUが、複数のアプリに要求された仕事ができるように仕切ってくれる人(プログラム)はいません。このような状況では、1つのアプリが1つのハードウエアの全機能を独占的に利用することができますので、ソフトウェアの能力を最大限に引き出すような利用方法も可能となります。ただし、アプリケーションを作るプログラマーはCPUやメモリ、周辺機器、ネットワークの制御について精通している必要があります。
 |
ソフトウェアの階層構造 |
上の図はアプリケーションとハードウェアの間にOSが介在しています。この構成では、アプリケーションはハードウェアを直接触ることはできません。その代わり、アプリケーション(の作者であるプログラマー)は、ハードウェアの知識を持っている必要はありません。OSに対して、要求をする方法を知ってさえいれば、その要求に従って、OSがハードウェアに指示を出してくれます。また、複数のアプリケーションが要求を出したとしても、OSがうまい具合に交通整理をしてくれます。従って、Webブラウザや、メーラーなどを同時に利用することができます。
一番上の階層にいるアプリケーションソフトはOSに働きかけるためにシステムコールを利用することができます。あるいは、ライブラリの中の関数からシステムコールを呼び出すことも可能になっています。
必要なシステムコールが全部用意されていればこれで問題はありません。しかし、新しくグラフィックボードやサウンドボードが開発されたときに、その機能を引き出すためのシステムコールをOSが用意できていない場合はどうでしょうか?その機能を使おうとすれば、アプリケーションの作成者は直接ハードウェアにアクセスするしかありません。こうなるとこのアプリケーションは違うメーカーのハードウェアではたぶん機能しないことになります。それだけではなく、OSとアプリケーションが同時にハードウェアにアクセスすることになりますので、メモリの使い方などで、不具合が発生する可能性があります。例えば、OSが100番というメモリに何か記述しているのに、アプリケーションのプログラマーがその100番に違うデータを上書きしてしまうかも知れません。
OSは、自分以外にはハードウェアにアクセスさせないようにするには、新しいボードなどが開発されるたびに、それをサポートする新しいシステムコールを用意しておく必要があります。
3 カーネル
カーネル(kernel、核)とは、OSの中核的な部分を構成するソフトウェアです。プロセスを管理したり、CPUやメモリ、ストレージ、入出力装置、ネットワークなどコンピュータを構成するハードウェア資源を管理することができます。
※プロセスは、情報の世界においては、プログラムの実行単位を表します。通常は、実行コードとデータは共にメモリ上にあり、CPUによって逐次取り出されて実行されています。CPUから見ると、プロセスはコードとデータの実行単位ですが、OSから見るとメモリの管理単位となります。タスクはプロセスと同じ意味で使われることがあります。
※複数のプログラムを同時実行する場合は、プロセスを更に細分化(スレッド化)し、これを並列処理します。
では、カーネルが提供している機能について個々に見ていきましょう。
3.1 プロセス管理
プロセスは、HDDなどにあるプログラムが呼び出されて、メモリ上に置かれ、実行状態に置かれたものです。OSはプログラムなどからの要求があるとプロセスを生成し、メモリやCPUなどの資源を割り当てて、実行し、プログラムが終了するとプロセスを破棄します。
プロセスを生成する際にはプロセスの情報を管理するための領域(プロセス制御ブロック)を生成し、プロセスの優先度の決定、プロセスのメモリ領域の割り当てなどを行います。プロセスが別のプロセスから生成された場合は、その親プロセスと子プロセスの関係も保持しなくてはなりません。
実行においては、「実行可能状態」、「実行状態」、「待ち状態」に分けて管理します。プロセスは一度に一つのプロセスしか、実行状態には移行できません。複数の実行可能状態にあるプロセスの交通整理をする方法をスケジューリングといい、様々なアルゴリズムが考案されています。
※スケジューリングは、マルチタスク(同時に複数のプロセスを実行する)や多重化(複数のデータの流れを同時に転送)の発展とともに進化しています。
CPUに空きができると、実行可能状態にあるプロセスは優先順位に従って、実行状態に移行します(ディスパッチ)。一旦実行状態に移ると終了するまで、そのプロセスが資源を独り占めするということでは、公平な処理が期待できません。実行状態にあるプロセスは、ある一定時間(タイムスライス)経過すると、強制的に実行可能状態に移動させられます。また、実行中に入出力処理等が始まったときは、待ち状態に移り、入出力処理が終わったら、待ち状態から実行可能状態に移行します。
システムによっては、プロセスの中断・再開も可能になっています。この場合には、上記の3つの状態に加えて、「実行可能中断状態」、「待ち中断状態」を含めた5つの状態で管理する必要があります。
プロセスを消滅させる場合には、使用中の資源(メモリ領域など)を全て返却して消滅させます。消滅させるプロセスが子プロセスを持っている場合の処理についてはOSによって異なります。
3.2 メモリ管理
プログラムがプロセスとして機能する時にはメモリに領域を割り当てられている必要があります。コードやそれが必要とするデータがメモリ上にないと、CPUは仕事ができません。このメモリを管理するのがOSの役割です。メモリを管理するOSの一部をメモリマネージャといいます。
メモリの容量は大きければ大きいほどCPUにとっては好都合です。しかし、メモリは非常に高速に動作する記憶装置で、単位容量当たりの値段が非常に高価です。容量が大きいほど都合がいいと言っても、コストの面から限度があります。従って、メモリ管理では、小さな容量を有効に使いきる手法が求められます。
メモリマネージャの役割は、メモリのどの部分が現在使用中で、どの部分が未使用であるか記録し、プロセスが必要とする場合にメモリを割り当て、要らなくなったら解放することです。全てのプロセスに対してメモリを割り当てるには、容量が少し足りないという場合は、ハーディスク上に作られている退避場所(仮想メモリ)に一時的に退避させる(スワッピング)などの方法もとられます
メモリの管理は全部OSのメモリマネージャがやってくれますので、各アプリケーションは自分で必要とするメモリを要求するだけです。メモリが足りない場合には、メモリマネージャが何とかしてくれます。例えば、他のアプリケーションが確保しているメモリ領域が最近使っていないようなときは、それをディスクに退避するなりして、空けてくれる場合もあります。どうにもならないという場合は、エラーが返ってくるかもしれません。エラーが返ってきた場合はアプリケーションにはどうにもできません。いやでも受け入れるだけです。
3.3 ファイル管理
ファイル管理はプロセス管理、メモリ管理と並んでOSにとっては大変重要な機能です。
ファイルシステムはHDD(Hard Disk Drive)などの大容量の記憶システムを効率的に使うための工夫です。OSのプログラムも、キーボードやマウス、ディスプレイなどの周辺機器を動かすためのプログラム(ドライバーなどと呼ばれます)も、アプリケーションプログラムも、あるいはワードプロセッサーなどで作成したデータなども、コンピュータで利用するためにはどこかに保存しておく必要があります。この保存場所の候補として、HDDはCDやUSBメモリなどがあります。この保存場所に、データを置くときに整理整頓せずいい加減に置いておくと、後でそれを素早く取り出すことができませんし、効率的に保存することもできません。
ファイルシステムを導入すると、データを整理整頓することで、効率的に保存し、効率的に取り出すことができるようになります。たいていのOSはこのことを実現するためにディレクトリ(directory)という概念を使っています(Windowsなどは、フォルダー=folderという名前で呼んでいますが、実質は同じです)。プログラムやデータなどは全部ファイルという形で保存されます。ファイルシステムでは木構造が採用されています。木構造は木を逆さにした構造で、ルートや各節点(木の枝の付け根のこと、node)が、ディレクトリとなります。ディレクトリには名前が付けられ、ここにファイルが保存されますので、ルートからファイルを保存したディレクトリまでの名前を(スラッシュや\などで)つないで、最後にファイル名を付けると(これをパス名いいます)、ファイルを一意に特定することができます。
※OSによってはディレクトリやファイル名をつなぐのに、スラッシュ(/)ではなく、バックスラッシュを使うものもあります。
各ディレクトリにはそのディレクトリに中にある(配下の)ディレクトリと、ファイルが表示されています。実際は、そこにリンクが張られています。そして、その配下のディレクトリの1つに移動すると、またそのディレクトリに配下にあるディレクトリとファイルが表示される(リンクされている)という具合です。自分のシステムで確認してみてください。もし、Windowsを使っている場合は、powershellというツールがありますので、それを使ってください。古いバージョンのWindowsを使っている場合はコマンドプロンプトを使います。ここで、次のコマンドを実行します(コマンドを入力して、リターンキーを押します)。
ただこれだけです。
モードの列が"d"で始まっているのはディレクトリです。"-"はファイルになります。試しに、次コマンドを使って、ディレクトリを移動してみてください。
<directory name>には実際のディレクトリ名を入れてください。powershellから抜けるには、"exit"を実行してください。
※powershellの場合は、"dir"は"ls"でも構いません。上のディレクトリに移動するのは"cd .."です。ファイルを表示するには"cat <file name>"を実行します。catはファイルの中身を表示するだけで編集はできませんので、ファイルの中身を変更してしまうという心配はありません。
※ここでの説明に使用したpowershellはシェル(shell)というプログラムです。シェルはOSの一部ではありませんが、OSのユーザのためにOSとの仲立ちをしてくれるソフトウェアです。
3.4 その他の機能
これ以外のOSの機能としては、入出力デバイス(周辺機器や各種拡張カードなど)の制御があります。キーボードから打ち込まれたデータを読み取ったり、画像ディスプレイを制御したり、ディスプレイのどこでマウスがクリックされたかなどを読み取ったりしなくてはなりません。それ以外にHDDやプリンターの制御も必要です。また、ネットワークにつながっているのが普通ですから、イーサネットボード(LANカード、あるいはNIC)の制御も必要になります。これ以外ではグラフィックカードなどの各種拡張カードの制御も必要になります。
3.5 デバイスドライバー
デバイスドライバーは画像ディスプレイや、プリンタやイーサネットボード(NIC)などの入出力カードを制御して、アプリケーションに対してインターフェースを提供します。
キーボードやマウス、USBなどの共通化が進んだデバイスに関しては、OSが殆どの場合標準のドライバーを用意しています(ジェネリックドライバー)。標準ドライバーがサポートしていない場合に関しては、デバイスを提供するメーカー(ベンダー)がデバイスドライバーを製作してCD-ROMで添付しています。最近は、インターネット上のサイトからダウンロードすることも可能です。インターネットからのダウンロードを利用すると、いつでも最新版のデバイスドライバーを入手することができます。
OSが標準ドライバーを用意している場合でも、メーカーがドライバーを用意している場合もあります。OSが用意しているドライバーはデバイスを抽象化して、どのようなメーカーのデバイスでも共通して使えるようになっているのですが、そのデバイスを作製したメーカーのドライバーは、そのデバイスの機能を最大限引き出すように最適化されています。
3.6 API
アプリケーションからOSの機能を利用するための仕組み(仕様)を提供しているのがAPI(Application Programming Interface)です。アプリケーションソフトからOS内の機能を呼ぶ出す場合の仕様を定めています。OS内の機能を呼び出すためにシステムコールが用意されていますが、APIではシステムコール以外の機能を利用することもあります。いろいろありますが、そのための窓口、アプリケーションソフトとOSがやり取りするための窓口になっているのがAPIです。この辺はOSによっても若干ずれがありますが、とりあえずシステムコールや、システムコールに含まれないその他の雑多なことをするための窓口という風にイメージしておいてください。
APIはOSの機能の呼び出し手順や、記述方法などを定めています。APIが開発される以前は、OSの機能を呼び出すためのプログラムをその都度作る必要がありましたが、APIが登場してからは、APIが提供する機能はわざわざ作る必要がなくなりましたので、プログラム開発が効率的行えるようになりました。
APIの仕様が合っていれば、たとえ異なるOSでも同一のアプリケーションを利用することが可能です。
※APIは元々は1台のコンピュータ上で、アプリケーションからOSの機能を利用するために開発されたものですが、最近ではアプリケーションソフトが、自分の持つ機能を他のアプリケーションから利用できるようにするインターフェースとしても使われるようになっています。更に最近では、異なるネットワーク上で稼働するアプリケーション間でのインターフェースとしても利用可能なように機能が拡大されています。
4 マルチタスク とマルチスレッド
タスクはプロセスと同様の意味で使われることがあります。マルチタスクとは、同時に複数の(マルチな、multi)プロセスを起動させて動作させることです。複数のアプリケーションを同時に起動して利用する場合を考えてみましょう。例えば、音楽ソフトを立ち上げてBGM代わりに聞き、Webサーフィンをしながら、Wordなどのアプリケーションソフトで資料作りをするという場合は、CPUは同時に複数のプロセスを制御していることになります。これがマルチタスクです。
CPUは一度に1つの仕事(タスク)しかできません。3つのタスクを同時にしているように見えるのは、3つのプロセスに公平にCPUの利用権を割り振っているためです。
OSによって、アプリケーションが起動させられると、「プロセス」が生成されます。プロセスは、実行中のプログラムを表し、プログラム本体、CPUのレジスタ、プログラムカウンタの内容、メモリの内容などから成ります。プロセスを公平に扱うために、OSは一定時間経過したら、CPUの実行権を他のプロセスに渡さなくてはなりません。今まで、CPUを独占していたプロセスは、レジスタやプログラムカウンタなどの、次に実行権を得た場合に必要な情報をどこかに保存しておいて、CPUの実行権をOSに返却します。その後また、そのプロセスに利用権が回ってきたら、先ほど保存しておいた情報を復元して、プログラムの続きを実行して、一定の時間が経過したら、また実行権をOSに返却するということを繰り返します。このようにプロセスが順次CPUを独占する様子は、外部から見ていると複数のプロセスが同時に動いているように見えます。これが、マルチタスクです。
マルチスレッドのスレッド(thread)とは、「筋道」とか「脈絡」という意味で、プログラムの実行の流れを指します。通常は1つのプロセスには、1つのスレッドがあり、プログラムはこの流れに沿って実行されます。しかし、最近のアプリケーションソフトはやるべきことが多く、1つのプロセスの中を更に細分化して、同時実行する必要性が出てきています。1つのプロセスを複数のスレッドに細分化して、そのスレッドを同時並行的に実行します。これがマルチスレッドです。CPUやCPUコアが複数あるコンピュータでは同時に複数のスレッドを実行できますが、単一のプロセッサーでもCPUの利用時間を細かく分割して順番に割り当てることでマルチスレッドを実現できます。このようなスレッドの管理をプログラムの内部のコードで行っているのがユーザースレッド(user thread)、OSのカーネルで実現しているものがカーネルスレッド(kernel thread)です。
5 パソコンやサーバでよく利用されているOS
今日のコンピュータには、車の運転を安全に制御するためのいわゆる組み込み型コンピュータのようなものから、パソコン、サーバ、スーパーコンピュータに至るまで様々なタイプがあります。そして、いずれのコンピュータにもOSが搭載されています。
どのようなOSでもプロセス制御やメモリ管理のようなOSに本質的な機能は必要です。しかし、それ以外の機能については、そのコンピュータがどのような分野に応用されるかで、必要とされる機能はそれぞれ異なってきます。そのため応用分野毎にそれぞれ異なったOSが開発されることになります。
例えば車の運転を制御するための組み込み型のコンピュータの場合は、リアルタイム性が重視されます。できるだけ早く反応することが運転者や車を事故から守るために必要です。これに対して、パソコンやサーバなどはそれほどのリアルタイム性は必要ありません。
パソコンではウィンドウシステムやグラフィカルな機能が求められますが、組み込みコンピュータやサーバには必要ありません。何れもCUIで十分です。サーバは多数のクライアントからのアクセスを処理する機能や、瞬時にレスポンスする能力などが求められますので、プロセス管理や、メモリ管理、スレッド処理やファイル管理の能力が求められることになります。
パソコン用のOSとしては、WindowsやMac OSなどがあります。サーバ用のOSとしては、UNIXやUNIX派生のLinuxやBSD(FreeBSD、NetBSD、OpenBSD、DragonFly
BSD)などがあります。
更新履歴
2017/9/16 作成
|