ソフトウェア

# ソフトウェアの分類
![ソフトウェアの分類_最新.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2746950/6c04f560-7d19-6462-78b4-70449da77d4b.jpeg)
- **基本ソフトウェア**（**OS**）：ハードウェアやアプリケーションソフトウェアを制御するソフトウェア　例）Windows、mac OS、Linux
    - **ミドルウェア**：OSとアプリケーションソフトウェアの中間で動作するソフトウェア　例）DBMS
    - OS（狭義の基本ソフトウェア）：ハードウェアを制御するソフトウェア
- **アプリケーションソフトウェア**（**応用ソフトウェア**）：様々な業務で使用されるソフトウェア　例）ワープロソフト、給与計算ソフト、販売管理ソフト
- **API（Aplication Program Interface）**：　アプリケーションからOSが用意する機能を利用するための仕組み
    - 処理内容を一から記述する必要はない　→ APIを使うと効率良く開発

# OS（Operating System）
コンピュータシステム全体を管理施御するソフトウェア
＊　 **デバイスドライバ**：　PCに接続した周辺機器を制御するソフトウェア　
例）　プリンタを追加　→ プリンタドライバをインストールする必要あり
＊　**プラグアンドプレイ**：　プラグを挿すだけで、設定してくれる機能（OSに周辺機器のデバイスドライバが多数内臓）

## OSS（オープンソースソフトウェア）
ソースコードを公開している/原則無保証 ソフトウェア　（目的）誰でもいじれる　→ ソフトウェアを発展させよう！
（OSSの最低条件）
・　**配布先：個人・グループを制限しない**
・　**再配布：追加ライセンスを要求しない**
・　**特定製品に限定したライセンスにしない**

＊　**ディストリビューター**：　用途に応じて OS・GUI・アプリを組み合わせる（パッケージ化）　→ 再配布する団体

## OSSのライセンス
- **BSDライセンス**：　無保証・再配布の時：元の著作権・ライセンス条文は残す　制約
- **GPL**：　BSDライセンス　＋　**コピーレフト**　制約
    - **コピーレフト**：　著作権保持　→ 複製・改変を制限しない｜２次著作物　→ オリジナルと同じ配布条件

||保証|元ソースの著作権・ライセンス表示|変更の表示|ソースコードの開示|別のライセンスにする|
|:--:|:--:|:--:|:--:|:--:|:--:|
|BSD|無保証|必要|必要なし|必要なし|可能|
|GPL|無保証|必要|必要|必要|禁止|



## 主なOSの種類
|種類|説明|
|:--|:--|
|Windows|Microsoft社が提供するOSで、現在最も広く普及しているOS|
|UNIX|アメリカAT&T社のベル研究所で開発されたOS|
|Linux|フィンランドの大学生が開発したOS|
|Mac OS|Apple社のPC用のOSで、Macシリーズに搭載されている専用のOS|
|iOS|Apple社の携帯端末に搭載されているOSで、Apple社のiPhone、iPadなどに搭載されている|
|Android|スマートフォン、タブレットPCなどの携帯情報端末に搭載されているOS|


## OSの機能
### １. メモリ管理
メモリを効率的に割り当てる機能
＊　**プログラム記憶方式**：　プログラムをHDDからメモリに移動→CPUが読み出して実行する→実行が終わったらメモリから消去　方式
#### ●仮想記憶管理
補助記憶の一部を主記憶に見せかけて、大きな記憶空間を作る方式
![仮想記憶.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2746950/2d550a7d-8c69-9f1a-6b1f-28b14ca266d0.jpeg)

- 仮想記憶（論理アドレス）：プログラムから見たメモリのアドレス
- 実記憶（物理アドレス）：実際に割り当てられているメモリのアドレス
- 動的アドレス変換機構（DAT）：論理アドレスから物理アドレスへ変換をする仕組み
- 補助記憶装置：仮想記憶は補助記憶装置もメモリの一部とみなす
→実記憶の容量より大きな記憶空間を作れる

##### ページング方式（仮想記憶の実装方法の一つ）
主記憶とプログラムを固定長（ページ：全て同じ大きさ）に分割して、ページ単位で管理する方式
■ 概要図
![仮想記憶方式.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2746950/6bfb2485-ddcf-a087-0bb1-75bd7456d6b7.jpeg)

- ページフォルト：実行するページが実記憶（主記憶装置）にない場合に起こる
- ページイン：実行するページが実記憶上にない時に、目的のページを補助記憶から実記憶に移動すること
- ページアウト：ページインする際に主記憶がいっぱいの時、実記憶から補助記憶にページを追い出すこと

＊スラッシング：ページフォルトが多発すると、処理効率が急激に低下する現象
→ 実記憶の容量が少なく、ページの置き換えが多発することで起こる

**ページ置き換えアルゴリズム**
「何をページアウトさせるのか」を決める方法が4つ
1. FIFO（First In First Out）方式
最初にページインしたページを追い出す
1. LRU（Least Recently Used）方式
最近、最も使われていないページを追い出す
1. LFU（Least Frequently Used）方式
最も参照回数の少ないページを追い出す

#### ●実記憶管理
主記憶装置を効率よく使う方式

##### 固定区画方式
主記憶装置をあらかじめ決まった大きさの区画に分割する方式
![固定区画方式.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2746950/b46e97b9-1306-afcb-c429-0cfc537411c8.jpeg)

##### 可変区画方式
主記憶装置をプログラムが必要とする大きさで分割する方式
![可変区画方式.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2746950/dc04a467-f1ee-d34e-142b-7ffe68157871.jpeg)
1. プログラムが必要とするサイズを確認
1. 主記憶装置にプログラムのサイズに合う区画を作る
1. 補助記憶装置から主記憶装置へプログラムをロードする

##### 可変区画方式で起こるフラグメンテーション・メモリコンパクション**
![実記憶管理のフラグメンテーション.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2746950/fd70fee0-f2b3-0de8-30ee-768eb19e00da.jpeg)
＊主記憶装置にあるプログラムが終了していくと、空きスペースを連続した状態で確保できない
→　**フラグメンテーション**

＊フラグメンテーションを解消するために、ロードされたプログラムを再配置する
→ **メモリコンパクション（ガーベジコレクション）**

##### スワッピング方式
![スワップ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2746950/85760d55-aee3-803c-13f8-69837dab217e.jpeg)
・スワップアウト
主記憶にあるプログラムのうち優先順位の低いプログラムを補助記憶装置に移動させること
→ 主記憶装置にプログラムを格納できるスペースができる

・スワップイン
補助記憶装置に移動したプログラムを使用する場合、補助記憶装置に移動したプログラムを主記憶装置へ移動すること

・スワッピング
スワップアウトとスワップインを合わせた処理のこと

##### オーバーレイ方式
実行したいプログラムのサイズが主記憶の容量を超えていた時、ロードできない。。。
![オーバーレイ方式.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2746950/4c274f0f-601f-49d3-823b-d2cba30afc87.jpeg)
＊セグメント：プログラムをセグメントという単位で分割
＊プログラムは全機能が使われているわけでなない
→ 必要な機能だけ主記憶へロードすれば、プログラムのサイズが大きくてもロードできる

＊　**メモリリーク**：　使用できるメモリ容量が少なくなること
　→ （解消）**ガーベジコレクション**：　メモリリークを解消　→ 不要になった領域を解放する
### 2. ファイル管理
**ファイル**
データを一つの固まりにして記録する入れ物
→ アプリケーションソフトで作ったデータはファイルとして補助記憶装置に保存される
![ファイル.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2746950/4f2fec22-cec1-cad8-e234-848fdb0daaa7.jpeg)
＊代表的なファイル形式
テキスト形式・CSV形式・PDF
画像用のファイル形式：BMP・JPEG・GIF・PNG
音声用のファイル形式：MP3・MIDI
動画用のファイル形式：MPEG

**ディレクトリ**
ファイルをグループ化して整理するもので、補助記憶装置ではディレクトリで管理してる。
→ 補助記憶装置内では、ファイルを効率よく管理するために、ディレクトリは階層構造になっている
![ディレクトリ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2746950/b163cce2-44c4-afa9-f790-98866b6092b7.jpeg)
＊ルートディレクトリ（ / ）：階層構造の一番上にあるディレクトリ
＊サブディレクトリ：ディレクトリの中にあるディレクトリ
＊カレントディレクトリ：自分が今開いて作業しているディレクトリ

**パス**
目的とするファイルまでの経路のこと
- 絶対パス：スタート地点→　ルートディレクトリ
- 相対パス：スタート地点→　カレントディレクトリ

パスの書き方（スタート：dir-a1 ゴール：file-b2）
./../dir-a2/file-b2
＊　 . 　カレントデレクトリを指す
＊　.. 　1階層上のディレクトリに移動する
＊　　/ （￥）　　ディレクトリと次の階層の間を区切る
→ 先頭が　/ の場合　：ルートディレクトリを指す

#### データのバックアップ
ハードディスクの障害に備える　→ データをバックアップ
（バックアップ方法）
|方法|内容|
|:--|:--|
|**フルバックアップ**|全てのデータ→バックアップ|
|**差分バックアップ**|前回フルバックアップ以降の変更データ→バックアップ|
|**増分バックアップ**|前回バックアップ以降の変更データ→バックアップ|

（8/1に50GBあり、それ以降毎日2GBずつデータが追加された場合）
8/5にHDDの障害が発生→8/4に復元するために必要なデータ　![フル_差分_増分_バックアップ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2746950/0e58ebcc-0a64-00d6-fcdd-fe42e5e63767.jpeg)
＊　フルバックアップ：　**バックアップの時間が長い・復元する時間は短い**
＊　差分・増分バックアップ：　**バックアップの時間が短い・復元時間は長い**

### ２. ジョブ管理（ジョブの入力と出力を管理）
ジョブ：人から見た仕事の内容
![ジョブとは.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2746950/e4c34fdc-ee8a-226d-6319-7e4e1b55595e.jpeg)
- ジョブ管理の流れ
1. コンピュータがジョブの実行を受け取る
1. 依頼されたジョブを**入力待ち行列**に登録し、処理されるのを待つ
1. ジョブを細かく分解（ジョブステップ）し、タスク管理にジョブステップの実行を依頼する
1. 実行が終わったジョブの結果を**出力待ち行列**に登録し、出力されるのを待つ

- スプーリング（spooling）
![スループット.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2746950/2e471b51-4b5f-9796-89fc-79d87096dd1c.jpeg)

・　CPUと入出力装置（キーボード・プリンタなど）の処理速度：CPUが早い
→ CPUが入出力装置の処理速度に合わせると、CPUのスループットが低下する
→ スループット（throughput）：一定時間あたりの仕事量

・　スプーリング：入出力データをハードディスクへ蓄えてCPUが入出力を待たなくて済むようにすること
→ CPUの待ち時間を削減し、スループットを向上させる
→ 入力データを一時的に蓄える：入力待ち行列
→ 出力データを一時的に蓄える：出力待ち行列



### 3. タスク管理
コンピュータから見た仕事の内容
![タスク管理とは.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2746950/5a7e9c0e-9ae9-f5b5-b1cf-465154debfa4.jpeg)
＊CPUは複数のタスクを同時に処理できるわけではない
→ タスクを処理するためには、CPUの所有権が必要
→ タスク管理の働きで、CPUの所有権をタスク同士で回しながら処理している
- タスクの状態遷移
生成されたタスク：3つの状態がある。
→ CPUの使用権をタスク同士で効率よく回すために、3つの状態を遷移する
1. **実行可能状態**（Ready）：CPUの使用権がくるのを待っている状態。タスク生成直後は、実行可能状態で待ち行列に並んでいる
1. **実行状態**（Run）：CPUの使用権が与えられ、実行中の状態
1. **待機状態**（Wait）：入出力処理が発生し、その終了を待つ状態
![タスクの状態遷移.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2746950/3f09b079-c5ae-cce9-43a3-ed3e33dae816.jpeg)
＊　「実行可能状態」のタスクがCPUの使用権を得られる
→ 「待機状態」になったタスクは、「実行可能状態」へ戻ってから、CPUの使用権を再度取得する。
＊　**ディスパッチ**（dispatch）：タスクにCPUの使用権を割り当てること

- **タスクスケジューリング**：「どのタスクにCPUの使用権を与えるか」の決め方
1. **到着順方式**：実行可能状態になったタスク順に与える
1. **処理時間方式**：処理予定時間が短い順に与える
1. **優先順位方式**：優先度の高いタスク順に与える
1. **ラウンドロビン方式**：CPUの使用権を、一定時間（**タイムスライス**）毎ごとに切り替える方式


- **マルチタスク**（マルチプログラミング）：複数のタスクが同時に実行されているように見せる方法
→ CPUを有効活用するために、CPUの**遊休時間**（アイドルタイム）を少なくする
![マルチタスク.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2746950/980db6ba-7b13-e922-14aa-936d11b19e68.jpeg)
＊　プログラムA・Bの処理総時間＝120＋120＝240ミリ秒
＊　遊休総時間＝40＋40＋35＋45＝160ミリ秒
![マルチタスク例.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2746950/6894c7da-f606-bcb7-806e-34102684efb9.jpeg)
＊　マルチタスクでのプログラムA・Bの処理総時間＝130ミリ秒
＊マルチタスクでの遊休総時間＝50ミリ秒
→ 処理効率が上がる

（タスクの実行方式）
＊　**ノンプリエンティブ方式**：　プログラムがCPUを管理する
＊　 **プリエンティブ方式**：　OSがCPUを管理する　（主流）　→ OSが実行中のタスク管理
（OSの機能）
＊ **マルチスレッド**
■ 目的
マルチコアCPU有効活用→複数コアでスレッド並行処理
■ しくみ
プログラム→**スレッド**（処理単位）に分解　→ 複数のスレッドを並行処理

- **割り込み処理**：実行中のタスクを中断して別の処理に切り替え、それが終わると元のタスク処理を再開すること
→ 2種類の割り込み
1. **内部割り込み**：実行中のプログラムが原因
- **プログラム割込み**
ゼロによる除算・桁あふれ・ページフォルト・例外
- **SVC割込**
プログラム　→ OSに入出力を要求した時（入出力動作待ち）

2.**外部割り込み**：プログラム以外が原因
- **入出力割込み**
入出力装置の入出力動作が完了したとき
- **機械チェック割込み**
ハードウェアの故障したとき(電源の異常・メモリの故障など）
- **タイマ割込み**
プログラムの設定タイムを過ぎたとき
- **コンソール割り込み**
利用者が介入したとき

＊　**待ち行列モデル**：　行列の平均待ち時間を求めるために使う
　→ **M/M/１ の待ち行列モデル**：　「客の到着：ランダム、レジの処理時間：客ごとにランダム、処理の窓口：１つ、先着順に処理、列への割込みはない」 条件で考える
　→ コンピュータ：　ジョブ→客、CPU→レジ　に当てはめて考える

４. ユーザーインタフェース（OSの操作の仕方）
ハードウェアを操作しているのはOSだが、OSを操作するのは人間
→ OSを操作するためのツールが必要になり、主に2種類ある。

- CUI（Character User Interface）：文字（コマンド）を打つことで操作する。操作画面をCLI(Command Line Interface)という
- GUI（Graphical User Interface）：グラフィックをマウスとキーボードを使って操作する。