Lions' 本読み (74)
newproc 云々な記述を確認してみました。まごろくさん tweet の実装確認です。
プロセスの複製を行うnewprocは、複製する子のメモリの獲得に失敗した場合、親の空間を共有した状態でswapoutを行い、子プロセスの空間をDISKに複製する。複製中に親のメモリが変化すると正しく複製されないため、複製中は親をスケジュールの対象から外す。この状態をSIDLと呼ぶ
https://twitter.com/magoroku15/status/226223902936952833 より引用
先ず、newproc 手続きの malloc 失敗な記述が以下。
1902 if(a2 == NULL) { 1903 rip->p_stat = SIDL; 1904 rpp->p_addr = a1; 1905 savu(u.u_ssav); 1906 xswap(rpp, 0, 0); 1907 rpp->p_flag = SSWAP; 1908 rip->p_stat = SRUN; 1909 } else {
1903 から 1908 (の手前) までが SIDL な状態、という事らしい。ではスケジュールの対象から外すってどーゆーことかというと直後で定義されている sched 手続きを見てみれば分かるはず。とその前にどんな状態が定義されているかを確認しておきます。
0382 #define SSLEEP 1 /* 高い優先度でスリープ中 */ 0383 #define SWAIT 2 /* 低い優先度でスリープ中 */ 0384 #define SRUN 3 /* 実行中 */ 0385 #define SIDL 4 /* プロセスは生成処理中である */ 0386 #define SZOMB 5 /* プロセスは終了処理中である */ 0387 #define SSTOP 6 /* プロセスはトレース処理中である */
で sched 手続きですが swapout な判断の部分を確認すれば良いはず。まずは以下。
1990 spl6(); 1991 for(rp = &proc[0]; rp < &proc[NPROC]; rp++) 1992 if((rp->p_flag&(SSYS|SLOCK|SLOAD))==SLOAD && 1993 (rp->p_stat == SWAIT || rp->p_stat==SSTOP)) 1994 goto found1;
SIDL な状態であればこの条件に合致することは無いですね。とは言えおそらく状態は SRUN だと思われますが。
次に出てくる swapout な判断が以下か。
2006 for(rp = &proc[0]; rp < &proc[NPROC]; rp++) 2007 if((rp->p_flag&(SSYS|SLOCK|SLOAD))==SLOAD && 2008 (rp->p_stat==SRUN || rp->p_stat==SSLEEP) && 2009 rp->p_time > n) {
SRUN だとするとここに合致しちゃう可能性もある、ということなのか。上に列挙した状態の定義によれば
- 生成処理中
- 終了処理中
なプロセスはスケジュール対象外、ということになるんですね。