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系?)だけれども,歴史を知る上では価値があるかもしれない.
KSE関係の参考資料
http://www.freebsd.org/kse/index.html
http://www.jp.freebsd.org/cgi/mroff.cgi?subdir=man&lc=1&cmd=&man=kse&dir=jpman-5.3.0%2Fman§=0
http://gihyo.jp/admin/clip/01/fdt/200803/13
http://gihyo.jp/admin/clip/01/fdt/200906/22