OS上のプロセスについて
プロセス
OS上での処理の最小単位がプロセスです。 すべての操作などはプロセスの単位で実行されると覚えておきましょう。
- PID (プロセスID)
- プログラムの実行命令コード
- 変数など データ
- ファイルの記述子
- コンテキスト(CPUの状態)
- スレッド
プロセスには親子関係があります。 親プロセスから子プロセスを生成することをforkといいます。 (※forkは英語で、分岐/枝分かれなどという意味を持ちます。)
このとき、子プロセスは親プロセスのメモリ空間をコピーして生成されます。 しかし、実はいきなりメモリ空間をコピーするのではなくリンク張って実際にプロセスの変更がかかったときにコピーが行われるのです。
プロセス同士は直接データの受け渡しはできません。
なので、プロセス間通信(例えば、$ <command> | <command> |...
)という仕組みでやり取りをします。
lsコマンドやcatなどといった、よくコマンドラインで使用するコマンドも勿論プロセスです。
多くのプロセスは、3つの状態を持っています。
「実行中」、「実行待ち」、「休止」
私達がPCを操作しているときの多くは休止中になっているはずです。 まれにPCが重いと感じるときは、実行待ち状態のプロセスが多いためです。
コマンドラインでプロセスを強制的に終了させるには、killコマンドがありますし、 実行中のプロセスを停止させる手段としてCTRL+c(実はSIGINTというシグナルを送っている)なんかはよく使用するかと思います。
スレッド
スレッドはよく軽量プロセスやライトウェイトプロセスなどと言われることがあるかと思います。 プロセスとの違いとは?という記事もよくみかけます。
スレッドとは、タスクの実行単位で、並列処理を目的としてプロトコル内に複数作成されるものです。 なので、同じプロセス内にあるスレッドはメモリ空間を共有できます。
処理の流れ&仕組み
OSは複数の処理を並列処理するために、CPUの処理時間をms単位でタイムスライスします。 そして順次CPUリソースが割り当てれられていきます。
コンテキストが次々に実行待ち状態のプロセスに切り替えれていくことをコンテキストスイッチといいます。 コンテキストスイッチは、プロセスに与えられた時間も使い切るか、I/O待ちなどでCPUを手放したときに行われます。
CPUコア数が多いほど負荷が軽減できるでしょう。
これでメモリ上のスタックという領域にいき退避/復帰をします。
また、プロセスはどのような順番で実行されるのでしょうか?
この答えとしては、厳密にはOS(スケジューラーのアルゴリズム)によって違ってきますが、主な流れとしては以下になります。
これはスケジューラが実行可能キューから選択し、ディスパッチャーというCPUコアにに割り当てます。
こうした処理の流れを普段あんまり気にすることは少ないかと思います。
ですが、複数のバッチ処理やどうしても同じCPUコアで実行させたくない場合が出てきたら....
勿論プロセスの制御を行うことも可能です。
こうしたプロセスの割り当てを行うことをアフィニティーといいます。 論理プロセッサをグループ分けしてみましょう。
こうした設定はOSによって異なりますが、コマンドラインで設定したり確認できます。