プロセスの知識はプログラミングをする上でも必要になってきます。今回はプロセスとは何か?プロセスがどのように管理されているのかについて解説をしていきます。
これらを学ぶことで、どのようにプログラムが動いているかを理解を深めることができます。
プロセスとは
起動後に動作中のプログラムのことをプロセスと呼ぶ。
プロセスは複数起動しているのが当たり前で、ps auxコマンドを実行すると実行されているプロセスを全て確認することができる。
% ps aux
USER PID %CPU %MEM VSZ RSS TT STAT STARTED TIME COMMAND
_coreaudiod 222 9.6 0.2 33804424 28984 ?? Ss 9:52AM 7:21.07 /usr/sbin/aaaa
aaaaa 7030 4.2 1.3 1247628436 226196 ?? S 11:20AM 1:13.35 /Applications/Go
プロセスの生成
新しくプロセスを生成する目的は2つ
- 同じプログラムの処理を複数プロセスに分けて処理をする( 例. Webサーバーによる複数リクエストを受け付ける)
- 別のプログラムを生成する(例.bashからプログラムの新規生成)
これらを実現するのにforkとexecve関数を使う。
fork関数
fork関数を実行すると、実行したプロセスのコピーを作った上で、どちらもfork関数から復帰させる。
生成元を親プロセス、生成されたプロセスを子プロセスと呼ぶ。
execve関数
fork関数によってプロセスのコピーを作った後は、子プロセス上でexecve関数が実行される。これにより子プロセスは別のプログラムに置き換えられる。
プロセスの状態
プロセスには状態があり、遷移図にすると以下になる。
アイドルプロセス
プロセスがスリープをしているときに論理CPU上では、アイドルプロセスという何もしてない特殊なプロセスが動作している。そうすることで、1つ以上のプロセスが実行可能状態になるまで、消費電力を抑えた状態で待機する。
またアイドルプロセスはpsコマンドから確認できない。
スリープ状態はI/O待ちなどのイベントを待っている時に発生する。
ゾンビプロセス
ゾンビプロセスは子プロセスが終了したが、親プロセスが終了状態を得ていないという状態のプロセスのことを言う。親プロセスが子プロセスの終了状態を回収する必要がある。
プロセススケジューラ
プロセススケジューラはプロセスへのCPUリソース割り当てを担当するLinuxカーネルの機能のこと。
1つの論理CPU上で実行できるプロセスは1つで、実行可能なプロセスに、タイムスライスという単位で順番にCPUで処理を実行している。
タイムスイライス
タイムスライスという単位でプロセスは実行されている。タイムスライスが固定だと、プロセス数が増えると各プロセスにCPU時間が回ってなこないのを解決するために、プロセススケジューラーはプロセス数に応じて、タイムスライスを変えている。
タイムスライスの計算は次の要素をみている
- 論理CPU数
- 所定の値を超える論理CPU上で実行/実行待ちのプロセス数
- nice値(プロセスの優先度を表す)
タイムスライスを短くすることで、同時に複数のプロセスが動いているように見せている。
nice値
nice値はプロセスの優先度を決める値で、-20~19を設定できる。-20が優先度が一番高く、19が一番優先度が低い。nice値が低い(優先度が高い)とプロセスにタイムスライスが多く与えられる。
優先度を下げることはどのユーザーでも可能だが、優先度を上げるのはrootユーザーのみが可能になる。
コンテキストスイッチ
論理CPU上で動作するプロセスが切り替わることをコンテキストスイッチという。
コンテキストスイッチはいかなるコードを実行中でも、タイムスライスが切れると発生する。
理解度チェック
今回の内容がわかっているかの問題を作成しています。
問題をクリックすると、答えが表示されますので、今回の内容を理解できたかチェックをしてみてください。
まとめ
今回はプロセス、プロセスのスケジューラーについて解説をしてきました。
低レイヤーについて、知識を深めることは開発者にとても大事なことです。このブログでは他にもCPUとメモリや、カーネルとシステムコールについて解説をしている記事があるので、そちらも読んでみてください。
【おすすめ記事のリンク】
コメント