FreeBSDのプロセス構造体

表面をなぞっただけの浅い話.個人的備忘録.

5.2-RELEASEのプロセス構造体

プロセス関連の構造体は,src/sys/sys/proc.h と src/sys/sys/user.h に定義されている.

user.hでは,ユーザ構造体が定義されている.
BSDカーネルの設計と実装』によれば,「デバッグ上の都合を満たす考古学的価値のために残されている」(p.121)とのこと.

struct user {
	struct	pstats u_stats;		/* *p_stats */
	/*
	 * Remaining field for a.out core dumps - not valid at other times!
	 */
	struct	kinfo_proc u_kproc;	/* eproc */
};

proc.hでは,以下の4つの構造体が定義されている.

struct thread;
struct kse;
struct ksegrp;
struct proc;

proc はプロセス構造体.
プロセスは,プログラムが実行状態になったもの.プログラムを実行するには,メモリなどのリソース管理が必要なので,プロセスとリソースが紐付けられる.


thread はスレッド構造体.
スレッドは,プロセスを実行するときの実行単位.プロセス内に1つ以上のスレッドが存在でき,シュケジューラによりCPUを割り当てられ実行される.PC(プログラムカウンタ)など一部を除くと,多くのリソースを同じプロセスに所属する他のスレッドと共有できる.各スレッドを並列に実行することが可能.


このスレッドは5系から導入された機能.マルチプロセッサへの対応が進んだのが5系.見聞きした範囲では,安定し出したのは6系からで,性能が出だしたのは7系からだったような気がする.


KSE(kse, ksegrp)は,カーネルスレッドとユーザスレッドとの関係でM:Nを実現するための機構.
スレッドにはカーネル空間で実現したカーネルスレッドとユーザー空間で実現したユーザスレッドがある.KSEではカーネルスレッドとユーザスレッドで情報共有できる仕組みをつくることで実現.ただ,現在はM:Nモデルが廃れて,1:1モデルが一般的になっている.(1:1モデルは全部カーネル任せ,1:Nは全部ユーザ任せ.M:Nはその中間モデル.)KSEも7系以降で消えてしまった機構(明確に消えたのは8系?)だけれども,歴史を知る上では価値があるかもしれない.