基本ソフトウェアについて色々調べてみた（２）

どうも初めまして！　

最近基本情報技術者の資格取得に向けて勉強中な駆け出しエンジニアのワカです。

#■この記事を書こうと思ったきっかけ
最近書籍を購入して勉強しているのですが、暗記ばかりでなかなか身にならないと思いました。

そこで基本情報に書かれている内容を自分なりに解釈したものをここに備忘録として書き残すことにしました。
そうすれば手も動かせるし人にみられると思うとその分責任感出ますしね！

あと個人的に今自作PCを作りたいとも考えているのでこの機会に詳しくなっとこうと思ったのも理由の一つです笑

もしかすると間違っている点などあるかもしれませんので、その時は指摘していただけると嬉しいです。

#◼️ジョブ管理
利用者側からみた仕事の単位を**ジョブ**と呼びます。

OSは利用者が待たされなくて済むように時間のかかる処理を効率よく管理します。
このために**バッチ処理**と呼ばれる効率化の処理を次々登録することでコンピューターを遊ばせずにキリキリ働かせることができます。


例えば会社とかで顧客データとか、明細書などをコンピュータに登録して利益率を出す…。みたいな処理をまとめてジョブと呼ぶという認識でおk

##ジョブ管理の流れ
ジョブ管理の中でカーネルはジョブの順番を管理したりCPUに割り当てたりするなどを行っています。

このように利用者との間を橋渡しする管理プログラムが**マスタスケジューラ**です。利用者はこの管理プログラムに対してジョブの実行依頼をする形になります。

###マスタースケジューラ
 ジョブの実行を**ジョブスケジューラ**に依頼します。 自信は実行状態の監視に努め必要に応じて各種メッセージを 利用者に届けます

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

マスタスケジューラから受け取った情報は以下の流れでジョブを実行していきます。

| 工程名 | 説明 | 
|:-:|:--|
| リーダ  | 依頼されたジョブを入力してジョブ待ち行列に登録します  |   
| イニシエータ  | 優先度が高いジョブを持ってきてジョブステップに分解します <br>CPU や主記憶装置などハードウェア資源が空くの待ってジョブステップを割り当てその実行をタスク管理に依頼します。  |   
| ターミネーター  | 実行を得たジョブに割り当てられていたハードウェア資源を解放してジョブの結果を出力待ち行列に登録します  |   
|ライタ  |優先度の高いものから順にジョブ結果を出力します   | 



##スプーリング
CPU と入力装置とでは処理速度に大きな差があります
もし入力装置にCPUを付き合わせてしまうとCPU等は待たされるばかりで実にもったいないことになります。そこで行われるのが**スプーリング**です。

スプーリングとは 「**低速な装置とのデータのやり取りを高速な磁気ディスクを介して行うことで処理効率を高める方法**」のことです。

入出力どちらからも一度送られてきたジョブを一時的に蓄えておき、必要になった時に取り出せるような仕組みをとることで効率化を図ることができるわけです。（まあ簡単にいうとメモリ（主記憶装置）のような仕組みのことをいいます。）



#◼️タスク管理
タスクとはコンピューターから見た仕事の単位のことです。 （プロセスとも言いいます）

利用者から発生したジョブがジョブステップに分解された後にタスク管理に渡されることでCPUの実行単位であるタスクが生成されます。

タスク管理はタスクの状態を管理してCPUの使用権をそれぞれのタスクで共有させる目的があります


##タスクの状態遷移
生成されたタスクには次の三つの状態があります

生成されたタスクは即座に実行されるわけではなくタスクの実行には必ずCPUの使用権が必要になります。その使用権をタスク間で効率よく回すことができるように各状態を行ったり来たりすることになるわけです。

| 状態 | 説明 |
|:-:|:--|
|実行可能状態(Ready)   | いつでも実行可能なCPUの使用権が回ってくるのを待っている状態<br> 生成情報のタスクは この状態になってCPUの待ち行列に並んでいます  |
|実行状態(Run)   | CPU の使用権が与えられて実行中の状態  |
| 待機状態(Wait)  | 入出力処理が発生したので その処理を待っている状態  |

※ちなみに入出力処理で「待機状態」から「実行状態」への遷移はできません。必ず間に「実行可能状態」を挟む必要があります。

## ディスパッチャーと タスクスケジューリング

**ディスパッチャー**・・・実行可能状態で順番待ちしているタスクに「次出番ですよ」とCPUの使用権を割り当てる役割

**タスクスケジューリング**・・・タスクに使用権を割り当てる際に割り当ての実行順序を定める処理

### タスクスケジューリング の種類

| 方式名 | 説明 |
|:-:|:--|
| 到着順方式  |実行可能状態になったタスク順に CPU の使用権を割り当てる方式。 <br>タスクに優先度の概念がないので実行の途中でCPU使用権が奪われることがない（**ノンプリエンプション**）   |
| 優先順（プライオリティ順）方式  | タスクにそれぞれ優先度を設定し、優先度の高いものから順に実行していく方式<br>実行中のタスクよりも優先度の高いものが待ち行列に追加されると実行の途中でCPU使用権が奪われる（ **プリエンプション**）  |
| ラウンドロビン方式  | CPUの使用権を一定時間ごとに切り替える方式<br>実行可能状態になった順番でタスクに CPU使用権が与えられますが規定の時間内に処理が終わらない場合、次のタスクに使用権が与えられ実行中だったタスクは待ち行列の最後に回される  |
 
 
 

## マルチプログラミング
タスク管理の役割はCPUの有効活用に尽きます。つまりCPUの遊休時間（アイドルタイム）を最小限にすれば良いのです。
**マルチ（多重）プログラミング**・・・複数のプログラムを見かけ上同時に実行してみせることで遊休時間を減らし CPUの利用効率を高めようとするものです。

##割込み処理
割込み処理とは「**実行中のタスクを中断して別の処理に切り替えそちらが終わるとまた元のタスクに復帰する**」という処理のことです。

割り込み処理は実行中のプログラミングが原因で生じる**内部割り込み**とプログラム外の要因で生じる**外部割り込み**に分かれます。

###内部割り込み
| 名称 | 説明 |
|:-:|:--|
|プログラム割り込み   | ゼロによる除算や、桁あふれオーバーフロー、仮想記憶において存在しないページへのアクセス（ページフォルト）が発生したり書き込みできない主記憶 装置2 書き込もうとした記憶保護例外などの場合に生じる割込み  |
|SVC (Super visor Call)割り込み   | 入出力処理を要求するなどカーネル呼び出し命令が発行された時に生じる割り込み （Super visor：カーネル）  |
 
###外部割り込み

| 名称 | 説明 |
|:-:|:-:|
| 入出力割り込み  | 入出力装置の動作完了時 や中断時に生じる割り込み  |
| 機械チェック割り込み   | 電源の異常や主記憶装置の障害など ハードウェアの異常発生時に生じる割込み  |
| コンソール割り込み  | オペレータ利用者 による介入が行われた時に生じる割り込み  |
| タイマ割り込み  | 規定の時間を過ぎた時に生じる 割り込み  |
 
#■最後に

ここまで長々と読んでくださりありがとうございました！
少し説明がわかりにくかった部分があるかと思いますが、もしわからないところがあればコメントしていただけると嬉しいです。

では！次の記事にて！