タスク管理

# コンピュータの複数の処理
タスクとはコンピュータが```「実行中のプログラムですと識別する」```仕事の単位。
```プロセス```とも言われている。
厳密には違うが基本情報技術者では同じとしている。
コンピュータのコマンド、アイコンのダブルクリックしたりすると```プログラムがメモリにロードされて実行状態```に入る。これをタスクという。
コンピュータは一つのプログラムで動いていない。色んなプログラムが実行状態にある。

CPUは複数のことを同時に処理できるわけではない。
CPUの使用権を足す区間で持ち回り、割り込みを処理したりすることで実現できている。

## 気づき
クリックやキーボード、マウスはCPUの持ち回しで処理できているのか。
すごいな。

# タスクの状態遷移
タスクには３つの状態がある。
## 実行可能状態(READY)
いつでも実行可能なCPUの使用権がm割ってくるのを待っている状態。
この状態になってCPUの待ち行列に並んでいます。

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

## 待機状態(WAIT)
入出力処理が発生したので、その終了を待っている状態。

```実行可能状態```は```実行状態```になることができる
```実行状態```で入出力処理が発生したら```待機状態```になる。
```待機状態```で入出力処理が終わったら```実行可能状態```になる。（CPUの順番待ち）
```待機状態から実行状態になることはできない。```
必ず```待機状態⇨実行可能状態⇨実行状態の流れ```を組まなければならない。

##　気づき
こうしてqiitaをしているときもCPUの使用権の回してるんだな。
```待機状態⇨実行可能状態⇨実行状態の流れ```はかっこいいな。

# ディスパッチャとタスクスケジューリング
CPUの使用権を割り当てるのは、ディスパッチャという管理プログラムの役割だ。
実行可能状態のタスクにCPUの使用権を割り当てるこれを```ディスパッチ```という。
このタスク実行順序を定める必要がある。それを```タスクスケジューリング```と呼ぶ。
タスクスケジューリングには代表的な３つがある。

## 到着順方式
```実行可能状態になったタスク順```に、CPUの使用権を割り当てる方式。
実行の```途中でCPUの使用権が奪われることはありません```。

## 優先順(プライオリティ順）方式
```タスクそれぞれに優先度を設定```している。
その優先度の```高いものから順に実行```していく方式。
実行中のタスクよりも優先度の高いタスクが行列に並ぶと、```実行の途中でCPU使用権が奪われる```ことがある。（これを```プリエンプション```という）

## ラウンドロビン方式
```一定時間ごとに切り替える```方式。
```規定の時間内に処理がおわらなかった場合```、次のタスクに使用権が与えられる。
実行中だったタスクは```待ち行列の最後```に回される。

## イベントドリブンプリエンション
タスクに優先順位はなく、```実行可能になった順に実行```する方式。
いつまでも```CPUを解放しないタスク（無限ループ）```が存在すると他のタスクが実行できない。

## 処理時間順（SJF：Shortest Job First）方式
```処理時間の短いタスクを先に実行```する方式。
処理時間が他のタスクに比べて極端に長いタスクがある場合、CPU資源が与えられない可能性がある。

## マルチプログラミング
タスク管理の役割はCPUの有効活用に尽きる。
CPUの遊休時間を最小限にとどめることが大事になる。
マルチ（多重）プログラミングというは、複数のプログラムを見掛け上同時に実行して見せること。
こうするおとCPUの利用効率を高めることができる。
プログラムAはプログラムBよりも優先度が高く、かつお互いの入出力処理は競合しないものとする。
こういう条件だと図のように遊休時間がでなくて済む。
p237

## 割り込み処理
時効中のタスクを中断して、別の処理に切り替え、そちらが終わるとまた元のタスクに復帰するという処理のことを```割り込み処理```という。
実行状態、実行可能状態、待機状態はこの割り込み処理によってタスクの状態が切り替わってる。
マルチプログラミングにとって必須の仕組み
### 割り込み処理の原因
実行中のプログラミングが原因んで生じるナブの割り込みとプログラム外の要因で生じる外部割り込みがある。
割り込み処理の原因を紹介する。

#### 内部割り込み
##### プログラム割り込み
オーバフロー、存在しないページへのアクセス、書き込みできない主記憶装置に書き込もうとした時に生じる
##### SVC（Super Visor Call)割り込み
入出力処理を要求する、カーネル呼び出し命令が発行された時に生じる
#### 外部割り込み
##### 入出力割り込み
入出力装置の動作完了時や中断時に生じる
##### 機械チェック割込み
電源の異常や主記憶装置の障害など、ハードウェアの異常発生時に生じる
##### コンソール割り込み
オペレータ（利用者)による介入が行われた時に生じる
##### タイマ割り込み
規定の時間を過ぎた時に生じる割り込み

### 気づき
#### カーネルとは？
* カーネル（kernel）とは、```オペレーティングシステム（OS）の基本機能の役割を担うソフトウェア```を指します。
カーネルは、OSの中でも特に中核的なプログラムであり、```ハードディスクやメモリなど、コンピュータの資源管理を行なっています```。
カーネルは、アプリケーションの実行を許可し、プロセス管理を行います。
出典 https://www.idcf.jp/words/kernel.html#:~:text=%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB%EF%BC%88kernel%EF%BC%89%E3%81%A8%E3%81%AF%E3%80%81,%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E7%AE%A1%E7%90%86%E3%82%92%E8%A1%8C%E3%81%84%E3%81%BE%E3%81%99%E3%80%82

* カーネルとは、```OS（オペレーティングシステム）の中核を構成するソフトウェア```。動作中のプログラムの実行状態を管理したり、ハードウェア資源を管理してアプリケーションソフトがハードウェアの機能を利用する手段を提供したりする。
出典 https://e-words.jp/w/%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB.html

#### カーネル呼び出し命令とは
* ```システムコール 【system call】 スーパーバイザコール / supervisor call / SVC```
システムコールとは、コンピュータ上で実行中のプログラムが、```オペレーティングシステム（OS）のカーネルの特権的な機能を呼び出す仕組み```。また、そのための命令や関数などのインターフェース仕様（API）。「サービスコール」（service call）「カーネルコール」（kernel call）と呼ぶシステムもある。

* ```アプリケーションソフトなど利用者が直接操作するプログラムの多くは一般的な動作モードであるユーザーモードで実行されるため、特権命令を実行するにはシステムコールによりカーネルに処理を依頼する必要がある。```この手続きは内部割り込み（ソフトウェア割り込み）を発生させる形で実装されることが多いため「SVC割り込み」とも呼ばれる。
出典 https://e-words.jp/w/%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%82%B3%E3%83%BC%E3%83%AB.html

#### コンソール割込みとは具体的に？
汎用コンピュータシステムを管理するため管理者が```コンソール（操作卓）から指令を出したとき```に発生
出典 https://programmer.exblog.jp/813189/

コンソールからのコマンドをするとこの割り込みが発生するのかな。

# 問題を解いた時の気づき
### プリエンプティブとは？
検索しても見つからなかったため、近いのがあったからこれにした。

プリエンプションとは、コンピュータ上で実行中のプログラム（タスク）を```強制的に一時中断し、他をプログラムの実行に切り替えること```。
出典 https://e-words.jp/w/%E3%83%97%E3%83%AA%E3%82%A8%E3%83%B3%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3.html

### リアルタイムOSとは?
リアルタイムOSとは、OS（オペレーティングシステム）の種類の一つで、```時間的な制約がある処理を実行するための機能や特性を備えたもの```。
出典 https://e-words.jp/w/%E3%83%AA%E3%82%A2%E3%83%AB%E3%82%BF%E3%82%A4%E3%83%A0OS.html#:~:text=%E3%83%AA%E3%82%A2%E3%83%AB%E3%82%BF%E3%82%A4%E3%83%A0OS%E3%81%A8%E3%81%AF%E3%80%81OS,%E7%94%A8%E3%81%A8%E3%81%97%E3%81%A6%E3%82%88%E3%81%8F%E7%94%A8%E3%81%84%E3%82%89%E3%82%8C%E3%82%8B%E3%80%82

### MPU
マイコン関連の書籍やWebサイトなどで「MCU」と「MPU」という言葉をよく見かけますが、この2つは何が違うのですか？どのように使い分ければよいのでしょうか？

どちらも```CPU（Central Processing Unit）を搭載した演算処理を行う半導体デバイス```です。