[OS] プロセスとは?

## 目次
1. はじめに
2. プロセスとは？
3. プロセスの構造
4. プロセスの状態
5. プロセス状態切り替え
6. 参考文献

## 1. はじめに
OSに関する基本的な理論と概念を再学習するため、「Operating System Concepts」に基づいてプロセスの概念を説明します。

## 2. プロセスとは？
OSの本では、プロセスを簡単に「実行中のプログラム」と定義しています。この文章で「実行中」、「プログラム」という二つの用語の意味を理解するために、私たちがよく使うChromeブラウザの例を挙げてみます。Chromeブラウザのサイトに入ると、いつでもChromeブラウザをダウンロードしてコンピュータに設置することができ、パソコンにインストールされたアイコンをダブルクリックするだけで、いつでもChromeブラウザを開くことができます。

上記でダウンロードしてパソコンにイン設置したChromeブラウザは、物理的にパソコンの補助記憶装置に保存されます。通常、ハードディスク(Hard Disk)がこれに該当します。このように補助記憶装置に保存されたクロムブラウザは、一つの独立した実行単位としていつでも実行できる複数のファイルの集合体と見ることができます。私たちはこれを「プログラム」と呼びます。

では、プログラムであるChromeブラウザを起動してウェブサーフィンを始めることを想像してみましょう。補助記憶装置に保存された状態では何もできません。中央処理装置がこれを解釈して実行できるように、主記憶装置のスペースを割り当てられてロードされる必要があります。このように物理的に周期記憶装置にロードされ、中央処理装置によって制御される状態が「実行中のプログラム」の「実行中」に該当します。

上記の内容を整理してプロセスを具体的に定義すると、次のようになります。プロセスとは、周期記憶装置にロードされ、中央処理装置によって制御されている(=実行中)補助記憶装置に保存された一つの独立した作業を行うファイル集合体(=プログラム)だと言えます。

![Screen Shot 2023-09-11 at 0.14.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3529304/dca50fc0-301f-9604-7902-1aec38280578.png)

## 3. プロセスの構造

プロセスは割り当てられたメモリをスタック、ヒープ、テキスト、コードの4つの領域で構造化し、必要なデータを保存して管理します。各領域の役割を説明します。

- **コード(Code)領域**: プログラムの実行可能な命令がバイナリ形式で保存されるメモリ領域です。 CPUは、この領域に保存された命令を順次または条件に応じて選択的に解釈して実行します。
- **データ(Data)領域**: グローバル変数と静的(static)変数が保存される領域です。この領域の変数はプログラムの寿命の間維持され、初期化されていないデータもここに保存されます。
- **スタック(Stack)領域**: 関数呼び出しに関連する情報が保存される領域です。これには関数のパラメータ、リターンアドレス、そして地域変数が含まれます。関数呼び出しが終了すると、その関数のスタックフレームはスタックから削除されます。
- **ヒープ(Heap)領域**: 動的メモリ割り当てのための領域です。ここでは、実行時にプログラムがメモリ空間のサイズを動的に決定し、割り当てることができます。

![Screen Shot 2023-09-11 at 0.17.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3529304/a4e27208-7842-54e0-997e-4d9d35d2c39c.png)

## 4.プロセスの状態

コンピュータはすべてのプロセスを同時に実行することはできません。 そのため、あるプロセスが動作している間、あるプロセスは待機しなければならないし、あるプロセスはその役割を終えて終了することもあります。このような様々な状態を私たちはプロセス状態と呼びます。中央処理装置は一度に一つのプロセスだけを処理するため、OSは中央処理装置によって処理されているプロセスを除いた残りのプロセスを準備キュー、待機キュー、実行キューなどのデータ構造を利用して管理します。プロセスの状態には、5つの状態モデルを基準に生成、準備、実行、待機、終了の5つがあります。

**1.生成**： プログラムが周期記憶装置に割り当てられ、プロセスが生成される段階です。プロセス生成段階では、必要なメモリのサイズ、入出力装置、ディスクなど、どのようなリソースが必要かを把握する作業を行います。
**2.準備**: プロセスが中央処理装置によって処理されていないが、いつでも処理できる状態で中央処理装置の処理を待っている段階です。プロセスが中央処理装置に割り当てられると、プロセスの命令処理が行われます。
**3.実行**: プロセスが中央処理装置によって処理されている段階です。
**4.待機**: プロセスが入出力の完了を待ったり、中央処理装置以外の他の特定のリソースの割り当てが行われるまで作業が保留される段階です。
**5.終了**: プロセスのすべての処理が完了し、周期記憶装置から消滅する段階です。

## 5.プロセス状態切り替え
**1.生成 -> 準備**: 生成されたプロセスに中央処理装置以外必要なリソースが割り当てられると、生成状態から準備状態に切り替わります。
例) Excelを実行すると、そのプログラムに対応するプロセスが生成され、準備キューの最後に入って準備状態に切り替わります。
**2. 準備 -> 実行**: 中央処理装置以外のすべてのリソースが準備された状態で中央処理装置が割り当てられると、準備状態から実行状態に切り替わります。(=スケジューラディスパッチ)
例) Excelで文章を入力すると、そのプロセスの中央処理装置の使用率が上昇することが確認できます。この時、Excelは実行状態に切り替わります。
**3.実行 -> 準備**: 中央処理装置に割り当てられたプロセスが中央処理装置の割り当て時間が満了したり、優先処理順位が高いプロセスが中央処理装置を占有すると、実行状態から準備状態に切り替わります(割り当て時間満了).
例) Excelの使用を停止したり、他のプログラムを実行させると、Excelの中央処理装置の使用率が減少することがわかります。この時、Excelは準備状態に切り替わります。
**4.実行 -> 待機**: 中央処理装置に割り当てられたプロセスが特定のリソースを必要としたり、入出力が必要な状況が発生すると、実行状態から待機状態に切り替わります(=イベント待機).
例) Excelで保存を押すと、Excelは補助記憶装置に保存が完了するまで待機状態に切り替わります。
**5.待機 -> 準備**: 待機中のプロセスが特定のリソースの割り当てまたは入出力が完了し、再開条件を満たすと、待機状態から準備状態に切り替わります。 (=再開条件を満たす)
例) Excelで保存した内容が補助記憶装置に保存が完了すると、準備状態に切り替わります。
**6.実行 -> 終了**：プロセスのすべての作業の完了、エラー発生または強制終了が発生した場合、実行状態から終了状態に切り替わります。
例) ワードプロセッサの右上の「X」ボタンを押したり、ワードプロセッサでエラーが発生すると、終了状態に切り替わります。
![Screen Shot 2023-09-10 at 23.42.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3529304/0919b2b4-6423-12d7-72c0-ed5aaff76f18.png)

## 6. 参考文献
- Operating System Concepts - Abraham Silberschatz