Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
オペ―レーティングシステムの読み書き#2                 2011/10/3            Nagoya geekbar
9 Hardware Interrupts and Traps   Trap 前回のまとめ     命令の実行に失敗した場合の「わな」仕掛ける     システムコールの呼び出しは特殊な「わな」     「わな」はCPUの処理過程で発生す...
9.2 The Interrupt VectorVector                            device   priority  Location   060       Teletype input          ...
Teletype ?
Paper tape ?
Clocks – line and programmable   Line Clock     電源の周期から生成     AC>降圧(トランス)>整流(ダイオード)>コンデンサ     電源周波数のパルスを取り出せる     50H...
low.s0525: . = 60^.          Vector          device        entry0526:       klin; br40527:       klou; br4     060    Tele...
Clock   外部にあるclockから毎秒50個のパルスがCPUに    入る   1パルス毎に割り込みベクタの処理を実行    Clock                    CPU
kwlp low.s0568:0569: .globl _clock0570: kwlp: jsr r0,call; _clockCで書かれたclock()を呼ぶ
clock3725: clock(dev, sp, r1, nps, r0, pc, ps)          3761:                                                           37...
clock3725: clock(dev, sp, r1, nps, r0, pc, ps)          3761:                                                           37...
謎の変数 u.u_time u.u_stime pp->p_time lbolt time[2] tout[2]
Callout 構造struct callo{   int c_time;        /* ticks between events */   int c_arg;         /* function argument */   int...
clock callout (1/2)                                                先頭のcalloutが未3748:   if(callout[0].c_func == 0)3749:    ...
clock callout (2/2)                          先頭に登録時間が                                             過ぎているcallout3766:   spl5...
clock acct                                               USERモードから3787: out:                                     割り込まれたら、3...
clock schedの入り口(1/2)                                     clockが呼ばれると、ここまでは必3797:   if(++lbolt >= HZ) {                    ...
Clock schedの入り口(2/2)3810:       for(pp = &proc[0]; pp < &proc[NPROC]; pp++)   プロセスの管理構造の配3811:       if (pp->p_stat) {    ...
謎の変数 回答 u.u_time     USER時間 u.u_stime    SYSTEM時間 pp->p_time   プロセス起動からの時間 lbolt        毎秒60回++ time[2]      1970年からの...
Unix のPPDA (PerProcDataArea) User構造体       user.h   The user structure. One allocated per process. Contains all per proce...
なぞは深まるばかり次回はuser構造proc構造setpriwakeup
おわり
Upcoming SlideShare
Loading in …5
×

V6read#2

1,344 views

Published on

Published in: Technology, Business
  • Be the first to comment

V6read#2

  1. 1. オペ―レーティングシステムの読み書き#2 2011/10/3 Nagoya geekbar
  2. 2. 9 Hardware Interrupts and Traps Trap 前回のまとめ  命令の実行に失敗した場合の「わな」仕掛ける  システムコールの呼び出しは特殊な「わな」  「わな」はCPUの処理過程で発生する Interrupt  CPUの処理に関係なく、外部からの「割り込み」  主に、処理の完了時に「割り込み」  テレタイプ、紙テープ、ラインプリンタ、磁気 ディスク、時計
  3. 3. 9.2 The Interrupt VectorVector device priority Location 060 Teletype input 4 064 Teletype output 4 070 Paper tape input 4 074 Paper tape output 4 100 Line clock 6 104 Programmable clock 6 200 Line printer 4 220 RK disk driver 5
  4. 4. Teletype ?
  5. 5. Paper tape ?
  6. 6. Clocks – line and programmable Line Clock  電源の周期から生成  AC>降圧(トランス)>整流(ダイオード)>コンデンサ  電源周波数のパルスを取り出せる  50HZで20ms間隔  昔の電気式デジタル時計はパルスxHZで1秒を生成 Programmable clock  指定の間隔でパルスを発生 PDP-11ではどちらかが必要
  7. 7. low.s0525: . = 60^. Vector device entry0526: klin; br40527: klou; br4 060 Teletype input klin0528:0529: . = 70^. 064 Teletype output klou0530: pcin; br40531: pcou; br4 070 Paper tape input pcin0532: 074 Paper tape output pcou0533: . = 100^.0534: kwlp; br6 100 Line clock kwlp0535: kwlp; br60539: 104 Programmable clock kwlp0540: . = 200^.0541: lpou; br4 200 Line printer lpou0542:0543: . = 220^. 220 RK disk driver rkio0544: rkio; br5
  8. 8. Clock 外部にあるclockから毎秒50個のパルスがCPUに 入る 1パルス毎に割り込みベクタの処理を実行 Clock CPU
  9. 9. kwlp low.s0568:0569: .globl _clock0570: kwlp: jsr r0,call; _clockCで書かれたclock()を呼ぶ
  10. 10. clock3725: clock(dev, sp, r1, nps, r0, pc, ps) 3761: 3797: if(++lbolt >= HZ) {3726: { 3762: /* 3798: if((ps&0340) != 0)3727: register struct callo *p1, *p2; 3763: * callout 3799: return;3728: register struct proc *pp; 3764: */ 3800: lbolt =- HZ;3729: 3765: 3801: if(++time[1] == 0)3730: /* 3766: spl5(); 3802: ++time[0];3731: * restart clock 3767: if(callout[0].c_time <= 0) { 3803: spl1();3732: */ 3768: p1 = &callout[0]; 3804: if(time[1]==tout[1] && time[0]==tout[0])3733: 3769: while(p1->c_func != 0 && p1->c_time <= 0) { 3805: wakeup(tout);3734: *lks = 0115; 3770: (*p1->c_func)(p1->c_arg); 3806: if((time[1]&03) == 0) {3735: 3771: p1++; 3807: runrun++;3736: /* 3772: } 3808: wakeup(&lbolt);3737: * display register 3773: p2 = &callout[0]; 3809: }3738: */ 3774: while(p2->c_func = p1->c_func) { 3810: for(pp = &proc[0]; pp < &proc[NPROC]; pp++)3739: 3775: p2->c_time = p1->c_time; 3811: if (pp->p_stat) {3740: display(); 3776: p2->c_arg = p1->c_arg; 3812: if(pp->p_time != 127)3741: 3777: p1++; 3813: pp->p_time++;3742: /* 3778: p2++; 3814: if((pp->p_cpu & 0377) > SCHMAG)3743: * callouts 3779: } 3815: pp->p_cpu =- SCHMAG; else3744: * if none, just return 3780: } 3816: pp->p_cpu = 0;3745: * else update first non-zero time 3781: 3817: if(pp->p_pri > PUSER)3746: */ 3782: /* 3818: setpri(pp);3747: 3783: * lightning bolt time-out 3819: }3748: if(callout[0].c_func == 0) 3784: * and time of day 3820: if(runin!=0) {3749: goto out; 3785: */ 3821: runin = 0;3750: p2 = &callout[0]; 3786: 3822: wakeup(&runin);3751: while(p2->c_time<=0 && p2->c_func!=0) 3787: out: 3823: }3752: p2++; 3788: if((ps&UMODE) == UMODE) { 3824: if((ps&UMODE) == UMODE) {3753: p2->c_time--; 3789: u.u_utime++; 3825: u.u_ar0 = &r0;3754: 3790: if(u.u_prof[3]) 3826: if(issig())3755: /* 3791: incupc(pc, u.u_prof); 3827: psig();3756: * if ps is high, just return 3792: } else 3828: setpri(u.u_procp);3757: */ 3793: u.u_stime++; 3829: }3758: 3794: pp = u.u_procp; 3830: }3759: if((ps&0340) != 0) 3795: if(++pp->p_cpu == 0) 3831: }3760: goto out; 3796: pp->p_cpu--;
  11. 11. clock3725: clock(dev, sp, r1, nps, r0, pc, ps) 3761: 3797: if(++lbolt >= HZ) {3726: { 3762: /* 3798: if((ps&0340) != 0)3727: register struct callo *p1, *p2; 3763: * callout 3799: return;3728: register struct proc *pp; 3764: */ 3800: lbolt =- HZ;3729: 3765: 3801: if(++time[1] == 0)3730: /* 3766: spl5(); 3802: ++time[0];3731: * restart clock 3767: if(callout[0].c_time <= 0) { 3803: spl1();3732: */ 3768: p1 = &callout[0]; 3804: if(time[1]==tout[1] && time[0]==tout[0])3733: 3769: while(p1->c_func != 0 && p1->c_time <= 0) { 3805: wakeup(tout);3734: *lks = 0115; 3770: (*p1->c_func)(p1->c_arg); 3806: if((time[1]&03) == 0) {3735: 3771: p1++; 3807: runrun++; Callout3736: /* 3772: } 3808: wakeup(&lbolt);3737: * display register 3773: p2 = &callout[0]; 3809: }3738: */ 3774: while(p2->c_func = p1->c_func) { 3810: for(pp = &proc[0]; pp < &proc[NPROC]; pp++)3739: 3775: p2->c_time = p1->c_time; 3811: if (pp->p_stat) { Sched3740: display(); 3776: p2->c_arg = p1->c_arg; 3812: if(pp->p_time != 127)3741: 3777: p1++; 3813: pp->p_time++;3742: /* 3778: p2++; 3814: if((pp->p_cpu & 0377) > SCHMAG)3743: * callouts 3779: } 3815: pp->p_cpu =- SCHMAG; else3744: * if none, just return 3780: } 3816: pp->p_cpu = 0;3745: * else update first non-zero time 3781: 3817: if(pp->p_pri > PUSER) の入り口3746: */ 3782: /* 3818: setpri(pp);3747: 3783: * lightning bolt time-out 3819: }3748: if(callout[0].c_func == 0) 3784: * and time of day 3820: if(runin!=0) {3749: goto out; 3785: */ 3821: runin = 0;3750: p2 = &callout[0]; 3786: 3822: wakeup(&runin); Acct3751: while(p2->c_time<=0 && p2->c_func!=0) 3787: out: 3823: }3752: p2++; 3788: if((ps&UMODE) == UMODE) { 3824: if((ps&UMODE) == UMODE) {3753: p2->c_time--; 3789: u.u_utime++; 3825: u.u_ar0 = &r0;3754: 3790: if(u.u_prof[3]) 3826: if(issig())3755: /* 3791: incupc(pc, u.u_prof); 3827: psig();3756: * if ps is high, just return 3792: } else 3828: setpri(u.u_procp);3757: */ 3793: u.u_stime++; 3829: }3758: 3794: pp = u.u_procp; 3830: }3759: if((ps&0340) != 0) 3795: if(++pp->p_cpu == 0) 3831: }3760: goto out; 3796: pp->p_cpu--;
  12. 12. 謎の変数 u.u_time u.u_stime pp->p_time lbolt time[2] tout[2]
  13. 13. Callout 構造struct callo{ int c_time; /* ticks between events */ int c_arg; /* function argument */ int (*c_func)(); /* function pointer */} callout[NCALL];
  14. 14. clock callout (1/2) 先頭のcalloutが未3748: if(callout[0].c_func == 0)3749: goto out; 登録なら、後続の3750: p2 = &callout[0]; calloutも未登録と 判断して,Callout 処理をスキップ3751: while(p2->c_time<=0 && p2->c_func!=0)3752: p2++; 最初にc_timeが03753: p2->c_time--; より大きいCallout3758: を見つけて、3759: if((ps&0340) != 0) c_timeを-13760: goto out; ここより前の3761: calloutはこの後処 理される
  15. 15. clock callout (2/2) 先頭に登録時間が 過ぎているcallout3766: spl5(); が存在したら、3767: if(callout[0].c_time <= 0) {3768: p1 = &callout[0];3769: while(p1->c_func != 0 && p1->c_time <= 0) {3770: (*p1->c_func)(p1->c_arg);3771: p1++; 処理を実行3772: }3773: p2 = &callout[0];3774: while(p2->c_func = p1->c_func) {3775: p2->c_time = p1->c_time; Callout配列を詰め3776: p2->c_arg = p1->c_arg; る3777: p1++;3778: p2++;3779: }3780: }
  16. 16. clock acct USERモードから3787: out: 割り込まれたら、3788: if((ps&UMODE) == UMODE) { uのuser時間3789: u.u_utime++; u_utimeを+13790: if(u.u_prof[3])3791: incupc(pc, u.u_prof); KERNELモードか3792: } else ら割り込まれたら、3793: u.u_stime++; uのsystem時間 u_stimeを+13794: pp = u.u_procp;3795: if(++pp->p_cpu == 0) Procのp_cpuを加3796: pp->p_cpu--; 算。オーバフロー しないように調整ppはproc構造のポインタ、uはuser構造。共にプロセスの管理構造1プロセスに1個づつ
  17. 17. clock schedの入り口(1/2) clockが呼ばれると、ここまでは必3797: if(++lbolt >= HZ) { ず実行。lboltを+1して、HZ(50)を3798: if((ps&0340) != 0)3799: return; 超過したら、すなわち1秒経過し3800: lbolt =- HZ; たら、3801: if(++time[1] == 0)3802: ++time[0]; lboltをリセット3803: spl1();3804: if(time[1]==tout[1] && time[0]==tout[0])3805: wakeup(tout);3806: if((time[1]&03) == 0) { 寝ているプロセスを起こす3807: runrun++;3808: wakeup(&lbolt);3809: } 4秒ごとにlboltで待ってるプロセ スを起こす 今回はさらりと流す
  18. 18. Clock schedの入り口(2/2)3810: for(pp = &proc[0]; pp < &proc[NPROC]; pp++) プロセスの管理構造の配3811: if (pp->p_stat) { 列をスキャン3812: if(pp->p_time != 127)3813: pp->p_time++;3814: if((pp->p_cpu & 0377) > SCHMAG) p_statに値が入っている=プロ3815: pp->p_cpu =- SCHMAG; else セスが存在したら、p_timeを3816: pp->p_cpu = 0; +13817: if(pp->p_pri > PUSER)3818: setpri(pp);3819: }3820: if(runin!=0) {3821: runin = 0;3822: wakeup(&runin); runinが真なら、runinで待って3823: } るプロセスをwakeup3824: if((ps&UMODE) == UMODE) {3825: u.u_ar0 = &r0;3826: if(issig())3827: psig();3828: setpri(u.u_procp);3829: }3830: }
  19. 19. 謎の変数 回答 u.u_time USER時間 u.u_stime SYSTEM時間 pp->p_time プロセス起動からの時間 lbolt 毎秒60回++ time[2] 1970年からの秒 tout[2] sleep(2)が起きる時間
  20. 20. Unix のPPDA (PerProcDataArea) User構造体 user.h The user structure. One allocated per process. Contains all per process data that doesnt need to be referenced while the process is swapped. Proc構造体 proc.h One structure allocated per active process. It contains all data needed about the process while the process may be swapped out. Other per process data (user.h) is swapped with the process.
  21. 21. なぞは深まるばかり次回はuser構造proc構造setpriwakeup
  22. 22. おわり

×