UNIX 6th code reading - プロセス

初めての方はこちらを参照 http://d.hatena.ne.jp/takahirox/20101024/1287923014

はじめに

今回は7章の内容を扱います。

プロセスとは

1つのプロセスが、シェルやエディタなどの1つのプログラムに対応しています。
プロセスを切り替えることで、実行するプログラムを切り替えることができます。

プロセスはprocという構造体とuserという構造体のセットで表現されています。

この絵はちょっとわかりづらいか……?

proc
  • プロセスの状態や管理情報を保持している
  • サイズが小さい
  • proc[ ]配列がcoreに常駐しているので、いつでも全てのprocにアクセス可能。proc[ ]の上限サイズはNPROC(50).
  • プロセスを生成するということはnewproc( )を実行しproc[ ]に新たなprocを追加するということ
  • swtch( )で実行したいプロセスのprocをproc[ ]配列から選択する
user
  • プロセスが扱うプログラムやデータなどを保持している
  • 容量の観点から、全てのプロセスのuserをcoreに常駐させるのは難しい。なので、スワップイン・アウトによって適切なuserだけをcore領域に置く
    • coreの容量が足りなくなってくると、実行されていないプロセスのuserをcore領域からswap領域へスワップアウトさせる
    • 実行させたいプロセスのuserがswap領域にあるときは、swap領域からcore領域へスワップインさせる

メモ

estabur

ユーザ用のプロトタイプAPRを設定し、ユーザプロセスのセグメントを設定する。
セグメント構成は321-322P参照。
estaburでユーザプロトタイプAPRを設定した後にsuregを呼び出すことで実行中のプロセスに適切なAPRが実際にセットされる。

PDP11/40ではテキストセグメントとデータセグメントが分かれていない(sep=0)なので、今回はsep=1のロジックは追わない。

  • 1667-1681 : テキスト用にページ割り当て
    • 1667-1672 : 128block単位でページ割り当て
    • 1673-1676 : 128単位で割り当てていって、余った分をここで割り当てる。このページには最大の128blockではなく、必要なblockだけ割り当てる
    • テキスト領域はread only.
  • 1682-1702 : データ用にページ割り当て。ロジックはテキストの時とほとんど同じ
    • データ領域はread and write.
    • 1682 : データ領域の先頭16blockにはプロセス固有データ領域が割り当てられるのでUSIZE(16)足しておく
  • 1703-1713 : スタック用にページ割り当て。スタックは下方成長するので最上位ページ#8から降順に割り当てられていく
  • 1724 : sureg( )を実行し、現在実行中のプロセスに適切なPARをセットする
sureg

ユーザプロトタイプAPRに、現在実行中のプロセスのアドレス分だけ補正をすることで、APRに適切な値をセットする。
estaburでユーザプロトタイプを設定したときのほかに、retuでプロセスを切り替えたときにも呼び出す必要がある(はず)。

  • 1743-1753 : PARの設定
    • 1751 : a(=u.u_procp->p_addr)の分だけ補正
  • 1754-1764 : PDRの設定
    • 1762-1763 : write不可の領域(テキスト領域?)に対する補正。なぜ補正が必要なのかよくわかっていないので、後日確認する
newproc

新たなプロセスを生成する。
新たにプロセスを生成すると言うよりも、実行中のプロセスのコピーを生成していると言った方が正しいかもしれない。
proc[ ]に新たにprocが追加されるだけで、新しいプロセスに切り替わるわけではない。
切り替えるにはswtch( )を呼び出す必要がある。

  • 1846-1853 : proc[ ]から空きエントリを探す。なければpanic
  • 1859-1869 : 新しいプロセスのprocは、大部分が現在実行中のプロセスからのコピー. 当然pidは新たに設定する
  • 1876-1883 : どのファイルを開いているかという情報も新しいプロセスにコピーされる。なので、各ファイルが参照されているカウント数をインクリメントする。このあたりの詳細はファイルを扱う章で確認する予定
  • 1889-1916 : 新しいプロセス用にメモリを確保
    • coreからの確保を試みる。十分な領域があれば、実行中のプロセスをその領域にコピーする。十分な領域がなければ現在実行中のプロセスをスワップアウトする?
      • "If there is not enough core for the new process, swap out the current process to generate the copy." とunix v6ソースのコメントに書かれているのだが、1906-1907を見ると新しいプロセスをスワップアウトしてSSWAPフラグをセットしているように見える……。スワップを扱う章で改めて詳細を追う予定

終わりに

7章が終わりました。7章はプロセスが何かという説明が主なので、8章のプロセス管理まで読まないと、実際どう処理されているのかわかりづらいかもしれません。