操作系统原理实验报告

操作系统原理实验报告
操作系统原理实验报告

操作系统原理期末实验报告

最早截止优先(EDF)算法和

最低松弛度优先(LLF)算法的

C语言模拟

姓名:

学号:

指导老师:

专业:

实验目的:

加深对实时调度的理解,加深对最早截止优先算法和最低松弛度优先算法的理解,将C 语言的学习应用到实践。

实验内容:

本实验用C语言对两种实时调度系统进行了模拟。

分时调度系统主要是实现进程或任务调度的合理分配,既能合理的分配任务,又能满足用户对响应时间的要求。

当任务为实时任务时,即当对任务完成的截止时间有要求时,分时系统便不能满足要求。实时调度是能满足实时任务对截止时间的要求的任务。

实时调度单处理器对进程有以下要求:

i为进程第几次到来的脚标,C为进程的处理时间,P为进程的周期时间。

最早截止时间优先(EDF)算法是根据任务的截止时间来确定任务的优先级。截止时间愈早,优先级愈高。该算法要求在系统中保持一个实时任务就绪队列,该队列按各任务截止时间的早晚排序。具有最早截止时间的任务排在最前面,最先分配到处理机。可用于抢占式调度和非抢占式调度,可用于周期性实时任务和非周期性实时任务。

本实验中用C语言对最早截止优先算法用于抢占式周期实时任务的情况进行了模拟。

最低松弛度优先(LLF)算法是根据任务紧急(或松弛)的程度,来确定任务的优先级。任务的紧急程度愈高,为该任务所赋予的优先级就愈高,使之优先执行。在实现该算法时要求系统中有一个按松弛度排序的实时任务就绪队列,松弛度最低的任务排在队列最前面,被优先调度。松弛度的计算方法如下:

任务的松弛度=必须完成的时间-其本身的运行时间-当前时间。

其中其本身运行的时间指任务运行结束还需多少时间,如果任务已经运行了一部分,则:其本身运行时间=任务的处理时间-任务已经运行的时间。

本实验用C语言对最低松弛度优先算法进行了模拟。

总体设计:

1.最早截止优先算法:

本程序模拟两个任务同时到来时,进程依据最早截止优先算法的分配情况。

定义了如下变量:

Int T,模拟时间,T<=100;

Float m,判断所要处理的任务是否满足单机处理限制条件;

Int A,B,任务A,B的到达时间,主要用途是计算任务A,B的截止时间。截止时间=到达时间+周期时间;

Int cycA,cycB,任务A,B的周期时间,是需要用户输入的信息;

Int serveA,serveB,任务A,B的处理时间,是需要用户输入的信息;

Int a,b,任务A,B的下标,即标记任务A,B是第几次到来,第几次执行,第几次结束;

Int numa,numb,标记任务Ai,Bi的累计执行时间,当numa=serveA时,任务A完成,当numb=serveB时,任务B完成。

根据最早截止优先算法的规则,进程调度的过程中有以下五种情况:

(1)任务A,B同时到来,比较二者的截止时间,截止时间早的执行,截止时间晚的阻塞;(2)进程A顺利执行完毕,判断是否有需要执行的进程B,如果有,执行;

(3)进程B顺利执行完毕,判断是否有需要执行的进程A,如果有,执行;

(4)进程A执行过程中,有新的进程B产生,比较正在执行的进程A和新产生的进程B 的截止时间,执行截止时间早的,阻塞截止时间晚的;

(5)进程B执行过程中,有新的进程A产生,比较正在执行的进程B和新产生的进程A 的截止时间,执行截止时间早的,阻塞截止时间晚的。

直到T>100,结束。

因此本程序写了五个if语句,实现以上五种情况对进程执行的控制。

if(numa==serveA) //进程A完成{

numa=serveA+1;

printf("当T=%d时",T);

printf("进程A%d结束\n",a);

if(numb

printf(" 调用进程B%d\n",b);

kb=1;

}

ka=0;

}

if(numb==serveB) //进程B完成

{

numb=serveB+1;

printf("当T=%d时",T);

printf("进程B%d结束\n",b);

if(numa

{

printf(" 调用进程A%d\n",a);

ka=1;

}

kb=0;

}

if(T%cycA==0 && T%cycB==0) //两个进程同时产生

{

A=B=T;

++b;

printf("当T=%d时,进程A%d和进程B%d同时产生,此时,",T,a,b);

if(A+cycA<=B+cycB) //最后期限比较

{

printf("调用进程A%d,阻塞进程B%d\n",a,b);

ka=1;

kb=0;

}

else

{

printf("调用进程B%d,阻塞进程A%d\n",b,a);

ka=0;

kb=1;

}

numa=numb=0;

}

if(T%cycA==0&&T%cycB!=0) //新的A任务产生

{

A=T;

printf("当T=%d时",T);

printf("进程A%d产生 ",++a);

numa=0;

if(numb

if(B+cycB>A+cycA) //若进程B最早截止时间大于进程A的,执行A,阻塞B {

printf("进程A%d执行。\n",a);

ka=1;

kb=0;

else //若进程B最早截止时间小于等于进程A的,执行 B printf("进程B%d继续执行。\n",b); //

else //如果进程B完成,执行A

{

printf("进程A%d执行。\n",a);

ka=1;

}

}

if(T%cycA!=0&&T%cycB==0) //新的任务B产生

{

B=T;

printf("当T=%d时",T);

printf("进程B%d产生,",++b);

numb=0;

if(numa

if(B+cycB>=A+cycA)

printf("进程A%d继续执行。\n",a);

else

{

printf("进程B%d执行。\n",b);

kb=1;

ka=0;

}

else

{

printf("进程B%d执行。\n",b);

kb=1;

}

}

2.最低松弛度算法:

本程序模拟两个任务同时到来时,进程依据最低松弛度优先算法的分配情况。

定义了如下变量:

Int T,模拟时间,T<=100;

Float m,判断所要处理的任务是否满足单机处理限制条件;

Int cycA,cycB,任务A,B的周期时间,是需要用户输入的信息;

Int serveA,serveB,任务A,B的处理时间,是需要用户输入的信息;

Int a,b,任务A,B的下标,即标记任务A,B是第几次到来,第几次执行,第几次结束;

Int numa,numb,标记任务Ai,Bi的累计执行时间,当numa=serveA时,任务A完成,当numb=serveB时,任务B完成。用来计算进程当期的松弛度:松弛度=cyc*i-(serve-num)-T.

根据最早截止优先算法的规则,进程调度的过程中有以下五种情况:

(6)任务A,B同时到来,比较二者的松弛度,松弛度小的优先的执行;

(7)进程A顺利执行完毕,判断是否有需要执行的进程B,如果有,执行;

(8)进程B顺利执行完毕,判断是否有需要执行的进程A,如果有,执行;

(9)进程A执行过程中, B的松弛度降为0,若此时A的松弛度大于0,优先执行B,阻塞A;

(10)进程B执行过程中,A的松弛度降为0,若此时B的松弛度大于0,优先执行A,阻塞B。

直到T>100,程序结束。

因此本程序写了五个if语句,实现以上五种情况对进程执行的控制。

if(numa==serveA) //进程A完成{

numa=0;

printf("当T=%d时",T);

printf("进程A%d结束\n",a);

a++;

if(numbcycB*b-(serveB-numb)-T) //如果B的最低松弛度小

{

printf(" 调用进程B%d\n",b);

kb=1;

}

else if (T

{

printf(" 调用进程B%d\n",b);

kb=1;

}

ka=0;

}

if(numb==serveB) //进程B完成

{

numb=0;

printf("当T=%d时",T);

printf("进程B%d结束\n",b);

b++;

if(numa

{

printf(" 调用进程A%d\n",a);

ka=1;

}

else if (T

{

printf(" 调用进程A%d\n",a);

ka=1;

}

kb=0;

}

if(T%cycA==0 && T%cycB==0) //两个进程同时产生

{

numa=numb=0;

printf("当T=%d时,进程A%d和进程B%d同时产生,此时,",T,a,b); if(cycA*a-(serveA-numa)-T<=cycB*b-(serveB-numb)-T) {

printf("调用进程A%d,阻塞进程B%d\n",a,b);

ka=1;

kb=0;

}

else

{

printf("调用进程B%d,阻塞进程A%d\n",b,a);

ka=0;

kb=1;

}

}

if(cycA*a-(serveA-numa)-T==0) //A最低松弛度为0,优先处理

{

printf("当T=%d时",T);

printf("进程A%d松弛度为0 ",a);

if(numb

if(cycB*b-(serveB-numb)-T>0) //若进程B最低松弛度比A大,执行A {

printf("进程A%d执行。\n",a);

ka=1;

kb=0;

}

else //若进程B最低松弛度小于等于进程A的,执行B printf("进程B%d继续执行。\n",b);

else //如果进程B完成,执行A {

printf("进程A%d执行。\n",a);

ka=1;

}

}

if(cycB*b-(serveB-numb)-T==0) //B的最低松弛度为0

{

printf("当T=%d时",T);

printf("进程B%d松弛度为0,",b);

if(numa

if(cycA*a-(serveA-numa)-T<=0)

printf("进程A%d继续执行。\n",a);

else

{

printf("进程B%d执行。\n",b);

kb=1;

ka=0;

}

else

{

printf("进程B%d执行。\n",b);

kb=1;

}

}

运行结果:

最早截止优先算法:

程序完成后,输入了多种情况进行验证,运行结果正确,符合按照最早截止优先算法和最低松弛度优先算法得出的结果。这里只截取两种情况下的运行结果。

1.A的周期时间为20,服务时间为10;B的周期时间为50,服务时间为25

2.A的周期时间为30,服务时间为15;B的周期时间为20,服务时间为10

最低松弛度算法:

1.A的周期时间为20,服务时间为10;B的周期时间为50,服务时间为25

2.A的周期时间为20,服务时间为10;B的周期时间为50,服务时间为25

实践结果分析:

程序完成后,输入了多种情况进行验证,运行结果正确,符合按照最早截止优先算法和最低松弛度优先算法得出的结果。

本次实验的启示是:

编程前要理解清楚算法。我最开始编出来和书上给出的例子的结果比较,运行不正确,又重新看算法,再修改程序。浪费了很多时间。

实验前一定要做好实验设计,比如需要哪些变量,这些变量都是什么用途,需要什么样的语句实现我们想要的功能。否则程序写到后来就会很混乱,程序里出了小错找起来就会很麻烦,比如我最开始的时候,运行出来的程序A,B的脚标不对,浪费了挺多时间。

本次实验中存在的缺点是:最低松弛度优先算法的模拟程序,当判断某个程序松弛度为0,优先执行该程序时,接下来随着T的增加,直到该程序执行完,它的松弛度都为0,程

序对应的if语句会被连续调用多次,使结果看起来很繁琐。

相关文档
最新文档