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 だとするとここに合致しちゃう可能性もある、ということなのか。上に列挙した状態の定義によれば

  • 生成処理中
  • 終了処理中

なプロセスはスケジュール対象外、ということになるんですね。