プロセスとは何ですか?
実行中のプログラムにはどのようなリソースがありますか?
本ブログ作成文は、講義を目指して製作されました。 また、作成された文章の情報も間違っている可能性がありますので、ご注意ください。
実行ファイルはディスクに保存されたコードとデータです。 この実行ファイルをオペレーティングシステムがメモリに載せ、実行に必要なリソースを付けた状態をProcess(プロセス)と呼ぶ。
つまり、プログラムはファイルであり、プロセスは実行中のプログラムのインスタンスです。
プロセスが持つもの
プロセスはコードだけを持っていません。
- 独立した仮想アドレス空間
- 実行コードとグローバルデータ
- 動的に割り当てるヒープ
- スレッドが使用するスタック
- 開いたファイルとソケット情報
- セキュリティ権限とプロセスID
高い住所
┌──────────────┐
│ Stack │ スレッドの関数呼び出しとローカル変数
├──────────────┤
│ │
│ Heap │ new、mallocなどの動的割り当て
├──────────────┤
│ Data/BSS │ グローバル変数、静的変数
├──────────────┤
│ Code │ 実行する命令
└──────────────┘
低い住所
実際の配置と詳細はオペレーティングシステムと実行可能ファイル形式によって異なりますが、異なる用途のメモリゾーンを持つという流れは同じです。
プロセスは互いに分離されています
プロセスAが使用するポインタは、プロセスBがそのまま取得しても同じデータにアクセスできません。 各プロセスは独自の仮想アドレス空間を持ち、カーネルがページテーブルを介して物理メモリに接続するためです。
この隔離のおかげで、ブラウザの1つが間違っていても、他のプログラムのメモリをすぐに壊すことはありません。
プロセス間で通信するには方法が必要です
メモリが分離されているため、プロセス間でデータを送受信するには、IPC(Inter-Process Communication)を使用する必要があります。
- Pipe
- Shared Memory
- Socket
- Message Queue
共有メモリは高速ですが、同時にアクセスするときに同期が必要です。 ソケットやメッセージ方式は境界がはっきりしているが、データコピーと通信コストが生じることがある。
プロセスは単に実行中のコードの1つではありません。 オペレーティングシステムがメモリとファイル、権限、1つ以上のスレッドをまとめて管理するリソースコンテナに近い。