基本ソフトウェアについて



## OSとは
OS（オペレーティングシステム）


つまりPCをPCとして使えるようにするのが仕事
**ハードウェアとソフトウェアの仲立ち役**をしている


### 基本ソフトウェア
OSのこと
コンピュータ内部のハードウェア、メモリ管理、ファイル管理、そしてアプリケーションに
実行機会を与えるタスク管理などを行う

### 応用ソフトウェア
ワープロや表計算などのアプリケーションソフトのこと


## ソフトウェアを分類

細かく分類するとこのような図となっている
![ソフトウェア.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1803385/8390d17e-073c-7da6-64a3-9d4358a72bfd.png)


#### ミドルウェア
特定の用途に特化し、基本ソフトウェアと応用ソフトウェアの橋渡しが役目
多数の応用ソフトウェアが使うであろう機能だが、基本ソフトウェアが有していないもの
データベース管理ソフトウェア、各種開発支援用ソフトウェアがある
データベースを利用したい応用ソフトウェアのためにデータを提供するなど

#### システムソフトウェア
基本ソフトウェアとミドルウェアの総称

### 基本ソフトウェア３種類のプログラム

#### 制御プログラム
ハードウェアの管理し、応用ソフトウェアやミドルウェアからコンピュータが効率的に動けるように
働く
OSの中核であり**カーネル**と呼ぶ
カーネルは２種類に分類される

#### マイクロカーネル
メモリ管理やプロセス管理に機能を限定


#### モノリシックカーネル
多くの機能を網羅


制御プログラムこそ狭義のOSとして基本ソフトウェアの核である


#### 言語処理プログラム（言語プロセッサ）
プログラミング言語で書かれたプログラムをコンピュータのために翻訳するプログラム

#### サービスプログラム
ファイル圧縮プログラムなどコンピュータの機能を補う補完的なプログラム
ユーティリティともいう

### 代表的なOS
#### Windows
Microsoft社製OS

GUI（グラフィックユーザインタフェース）採用
マウスなどポインティングデバイスを使い画面を操作してコンピュータに命令を伝える

#### Mac OS
Apple社製OS
クリエイティブ方面で多く利用されている
GUIを実装したOSの先駆け

#### MS-DOS
Microsoft社製OS
Windows普及前に広く使われていた

CUI（キャラクタユーザインタフェース）採用
キーボードを使って文字ベースのコマンドを入力しコンピュータに命令を伝える

#### UNIX
サーバに使われるOS
大勢のユーザが同時に利用できるよう考えられている

#### Linux
UNIX互換OS

プログラムの元となるソースコードが公開されていて（オープンソース）無料で
利用できる


## API（アプリケーションプログラムインタフェース）

OSはハードウェアとアプリケーションの仲立ち役

OSはハードウェアの違いや入出力を全てブラックボックス化しアプリケーションから見えなくしているので、
アプリケーションがハードウェアを意識することはない

**アプリケーションはOSに指示によりハードウェアを使っている**

OSはアプリケーションが自身の各種機能を使えるよう呼び出せる仕組みを用意しており
このために設けられたインタフェースを**API**という

例えば
ファイルの保存、読込、削除、画面の更新、メッセージ表示など

### APIのメリット

* 開発効率アップ
   APIを呼び出すだけなのでアプリケーションの開発が楽
* 操作性の統一
  アプリの基本的な動きが共通化され操作に迷わない
* 互換性の確保
  ハードウェアが別でもOSが同じなら動作する


## ジョブ管理

#### ジョブ

一連の仕事のこと
利用者は処理させたいジョブを指示書に書きコンピュータに投入する

たとえば

1.データ収集
2.給与計算
3.明細票印刷

などを一連で処理させる
これを**バッチ処理**という

## ジョブ管理の流れ

**カーネルがジョブ管理機能を持っている**


#### マスタスケジューラ

ジョブ管理機能と利用者との間にある管理プログラムのこと
利用者はマスタスケジューラに対しジョブの実行をしてもらう

マスタスケジューラは
* 実行状態の監視
* 必要なメッセージを利用者にお知らせ

が主な仕事

#### ジョブスケジューラ

マスタスケジューラはジョブの実行をジョブスケジューラに依頼する

ジョブスケジューラの仕事は
* リーダ
     依頼されたジョブを待ち行列に登録

* イニシエータ
  優先度の高いジョブを分解（**ジョブステップ**）
  実行はジョブステップごとに行われる 
  ハードウェア(CPUや主記憶装置)に割り当てる


* ターミネータ
  実行終了したジョブを出力待ち行列に登録
  ここで、ジョブに割り当てられていたハードウェア(CPUや主記憶装置)の容量を解放する

* ライタ
  優先度の高い順にジョブ結果を出力



#### スプーリング

ジョブの実行、出力処理はCPUから磁気ディスクに移される
これは**CPUと入出力装置の速度が違うから**
一時的に磁気ディスクに蓄えておけばCPUは次の仕事ができる

これを**スプーリング**という


## タスク管理

コンピュータから見た仕事の単位

ジョブステップの実行準備が完了するとタスクが生まれる

要は...
アイコンクリックしたり、プログラム打ち込んで起動させたりして
**プログラムが実行状態に入ること**

### 生まれたタスクの３つの状態

* 実行可能状態（READY）
  待ち行列に並んでCPUの使用権を待っている状態
* 実行状態（RUN）
  CPUの使用権を与えられ実行中の状態

* 待機状態（WAIT）
  入出力処理が発生し、それの終了待ち状態

### ディスパッチャ

タスクにCPUの使用権を割り当てる管理プログラムの役割のこと


### タスクスケジューリング

使用権の割り当てを決めること
決め方には３種類ある

* 到着順方式
  実行可能状態のタスク順使用権を割り当てる方式

* 優先順方式（プライオリティ方式）
  優先度を加味し、実行する実行中に別の優先度の高いタスクが出てきたら
  そっちに使用権を奪われる

* ラウンドロビン方式
  使用権を一定時間ごとに切り替える


### マルチプログラミング

**タスク管理ではいかにCPUを効率よく活用できるかが大事**

プログラムはCPUと入出力装置がそれぞれの処理を繰り返しながら動いている
つまり、それぞれの処理中は休み時間

#### マルチ（多重）プログラミング

休み時間に別プログラムの処理を実行させれば有効活用させる

#### 割り込み処理

プログラムの実行中に、入出力処理が行われたり、一定時間経ったりしたら、
ディスパッチャが割り込み処理を行い、実行を一旦ストップさせる

マルチプログラミング必須機能

* 内部割込み
  プログラム割込み、SVC割込み

* 外部割込み
  入出力割込み、機械チェック割込み、コンソール割込み、タイマ割込み



## 実記憶管理

プログラムを実行するにはまず、プログラムを主記憶上にロードしてから実行されるのが主流

ロードする際には、プログラムをどのように並べるかが味噌となる
**変な並べ方をすると容量は十分なのに、うまくはまらなくなるから**

### 固定区画方式

固定した大きさの区画を設けてパーテーションで区切り、
そこにプログラムをはめ込むスタイル

#### 単一区画方式

一つの区画しかないので、一つのプログラムしかロードできない
マルチプログラミングには使えない

#### 多重区画方式

複数の区画を用意してそこにロードする
区画サイズが均等でなくてもいい

デメリットは
* 区画内に収めたあと、余った分は使用できない
* 区画サイズ以上のプログラムはロードできない

### 可変区画方式
プログラムをロードするタイミングで必要なサイズに区切る方式


デメリット
* フラグメンテーションの発生

#### フラグメンテーション
ロードしたプログラミムが順番に実行されないと、実行後に隙間ができるので、
容量は足りていても、新しいプログラムがロードできない状態になること

![フラグメンテーション.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1803385/6b48b632-3471-f36e-13bc-9e677ad6fae5.png)
この状態から処理が実行されると隙間ができる

![フラグメンテーション３.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1803385/96ccf245-0562-05f9-933a-c79915a9a833.png)

これに新しいプログラムをロードしようとしても...
![フラゲ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1803385/a560a091-3136-ba53-cb18-4a91fca539e7.png)


入らない


これを解決するには、メモリコンパクション（ガーベジコレクション）を行う

#### メモリコンパクション（ガーベジコレクション）

ロードされているメモリを再配置し、**連続状態に直す**こと

![歩2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1803385/53d08a6f-f76b-756e-4a47-e14b7d9830d4.png)


### オーバーレイ方式

プログラムが主記憶装置以上の容量の時に有効

プログラムを**セグメント単位**に分けて、それぞれ実行するときにセグメント単位でロードする

### スワッピング方式

優先度の高いプログラムがきたら実行中のプログラムは一旦中断される
そんなときに主記憶装置内に留まっていたら邪魔なので、
**補助記憶装置に避難**させる

またプログラムを再開するときは、補助記憶装置から再び主記憶装置に移動する

## プログラムの４つの性質


* 再配置可能（リローケタブル）
  主記憶上をたくさん移動しても実行することができる性質ベースアドレス方式を使い
  場所を特定できるようになっている
  
#### ベースアドレス方式
プログラムが主記憶にロードされた時の先頭アドレスを使い場所を特定する方式

* 再使用可能（リユーザブル）
  実行終了したプログラムを破棄せず主記憶上においておき、再使用できる性質


* 再入可能（リエントラント）
  再使用可能プログラムが、複数のタスクから呼び出されても干渉することなく
  処理を実行できる性質

* 再帰的（リカーシブル）
  プログラム実行中に自分自身を呼び出し、処理すること

## 仮想記憶管理


仮想的なメモリ空間をプログラムに使わせることが目的
これによって容量が足りないとか、区画が合わないなどの物理的な問題がなくなる

**実態は主記憶装置と補助記憶装置を合わせたメモリ空間**

プログラムからは大量のメモリ空間に見える

#### メモリ変換ユニット

仮想記憶上にロードしたプログラムには仮想アドレスが割り当てられるが、実際に入っている実記憶装置内でも実アドレスが割り当てられる
これを対応させる役割
この仕組みを**動的アドレス変換機構**と呼ぶ


### ページング方式

仮想アドレス空間を決まった容量で分けて管理する方式

プログラムを**ページ単位**に分けて管理する

1.まずは補助記憶装置にページがロードされ、仮想記憶にも入る
2.実記憶にはまだ何も入っていない状態
3.いざ実行するときになったら仮想記憶は実記憶にアクセスしようとするが、このときには実記憶にはまだ
  何も入っていない
4.なので補助記憶から必要なページだけ実記憶に読み込まれる（ページイン）



#### ページテーブル
仮想記憶と実記憶の対応付けが管理されている

![スクリーンショット 2021-11-03 21.32.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1803385/0aa2236f-378a-8486-3ac9-0484410a4117.png)


### ページアウト

実記憶が容量いっぱいの時は補助記憶にプログラムを移すこと
新しくロードするプログラムのために容量を空けないとダメ
ただし闇雲にページアウトさせるわけではない

* FIFO（First In First Out）方式
  First In（最初に）ページインしたページをページアウト

* LIFO（Last In First Out）方式
  Last IN（最後に）ページインしたページアウト

* LRU（Least Recently Used）方式
  一番長い時間参照されていないページをページアウト

* LFU（Least Frequently Used）方式
  一番参照回数が少ないページをページアウト

### ページングとスワッピングの違い

* ページング
  ページ単位で領域の出し入れを行う

* スワッピング
  プロセス（タスク）単位で領域の出し入れを行う




>参考書籍
>>きたみりゅうじ　『キタミ式　イラストIT塾　基本情報技術者　令和０３年』 技術評論社 2020年