紧接着上次的任务,我们在各进程的执行体加入一个打印当前的系统的ticks的数值,再在调度程序中加入打印当前的进程的ticks值:
- void Proc_A()
- {
- while(1)
- {
- Disp_Color_Str("A",0xc);
- Disp_Int(Get_Ticks());
- Milli_Delay(200);
- }
- }
- void Proc_B()
- {
- while(1)
- {
- Disp_Color_Str("B",0xd);
- Disp_Int(Get_Ticks());
- Milli_Delay(200);
- }
- }
- void Proc_C()
- {
- while(1)
- {
- Disp_Color_Str("C",0xe);
- Disp_Int(Get_Ticks());
- Milli_Delay(200);
- }
- }
- if(p_PCB->ticks > greatest_ticks)
- {
- Disp_Color_Str("<",0xa);
Disp_Int(p_PCB->ticks);
Disp_Color_Str(">",0xa); - greatest_ticks = p_PCB->ticks;
- p_Resume_PCB = p_PCB;
- }
同时注释掉把各进程的ticks值恢复到回来的priortiy值,以免让各进程无休止的运行下去。
编译链接,运行,结果如图所示:
下面我们就来分析,第一阶段因为进程A的ticks值最高,所以它得以优先运行,其它两个进程无法运行,直到进程A的ticks值比进程B的ticks值低时,控制权才回到进程B手中,这时就进入第二阶段,进程A与进程B轮流执行,进程C仍无法得到控制权,这一情况持续到进程A与进程B的ticks值都比进程C小时,进程C终于得到了控制权,这就进入第三阶段,进程A与进程B与进程C都有机会执行,直到这3个进程的ticks值都小于等于0。
下面就是书上的分析表格:
运行结果图的ABC3个字符的比为:11:7:4,跟书上的11:6:4接近,这个值与分析的理论的字符比11.5:6.5:4.5接近。但这与看上去的5:1.67:1相去甚远,虽然定性都一样,但定量不太一样。为了达到一致,修改一个地方就搞定了:
- if(Is_Reenter != 0)
- {
- Disp_Color_Str("!",0xe);
- return;
- }
- if(p_Resume_PCB->tickds > 0)
- {
- return;
- }
如果进程的ticks值大于0,则直接return,这也就意味着要继续霸占CPU。等到进程A的ticks消耗完之后,才轮到下一个ticks值最大的进程获得CPU。
为了得到更精确的结果,我们把各进程的延迟时间改为10ms,把进程A,B,C的priority字段分别改为15,5,3。再把打印语句注释掉。
编译链接,运行,结果如图所示:
来统计一下,结果如图:
怎么样,几乎一模一样吧。
哈哈,就这样结束了第6章,虽然说有不少东西需要我们消化,但起码对我来说算蛮快的了,我的目标是在这学期末搞定上半部分,看来是要提前完成任务了。这样也好,因为还有英语6级和期末考试,2个课程设计需要应付,计算机网络还几乎没看过。争取早点把上半部分仅存的第7章搞定,哦也。