jinyux’s diary

IT業界初心者です。勉強したことをまとめています。

プロセスとは

オペレーティングシステムの仕組み」を読んでプロセスの勉強をしています。

プロセスとは

OSがプログラムを実行するためには、実行ファイルをメモリ上に読み込み、実行のために様々な準備をしたのち、プログラムを実行可能状態にし、実行を開始する。このように実行可能状態であるプログラムをプロセスと呼び、実行ファイルであるプログラムと区別している。プログラムである実行ファイルは一つしか存在しないが、プロセスは複数存在することがある。

メモリ上に読み込まれたプロセスにはメモリ領域が割り当てられ、大きく下記の3つの部分に分けられる。

  • コード領域(テキスト領域とも言う)
    プログラムコードが格納されている領域。
  • データ領域(ヒープ領域を含む)
    プログラム実行に必要なデータが格納されている領域。グローバル変数や動的確保されたメモリ(オブジェクト)などが格納される。動的確保されたメモリ領域のことをヒープ領域という。ヒープ領域はメモリアドレスの小さい方から大きい方へ順に確保されていく。
  • スタック領域
    こちらもプログラム実行に必要なデータが格納されている領域でスタックとして利用される。関数呼び出しの戻りアドレスや、関数のローカル変数を格納する。スタックはメモリアドレスの大きい方から小さい方へ順に確保されていく。

CPUは一つしか存在しないため、本来ならば一度にひとつのプロセスしか実行できない。しかし、ひとつのプロセスが終わってから次のプロセスを実行、というように順番に処理していると不便であることが多い。そこで、CPUで処理するプロセスを極めて短い時間で切り替えて同時実行しているように見せかける。人間にとっては認識できないレベルの短い時間のため、複数のプロセスが同時に実行しているように見える。このような擬似的な同時実行処理を擬似並列という。

複数のプロセスが同時に動作することを「プロセスが並行に動作する」という。これは擬似並列であるかどうかは問わず、同時に動いているように見えればよい。それに対し、「プロセスが並列に動作する」というと、複数のプロセスが本当に同時に動いていなければならない。複数のCPUが搭載されているPCならCPUの数だけ同時にプロセスが実行できる。

プロセス切替

一つのCPUで複数のプロセスを切り替えて処理することをプロセス切替、あるいはコンテキスト切替という。プロセスA,プロセスBが交互に実行されているとする。プロセスAからプロセスBへ切替を行うとき、後にBからAへ再切替がおきるので、A実行時のレジスタの状態を保存する必要がある。この処理はOSの仕事である。まずAのレジスタ状態をカーネル内の領域に退避する。次にBへの切替を行うために、保存されていたBのレジスタの状態を取り出し、レジスタの内容をその状態に再設定する。この再設定により、レジスタにはBが前回実行していたプログラムカウンタやスタックポインタが設定されているので、あたかも前からBを実行していたのと同じ状態となり、Bの処理を再開できる。

カーネル内部でプロセスを管理するために様々な情報を保持している。その情報はプロセステーブルまたはプロセス制御ブロックと呼ばれる。C言語の構造体として定義されていることが多い。

  • プロセス管理情報
    プロセスそのものを管理するために必要な情報
    • レジスタの退避領域
    • プロセスの属性
    • 統計情報
  • メモリ管理情報
    コード領域、データ領域、スタック領域の各領域がメモリ上のどのアドレスから始まるのか、その大きさなどの情報
  • ファイル管理情報 ファイル操作に関するさまざまな情報を保持するフィールド。カレントディレクトリや開いたファイルの情報を管理している。

オペレーティングシステムの仕組み(amazon)