プロセスとかスレッドとか、いまいちよくわかっていない初心者がお勉強のために書いてます
プロセス
- 実行状態のアプリケーションのこと。
-
1つのプロセスには1つのメモリ領域が割り当てられる。
マルチタスクOSでは、細かく実行するプロセスを切り替えているため、一度にたくさんのアプリケーションが動いているように見える。
CPUは一度に1プロセスしか処理できない
-
プロセスがメモリに保持している情報:
プロセスは下記のようなデータ構造でメモリ上に存在している
スレッド
- プロセス内で命令を実行する部分のこと。
- 親のプロセスから生成することで、同じアプリケーションを並列に動かすことができる。
- CPUコアを利用する単位
- 同時マルチスレッディング(SMT)では1つのコアに対して2つのスレッドを割り当てる。
- 1つのプロセスがスレッドをいくつ使うかはアプリケーション次第(jsはシングルスレッド、javaはマルチスレッド可)
- プロセスからスレッドを生成した場合、親プロセスの下記の値を親の仮想アドレス空間にコピーする
- スタック領域
- スタックポインタ(スタックセグメントの中で次にデータを書き込むアドレスを保持)
- プログラムカウンタ(次に実行する命令が格納されているアドレスを保持)
- 上記以外は親プロセスと同じものを使用し、スレッド専用のメモリは確保しない
- 複数スレッドと多くのデータを共有するため、使用しようとした変数の値が他のスレッドによって書き換えられていたり消されていたりすることもある
- 上記の状態で動作しても問題ないプログラムをスレッドセーフという