ソフトウェアは、ハードウェアと並ぶコンピュータの重要な要素です。 ハードウェアと比較すると、目に見えないだけに掴みにくい所のあるソフトウェアですが、実際にはどの様な仕組みになっているのでしょうか。 本稿ではコンピュータにおけるソフトウェアと呼ばれるものについて、いろいろと調査してみようと思います。
「コンピュータ」は、機械そのもの(目に見えるモノ)を指す「ハードウェア」と、物質以外の意味をなすモノを指す「ソフトウェア」とに分類できます。 物質でなければ何から作られているかと言うと、「プログラミング言語」と呼ばれるコンピュータ用の言語から作られています。 よって、ハードウェアとソフトウェアは対立をなす概念です。
ここで、ソフトウェアはさらに「システムソフトウェア」と「応用ソフトウェア」に分けられ、そのうちシステムソフトウェアは「基本ソフトウェア」と「ミドルウェア」に分類されます。 基本ソフトウェアは、Windowsなどのオペレーティングシステム(通称OS)を指し、その目的としては、ハードウェア資源の有効活用が挙げられます。 OSの基本構成は、カーネル、デバイスドライバ、ファイルシステムから成っており、そのうちカーネルは「核」を意味し、外部からの受付をし、段取りを決めてコンピュータに対し命令を行うものです。 ちなみにWindowsでは、95、98、Meでは「95カーネル」が、NTや2000、XPでは、異なる「NTカーネル」が使われています。
汎用コンピュータ用OSの用語に「タスク」があります。 また、コンピュータのすべての処理は「プロセス」単位で実行され、それを切り替えて処理しています。 複数の処理(例えば、PCで音楽ファイルを再生しながらWordで文書を作成することなど)を同時に行えるOSを「マルチタスクOS」と言い、マルチタスク環境では、ごく短時間に複数のプログラムの処理を切り替えることによって、あたかもそれらが同時に実行されているように見えます。 タスクやプロセスが投入されると、まずそれらは実行可能状態(Ready)におかれ、CPUの割り当てが来た時に実行状態(Running)に移ります。 そのまま処理が終了しなかった場合は待ち状態(Wait)となり、入出力動作完了割り込みにより実行可能状態へと戻ることになり、また実行状態でCUP割り当ての時間切れの場合は、直接、実行可能状態に戻ります。
タスクのスケジューリング方式には色々ありますが、その一つに「ラウンドロビン方式」があります。 この方式は、まず各プロセスにクォンタム(一定の時間)が与えられ、プロセスがクォンタムの終了時に実行中であれば、CPUは別のプロセスに与えられます。 この時、CPUを横取りされたプロセスは、待っているプロセスの最後尾に置かれます。 このシステムをタイムシェアリングシステム(TSS)と言います。 また、プロセスがクォンタムの終了前に終了するか、ブロックされると、その時点でCPUは別のプロセスに与えられることになります。 以上のことから、ラウンドロビン方式はTSSのスケジューリングに適しており、優先順位に基づくスケジューリングと組み合わせることで、長く待たされているタスクを実行させることが可能になります。
また、タスクスケジューリングの他の方式に「FIFO(First in First out)方式」があります。 その名前の通り到着順方式で、要求された順にCPUを割り当て、実行され開始したプロセスは完了するまで実行されます。 この方式は単純かつ公平ですが、応答時間が長くなりTSSには向きません。 また、Windows、Unixなどで用いられる方式として「プリエンプション方式」があります。 これは優先度の高いタスクが実行可能状態になると、優先度の低いタスクの実行を中断して、優先順位の高いタスクを実行させる方式です。
CPUのスケジューリングをするタスクスケジューリングとは別に、CPU、入出力装置(I/O)、メモリ、補助記憶装置などのシステム資源のスケジューリングをするものとして「ジョブスケジューリング」があります。 ジョブの実行制御は、「ジョブの投入」→「イニシエータ」→「CPU」→「ターミネータ」→「ジョブの終了」となります。 この時イニシエータでは、ジョブを受け取り、スケジューラワークエリアに実行のための制御ブロックを書き込みます。 その後ジョブステップ単位で資源を割り当て、プログラムをローディング(Load)し、処理をタスク管理に渡します。 CPUでは処理が実行され、ターミネータではシステム資源の解放と、プログラムのアンローディングがなされます。
次にコンピュータのメモリ管理(記憶管理)に関してです。 コンピュータの記憶装置には、メインメモリを表す「主記憶装置」と、ハードディスクに代表される「補助記憶装置」があります。 この2つの記憶装置のうち、前者は後者に比べコストが高く、限られたメインメモリを有効に活用するため、主記憶管理にはいくつかの方式があります。
最初に最も単純な方式として「単一連続割り当て方式」があります。 これはプログラムをメモリの空き領域に順に入れていく方式で、シングルタスク向きの方式です。 別の方式として「可変区画方式」があります。 これはプログラムが実行されるたびに、必要なだけの大きさをメモリの上から割り当てるものです。 この方式はメモリの断片化(フラグメンテーション)を起こしやすいため、空き領域を一つにまとめることが必要になります。
また、実行したいプログラムの大きさがメインメモリの大きさを上回った場合、オーバレイ方式が用いられます。 この方式では、プログラムの中の使用頻度が高い部分をメモリに常駐させ、使用頻度の低い部分は必要に応じて補助記憶から読み込みます。 この場合、プログラムもオーバレイに対応している必要があります。 こういった補助記憶装置を用いて、実際のメインメモリ以上の容量のアドレス空間を作り出すことを「仮想記憶」と呼びます。
次に入出力制御について。 現在、CPU、MPUは急激に高速化していますが、入出力装置の速度はそれほど速くなっておらず、プログラムのボトルネックは入出力と言えます。 入出力制御には「直接入出力制御方式」、「チャネル方式」、「DMA方式」があります。 まず「直接入出力制御方式」について、これは昔のコンピュータで使われていた方式で、CPUが直接、入出力の制御をします。 こうした場合どうなるかと言うと、パソコンでプリントアウトをしていると、例として、キーボードやマウスが反応しなくなったり、ディスプレイに表示されている表示が変わらないなどの状態を起こします。 「チャネル方式」は主に大型コンピュータで用いられます。 チャネルという入出力制御のための専用装置を用い、CPUの指示により、CPUとは独立、並列に入出力の処理をします。 「DMA(Direct Memory Access)方式」は、主に一般的なパソコンで用いられるもので、チャネルよりも低機能、低コストです。 これはCPUの制御を受けずに、入出力装置と主記憶装置の間のみでデータ転送を行う方式です。
次にコンピュータの言語についてです。 コンピュータの内部は「0」と「1」の2つ記号から成る二進法の世界です。 昔は「ワイヤードロジック」という電線の結びかえでこれを表していましたが、現在では「プログラミング言語」が用いられています。 これは人工的に作り出されたもので、人間が普段自然に使っている言語と異なって文法が明白になっており、コンピュータで処理して0と1の世界にできるようになっています。
コンピュータでプログラム言語を処理するものが「言語プロセッサ」で、それは変換系、生成系、実行系の3つに分類されます。 変換系はソースプログラム(原始プログラム)から別のプログラムに変換するものです。 生成系に「ジェネレータ」と呼ばれるものがあり、これはデータ、手順、条件などから機械語プログラムを生成するものです。 実行系には「シミュレータ」、「エミュレータ」があり、前者は別のマシンの機械語コードを変換して実行するもので、後者はハードウェアに近いレベルでシミュレータを実現したものです。
変換系言語プロセッサの代表的なものに「コンパイラ」があります。 その変換プロセスですが、まずソースプログラムを読み込みます。 次に字句解析を行い、プログラムを文法上意味のある単語や演算子などの字句(トークン)に分割します。 その後、構文解析、意味解析のチェックをし、中間言語の生成をします。 中間言語には、式を左から見て演算子を右の数(ある場合のみ)の右に置きながら計算していく「ポーランド記法」と、式を左から見て、演算子が出てきたら、その前の2つの数について演算を行う「逆ポーランド記法」などがあります。
例として「A=(B+C)/D」をポーランド記法で表すと「=A/+BCD」となり、逆ポーランド記法で表すと「ABC+D/=」となります。 中間言語の生成後、演算の実行効率を上げるための最適化をし、最後に目的コードの生成をします。
プログラミング言語には様々なものがあります。 代表的なものを挙げていくと、主に科学技術計算で用いられる「FORTRAN」、FORTRANの入出力を簡素化したものである「BASIC」、事務計算に用いられる「COBOL」、科学技術計算に用いられ、再起呼び出し可能な「ALGOL」、ALGOLがベースで、教育用に用いられる「Pascal」、Pascalがベースで、大規模システム用の「Ada」、Unixの開発用である「C」、科学技術と事務用計算両用の「PL/1」、リスト処理のための「LISP」、論理型で証明や人工知能に用いられる「Prolog」、科学技術計算用の「APL」、Cをベースにした「C++」、ネットワークで用いられる「Java」などです。