プロセスとスレッドについて

#はじめに

「OSの仕組み」について概要をまとめた記事を書きましたが、その中で「プロセス管理」の部分に焦点を当てて、プロセスとスレッドについての記事を書きます。

#おさらい
[前の記事](https://qiita.com/n-yama/items/1c1f8b61c16a270c411b#プロセス管理) で書いてたプロセス管理の概要を記載します。

##プロセスとは

プロセスとは「実行中のプログラム（のインスタンス）」であり、コンピュータに命令の実行を行います。
プロセスの実行にはメモリ領域が必要です。そして、プロセスに対してメモリ領域が割り当てられたらプロセスに含まれるスレッドが実行されます。

1つずつ順番にスレッドを処理する: シングルスレッド
複数のスレッドを並列して処理する: マルチスレッド

![image.png](https://assets.st-note.com/production/uploads/images/53791175/picture_pc_d150ca04024969fa04b8715ccb203565.png)

#マルチスレッドと並列処理

上記の図だと、マルチスレッドでは並列して処理を行っているため、並列処理となっています。
しかし**マルチスレッドには並列処理だけではなく、並行処理である場合もあります**。
→いきなり並列処理と並行処理とかいうワードを出しましたが、これから解説していきます。


##並列処理と並行処理


少し例を出して説明してみます。
4人家族で4つの家事を行うとき、一人で行う場合と4人で分担する場合があるとします（下図参照）。

![image.png](https://assets.st-note.com/production/uploads/images/53999833/picture_pc_af9ea7b47ec476865d2064c8d1955d17.png)

###4人で4つの家事を分担してこなす場合

![OS-並行処理と並列処理01_3.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1237088/0f8f38bb-0d94-a680-6095-76b478512983.png)


1人が1つの家事をこなすだけで完了します。

###1人で4つの家事をこなす場合

![OS-並行処理と並列処理01_2.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1237088/ed718435-f7b6-2b52-511e-14d11447e3a9.png)

・先に洗濯ものを洗濯機にいれて回す
・洗濯機が回っている間に料理を作る
・作った料理を食べてもらっている間に掃除をする
というように家事を一つずつ行うのではなく途中で切り替えながら作業すればうまくこなしていくことができます。

では、上記の図を**※コア**の処理作業に当てはめた場合の図が以下になります。
（※CPUコアについて
CPUの中核となる「コア」は処理作業を行う上で重要な部分であり、コア数によって同時に処理できる量が変わります。
最近だと複数のコアが搭載されている「マルチコア」が主流となっています。ちなみに1つのコアが搭載されているのが「シングルコア」です。）


![image.png](https://assets.st-note.com/production/uploads/images/53999885/picture_pc_5a6eef217c14f51aa25dda0fe256bfca.png)


シングルコアは並行処理ですが、処理する作業を素早く切り替えてあたかも並列処理をしているように処理します。
先ほど「マルチスレッドには並列処理だけではなく、並行処理である場合もあります。」と言っていたのは上記のためです。
マルチスレッドでは搭載されているコア数により平行処理または並列処理で処理することになります。

##スレッドの状態遷移
スレッドには3つの状態があります。3つがどのような状態なのかは下図をご覧ください。
(どうでもいいですけど、いらすとやとONE PIECEコラボしてたんですね。使ってみたいんで使います)

![image.png](https://assets.st-note.com/production/uploads/images/54749962/picture_pc_f8368cc0c42af46aa8d6897a5321bf87.png)


**実行可能状態(READY):** いつでも実行可能な状態。
**実行状態(RUN):** 実行中の状態。
**待機状態(WAIT):** 入出力処理が発生し、その終了を待っている状態。

スレッドは生成されたらすぐに実行されるというわけではありません。
処理するためにはCPUコアの使用権が必要になるため、スレッドが使用権を効率よく回すために各状態があるのです。
図のような感じで状態が遷移します。

![image.png](https://assets.st-note.com/production/uploads/images/54751980/picture_pc_11eec243ac6f7860bcbe028fe8fa604a.png)

![image.png](https://assets.st-note.com/production/uploads/images/54752585/picture_pc_1c2a78b3a2527552b235a2862d845b24.png)

![image.png](https://assets.st-note.com/production/uploads/images/54752601/picture_pc_72b1e48f760cae3f8aed9e573936bf8f.png)


上記の図をまとめるとこうなります。

![image.png](https://assets.st-note.com/production/uploads/images/54754062/picture_pc_ab2699a22cbda3129c34155c581184d9.png)

補足ですが、待機状態(WAIT)から実行状態(RUN)へ遷移できません。
ですので、待機状態(WAIT)から実行状態(RUN)へ遷移するためには実行可能状態(READY)に一度遷移する必要があります。



##割り込み処理

また、実行中のスレッドを中断して別の処理に切り替え、それが終了し元のスレッドの処理を行うことを**割り込み処理**と言います。



割り込み処理は大きく内部割込みと、外部割込みに分かれます。

内部割込み: 実行中のプログラムが原因で生じる
 &ensp;&ensp;&ensp;&ensp;&ensp;&ensp; L プログラム割込み: ゼロ除算など
外部割込み: プログラム外の原因で生じる
&ensp;&ensp;&ensp;&ensp;&ensp;&ensp; L 入出力割込み・コンソール(オペレータによる介入)割込みなど

#終わりに
プロセスとスレッドについて書きましたが、意外に図を作成するのに時間がかかりますね。
その分少しでもわかりやすくなればいいなーと思います。

プロセスとスレッドについてのさらに知識をつけたい方は以下の記事も参考になります。
[プロセスとスレッドの違いとは？超わかりやすく解説！【図解とプログラム付き】](https://jpazamu.com/thread_process/) 


ここまで読んでくださり、ありがとうございます！