UniRxを完全に理解したい-入門編_逐次？並列？並行？何それ，美味しいの？

# 概要
出来るだけ誰にでも分かりやすく，私が学んだ情報を共有していきたいと思います．
私自身も学び始めたばかりの身です．
熟練者の皆さんには間違いをご指導頂いて，記事のブラッシュアップに協力していただければと思います．

## この記事の象者について
この記事は

* UniRxってなんだ？
* 非同期処理？イベント駆動？
* Unity最近始めた
* プログラミング何も分からん

という方を対象にしています．
私と一緒にUniRxを完全に理解していきましょう！

## UniRxとは？
UniRxはGoF (Gang of Four)パターンの一つObserverパターンを基にして作られた，UnityのAssetライブラリの一つです．
分からん！

よくReactive Extensionsなライブラリとも言われます．
分からん！

もっと調べてみると非同期？イベント駆動？みたいな単語をよく見かけます．
分からん！

そうです，分からん単語が多すぎるのです．
だから余計に分からん！

では，もっと初歩的なところに戻ってみて，一つずつ紐解いていきましょう！

## 逐次？並列？
逐次，並列という言葉はコンピュータサイエンスにおいて，プログラムの実行手順に関係しています．

これを理解するには軽くCPUについて知っておく必要があります．
勉強していきましょう！

## CPUについて
CPUはプログラムを実際に動かしてくれている部品です．
よく人間における脳という比喩を目にします．

CPUの中にはコアというものが存在します．
このコアが実際にプログラムを実行してます．

最近のCPUではマルチコアが主流で複数のコアがCPUの中に存在します．
それぞれのコアがプログラムを実行してくれるんですね！

お，少し見えてきた気がします．

## 逐次処理と並列処理
コアがプログラムを実行してくれることが分かりました．
言葉で理解しようとすると難しいので図で理解していきましょう！
次の図を見てみましょう．

![逐次処理1.png](https://qiita-image-store.s3.amazonaws.com/0/284634/11fa7975-fc1c-972b-1e37-487e9bf68b26.png)
（図1　逐次処理1）

この図では1つのコアが処理を順番に実行している様子を表しています．
次の図ではどうでしょう？

![逐次処理2.png](https://qiita-image-store.s3.amazonaws.com/0/284634/d6bc0098-351c-b58d-9577-fc32d2c885b9.png)
（図2　逐次処理2）

この図では複数のコアが処理を順番に実行している様子を表しています．
これが`逐次処理`と言われるものです．

では，次の図をみてみましょう．

![並列処理.png](https://qiita-image-store.s3.amazonaws.com/0/284634/2f2d85d6-8c4c-214d-46b4-6333d8a51c94.png)
（図3　並列処理）

この図では複数のコアが同時に処理を実行している様子を表しています．
これが`並列処理`と言われるものです．

* `逐次処理`は順番に処理を実行する．
* `並列処理`は複数のコアが同時に処理を実行する．

これで逐次処理と並列処理の違いは分かりました！

## 並列と並行
並列と並行…
似ている…
分かりにくい！

そうなんです，日本語のせいで余計に分かりにくくなっています．
英語ではparallelとconcurrentなんです．

では，その違いをみていきましょう．
といきたいのですが，その前に押さえておきたい概念があります．
それは`プロセス`と`スレッド`です．

また，ややこしそうな単語が出てきました．
頑張っていきましょう！

## プロセスとスレッド
まずは図で理解していきましょう！
次の図を見て下さい．

![プロセスとスレッド.png](https://qiita-image-store.s3.amazonaws.com/0/284634/14fc4594-b9be-120c-e0c4-6ff6a1a774bb.png)
（図4　プロセスとスレッド）

プロセスの中にスレッドがいますね．
スレッドが1つのプロセスと複数のプロセスがあります．

`プロセス`は抽象化されたプログラムの実行単位，もっと言えばバイナリ(0と1) です．
`プロセス`を起動した時に仮想メモリや仮想プロセッサの領域を確保します．
簡単に言えば，プログラムを実行するために必要なリソースを確保するということです．

では，スレッドはなんなのか？
次の図を見てみましょう．

![スレッド.png](https://qiita-image-store.s3.amazonaws.com/0/284634/9ba7a003-6ce5-3284-ba9b-422dabb3c622.png)
（図5　スレッド）

1つのコアに1つのスレッドもしくは複数のスレッドがありますね．
プログラムを実行してくれるのはコアでした．

`スレッド`はプロセス中におけるプログラムの実際の最小実行単位です．

最後に次の図を見てみましょう．

![コアとプロセスとスレッド.png](https://qiita-image-store.s3.amazonaws.com/0/284634/f5c8333d-fd3d-74e7-8460-30b016d22b33.png)
（図6　コアとプロセスとスレッド）

* `プロセス`は実行中のプログラムを抽象化させたものです．
* `プロセス`は起動時に必要なリソースを確保します．
* `プロセス`は1つのスレッドまたは複数のスレッドで実行されます．
* `スレッド`はプロセスのプログラムを実際に実行する最小単位です．
* `スレッド`はコアの中に1つまたは複数存在します．
* プロセス中の`スレッド`は複数のコアに存在する場合があります．


難しかったですね．
言葉で理解しようとすると難しいので，まずは図でイメージを固めるといいと思います．

## 並列処理と並行処理
では，戻りましょう．
並列処理は説明したので，`並行処理`について勉強していきます．
次の図を見て下さい．

![並行処理.png](https://qiita-image-store.s3.amazonaws.com/0/284634/d7256e06-28d4-6745-5b17-0f4993f022a7.png)
（図7　並行処理）

1つのコアの中で複数のスレッドが処理を実行しています．
実際にはコアは1つのスレッドしか実行できません．
つまり，複数のスレッドを切り替えながら処理を実行しています．
これが`並行処理`です．

* `並行処理`は複数のスレッドが実行状態にある．
* `並列処理`は複数のコアで同時にスレッド中の処理を実行する．

並行処理は同時に実行されている訳ではないんですね．


## まとめ
今回は逐次処理，並列処理，並行処理，プロセス，スレッドを勉強しました．

1. `逐次処理`は順番に処理を実行する．
2. `並列処理`は複数のコアが同時にスレッド中の処理を実行する．
3. `並行処理`は1つのコアで複数のスレッドが実行状態にある．
4. `プロセス`は実行中のプログラムを抽象化させたもの．
5. `スレッド`はプロセスの最小実行単位．

この5つを覚えておきましょう．