基本ソフトウェア

現在勉強している基本情報技術者試験についてまとめたものです。
自分のアウトプット用なので見やすさなどは期待しないでください。

# 基本ソフトウェア
**OS(Operating System)**
コンピューター内部のハードウェアや様々な周辺機器を管理する他、メモリ管理、ファイル管理、アプリケーションに実行機会を与えるタスク管理などを行う。
ソフトウェアの分類は下記のようになっている。

応用ソフトウェア
　|↑　　　↓↑
　|　|　ミドルウェア
　↓|　　　↓↑
基本ソフトウェア
　　　↓↑
　ハードウェア

基本ソフトウェアは更に下記の3つのプログラムに分けることができる。

・制御プログラム
ハードウェアを管理して、応用ソフトウェアやミドルウェアからコンピューターが効率的に利用できるために働くソフトウェア。
一般にこのプログラムのことを**カーネル**と呼び、メモリ管理やプロセス管理などに機能を限定した**マイクロカーネル**と、多くの機能を網羅した**モノリシックカーネル**に分けられる。

・言語処理プログラム（言語プロセッサ）
プログラミング言語で書かれたプログラムを、コンピューターが理解できる機械語に翻訳するプログラム。

・サービスプログラム
コンピューターの機能を補う補助的なプログラム。

代表的なOSには下記のようなものがある。

|||
|:-:|:--|
|Windows|現在最も広く使われている、Microsoft社製のOS。|
|Mac OS|グラフィックデザインなど、クリエイティブ方面でよく利用されているApple社製のOS。|
|MS-DOS|Windowsの普及以前に広く使われていたMicrosoft社製のOS。|
|UNIX|サーバーなどに使われることの多いOSで、大勢のユーザーが同時に利用できるように考えられている。|
|Linux|UNIX互換のOSで、オープンソースのソフトウェアなので無償で利用することができる。|

**GUI(Graphical User Interface)**
画面にアイコンやボタンを表示して、それを視覚的に操作することで命令を伝える操作方法。

**API(Application Program Interface)**
OSが持つ各種機能をアプリケーションから呼び出せる仕組みのために設けられたインターフェイス。
APIを利用することで開発効率アップ、操作性の統一、互換性の確保などのメリットがある。

# ジョブ管理
**ジョブ**
利用者からみた仕事の単位のことで、**ジョブ制御言語(JCL:Job Control Language)**を使って記述する。

**マスタスケジューラ**
カーネルが持つ機能であるジョブ管理と、利用者との間を橋渡しする管理プログラム。

マスタスケジューラはジョブの実行を**ジョブスケジューラ**に依頼し、自身は実行状態の監視に努め、必要に応じて各種メッセージを利用者に届ける。
依頼を受け取ったジョブスケジューラは、下記の流れでジョブを実行していく。

1. リーダ
依頼されたジョブを入力して、ジョブ待ち行列に登録する。

2. イニシエータ
優先度の高いジョブを持ってきて、細かいジョブ（**ジョブステップ**）に分解する。

3. ターミネータ
実行を終えたジョブに割り当てられていたハードウェア資源を開放して、ジョブの結果を出力待ち行列に登録する。

4. ライタ
優先度の高いものから順に、ジョブ結果を出力する。

**スプーリング**
低速な装置とのデータのやり取りを、高速な磁気ディスクを介して行うことで処理効率を高める方法。
これにより、単位時間あたりに処理できる仕事量（**スループット**）を高めることができる。

**タスク（プロセス）**
コンピューターから見た仕事の単位で、ジョブステップの実行準備が整うことで生成される。
タスクには次の3つの状態がある。

・実行可能状態(READY)
いつでも実行が可能なCPUの使用権が回ってくるのを待っている状態。

・実行状態(RUN)
CPUの使用権が与えられて、実行中の状態。

・待機状態(WAIT)
入出力処理が発生したので、その終了を待っている状態。
この状態からいきなり実行状態にはなれないので、必ず一度実行化の状態に戻る必要がある。

**ディスパッチャ**
実行可能状態で順番待ちしているタスクに、CPUの使用権を割り当てる（**ディスパッチ**）管理プログラム。

**タスクスケジューリング**
どのタスクに使用権を割り当てるかを決めるために、タスクの実行順序を定めること。
代表的な方式は下記の3つがある。

・到着順方式
実行可能状態になったタスク順に、CPUの使用権を割り当てる方式。
タスクに優先度の概念がないので、実行の途中でCPU使用権が奪われることはない（**ノンブリエンプション**）。

・優先順（プライオリティ順）方式
タスクにそれぞれ優先度を設定し、その優先度が高いものから順に実行していく方式。
実行中のタスクよりも優先度が高いものが待ち行列に追加されると、実行の途中でCPU使用権が奪われる（**ブリエンプション**）。

・ラウンドロビン方式
CPUの使用権を、一定時間ごとに切り替える方式。
最初は到着順方式で割り当てられるが、既定の時間内に処理が終わらなかった場合は、次のタスクに使用権が与えられ実行中だったタスクは待ち行列の最後に回される。

**マルチ（多重）プログラミング**
複数のプログラムを見かけ上同時に実行することで、CPUの遊休時間（**アイドルタイム**）を減らし利用効率を高める為のもの。

**割り込み処理**
実行中のタスクを中断して別の処理に切り替え、そちらが終わるとまた元のタスクに復帰する処理。
割り込み処理は以下のように分けられる。

内部割込み

|||
|:-:|:--|
|プログラム割込み|ゼロによる除算や桁あふれ、仮想記憶において存在しないページへのアクセスが生じたり、書き込み出来ない主記憶装置に書き込もうとした記憶保護例外などの場合に生じる。|
|SVC(Super Visor Call)割込み|入出力処理を要求するなど、カーネル呼出し命令が発行されたときに生じる。|

外部割込み

|||
|:-:|:--|
|入出力割込み|入出力装置の動作完了時や中断時に生じる割り込み。|
|機械チェック割込み|電源の異常や主記憶装置の障害など、ハードウェアの異常発見時に生じる。|
|コンソール割込み|オペレータによる介入が行われたときに生じる。|
|タイマ割込み|既定の時間を過ぎたときに生じる。|

# 実記憶管理
**実記憶管理**
限られた主記憶空間を、効率良く使えるようプログラムに割り当てることが役割。

**固定区画方式**
主記憶に固定長の区画（**パーティション**）を設けて、そこにプログラムを読み込む管理方式。
全体を単一の区画とする**単一区画方式**と、複数の区画に分ける**多重区画方式**がある。
単純な仕組みなので記憶管理は簡単だが、区画の融通が利かないので利用効率はあまり良くない。

**可変区画方式**
プログラムをロードするタイミングで必要なサイズに区切る管理方式。
区画内に余剰スペースが生じないので、利用効率は良くなる。

しかし、詰め込んだプログラムの終了するタイミングはバラバラなので、主記憶の空き容量自体がプログラムの実行に足るサイズであったとしても、それを連続した状態で確保することがでない**フラグメンテーション（断片化）**が発生してしまう。

これを解消するには、ロードされているプログラムを再配置することによって、細切れ状態にある空き容量を連続した一つの領域にする**メモリコンパクション**もしくは**ガベージコレクション**と呼ばれる操作をする必要がある。

**オーバーレイ方式**
実行したいプログラムのサイズが主記憶の容量を超えていた際にロードできるようにするための工夫。
この方式では、プログラムを**セグメント**という単位に分割しておいて、その時に必要なセグメントだけを主記憶上にロードして実行する。

**スワッピング方式**
優先度が高いプログラムによる割り込みなどが発生した場合、そのプログラムをロードするための容量を確保する必要がある。
その際、優先度の低いプログラムが使っていた主記憶領域の内容を、一旦補助記憶装置に丸ごと退避させる方式。

補助記憶装置に退避させることを**スワップアウト**、退避させたプログラムを再び主記憶へとロードすることを**スワップイン**といい、この2つを合わせて**スワッピング**という。

**再配置可能（リロケータブル）プログラム**
ベースアドレス指定などを用いて、プログラムが主記憶上のどこにロードされても実行できるような性質をもったプログラム。
他にも下記のような性質がある。

・**再使用可能（リユーザブル）**
主記憶上にロードされて処理を終えたプログラムを、再ロードすることなく繰り返し実行出来て毎回正しい結果を得ることができるという性質。

・**再入可能（リエントラント）**
再使用可能プログラムにおいて、複数のタスクから呼び出しても互いに干渉することなく同時実行できるという性質。

・**再帰的（リカーシブ）**
実行中に自分自身を呼び出すことができるという性質。

# 仮想記憶管理
**仮想記憶**
主記憶や補助記憶の存在を隠ぺいすることで、広大なメモリ空間を自由に扱えるようにするもの。
実際にロードされるのは実記憶だが、連続した仮想記憶のプログラムをバラバラに実記憶に対応付けするので、実記憶の物理的制約を考えなくてもよくなる。

この時の変換処理をメモリ変換ユニットというハードウェアが行う仕組みを**動的アドレス変換機構(DAT:Dynamic Address Translator)**と呼ぶ。

また、実記憶の他に補助記憶装置を用いることで、より大きな容量を確保することができる。

**ページング方式**
プログラムを**ページ**という単位に分割して管理する、仮想記憶の実装方式。
現在は、初めに仮想記憶にだけプログラムを読み込み、実行した際のページフォールドにより必要なページだけを実記憶に読み込む方法が主流。

**ページテーブル**
仮想記憶と実記憶を対応付けした表。
目的のページが実記憶にない場合は補助記憶装置から読み込まれるが、ページ読み込みのことを**ページイン**、実記憶から補助記憶装置にページを追い出すことを**ページアウト**という。

この時、実記憶の容量が少なくページの置き換えを必要とする頻度が高くなり、システムの処理効率が極端に低下することを**スラッシング**という。

どのページを置き変えるかのアルゴリズムには以下のようなものがある。

|||
|:-:|:--|
|FIFO(First In First Out)方式|最初にページインしたページを追い出し対象にする。|
|LIFO(Last In First Out)方式|最後にページインしたページを追い出し対象にする。|
|LRU(Least Recently Used)方式|最も長い間参照されていないページを追い出し対象にする。|
|LFU(Least Frequently Used)方式|最も参照回数の少ないページを追い出し対象にする。|