Lions' 本読み (75)

@superhoge さんが expand で云々な tweet を目にしたので expand を確認してみたのですが swapout のあたり、完全に忘却の彼方に去ってしまっててヘコむ。以下にリハビリのメモを。

微妙だったのは以下なあたり

2282    a2 = malloc(coremap, newsize);
2283    if(a2 == NULL) {
2284            savu(u.u_ssav);
2285            xswap(p, 1, n);
2286            p->p_flag =| SSWAP;
2287            swtch();
2288            /* リターンしない */
  • swapout な時に使う u.u_ssav で savu
  • ユーザ構造体を swapout
  • プロセス構造体の p_flag 属性に SSWAP を立てる
  • swtch 手続き呼び出し

これで再度スワップインする時には expand の呼び出し元に戻る形になるはず。あら、領域拡張はどうなるんだろう、というあたりで迷路状態だったんですがプロセス構造体の p_size 属性は拡張後のサイズになってて、sched 手続きでスワップインする時に新しいサイズでデータ領域を、という事になる模様。
ちなみにこの時点ではまだ p_flag 属性には SSWAP が立ったままになってて、これは swtch 手続きでフラグが落とされる形になってます。

ちなみに

@superhoge さんはマルチプロセスな実装になった時の問題点について色々 tweet されてましたが、xv6 とこれを比べて差分をもごもごしてみるのは面白いかもしれないですね。