深圳 大学实 验报告
课程名称:
操作系统
实验项目名称:
处理机调度
学院:
计算机与软件学院
专业:
软件工程
指导教师:
报告人:学号:
班级:
实验时间:
2013年 5月7日
实验报告提交时间:
2013年 5月22日
教务处制
一、实验目的与要求:
实验目的:模拟在单处理器多进程操作系统的 CPU调度。帮助学生掌握多种CPU调度 算法的知识原理和运作机制。本实验为模拟实验,不要求实现真正的进程创建与进程 调度。主要实现各种调度算法。实验要求:
1、 阅读理解例程,掌握例程的运作流程。运行例程,理解先来先服务算法的调度原理 和运行结果。2、 参考先来先服务算法,尝试实现其他四种调度算法:短作业优先、高响应比、时间 片轮转、多级反馈队列。要求至少实现一种算法。a) 除了多级反馈队列,其他算法采用非抢占调度
b) 短作业优先算法使用例题一数据或程序内置数据,要求运行结果给出调度顺
序、完成时间、周转时间、带权周转时间
c) 高响应比算法使用例题二的数据,要求运行结果给出调度顺序、完成时间、周 转时间、带权周转时间d) 时间片轮转算法可以使用程序内置数据,要求运行结果给出每个时间片是被哪 个进程使用,每个进程完成时,要修改状态并输出提示。e) 多级反馈队列算法使用例题三的数据,要求运行结果给出正确的进程调度顺序 和过程描述。二、方法、步骤:(说明程序相关的算法原理或知识内容,程序设计的思路和方法,可以用流程图 表述,程序主要数据结构的设计、主要函数之间的调用关系等 )先来先服务算法:
按到达时间先后,选择最先来的作业最先执行
实现思想:
对作业的到达时间按大小进行排序,然后按顺序执行
短作业优先算法:
在后备队列中,选择服务时间最短的作业最先执行 实现思想:
对作业按到达时间排序,接着对到达的作业,即后备队列中的作业按服务时间 排序,取服务时间最小的作业最先执行高响应比算法:
对作业的优先权(响应时间/要求服务时间)进行计算,对优先权最高的最先执 行 实现实现:计算后备队列中作业的优先权,并排序,优先权最高的最先执行
时间片轮转算法:
将所有就绪进程按先来先服务排成队列,把 CPU分配给队首进程,进程只执行 一个时间片,时间片用完后,将已使用时间片的进程送往就绪队列的末尾,分配处理 机给就绪队列中下一进程 实现思想:将作业按到达时间排序,在后备队列中选择第一个作业,把 CPU分配给它,执 行一个时间片,时间片用完后,将作业送往后备队列的末尾,把 CPU分配给下一个作 业,直到所有作业完成多级反馈队列调度算法:
设置多个就绪队列,各个队列优先级逐个降低,各个队列时间片逐个增加,优 先级越高的队列执行时间片就越短,一般时间片按倍增规则,每个新进程首先进入第 一个队列,遵循FCFS,在当前队列的时间片内,进程若能完成,退出,进程若未完成, 降级到第二个队列,同样遵循 FCFS依次类推,若在第二个队列的时间片内仍未完成, 再降级到第三个队列…… 实现思想:设置多个就绪队列,各个队列优先级逐个降低,各个队列时间片逐个增加,优 先级越高的队列执行时间片就越短,一般时间片按倍增规则, 例如,第二队列的时间片要比第一个队列的时间片长一倍, ……,第i+1个队列的时间片要比第i个队列的时
间片长一倍,整合了时间片、 FCFS、优先级三种机制。
三?实验过程及内容:(对程序代码进行说明和分析,越详细越好,代码排版要整齐,可读性要高 )#include "stdio.h"
#include<stdlib.h>
〃#include<conio.h>
#include<time.h>
#include<math.h>
〃#define NULL 0
#define getpch(type)(type*)malloc(sizeof(type))typedef struct pcb PCB;
struct pcb{ //定义进程控制块PCB
int id; //标示符
char name[10]; II 名称
int time_start; 〃到达时间
int time need; II服务时间
〃剩余运行时间II
〃剩余运行时间
II已使用时间
//进程状态
int time_used; char state;
};
II**************** 系统函
void _sleep(int n)
{
clock_t goal; goal=(clock_t)n*CLOCKS_PER_SEC+clock(); while(goal>clock());}
char _keygo()
{ _
char c; printf("按任意键继续……\n"); c=getchar(); return c;}
用户函数//****************** int time_unit=2;用户函数
int num=5; //实际进程数量
PCB pcbdata[10]={
〃例程内置数据
{1000,"A",0,4,4,0,'R'},
{1001,"B",1,3,3,0,'R'},
{1002,"C",2,5,5,0,'R'},
{1003,"D,,,3,2,2,0,'R'},
{1004,"E",4,4,4,0,'R'}, };
int num1=4;
PCB pcbdata1[10]={
〃例题一数据
{1000,"Job1",1,9,9,0,'R'}, {1001,"Job2",1,16,16,0,'R'},{1002,"Job3",1,3,3,0,'R'},
{1003,"Job4",1,11,11,0,'R'}, }; int num2=4; PCB pcbdata2[10]={〃例题二数据
{1000,"P1",10,8,8,0,'R'},
{1001,"P2",12,12,12,0,'R'}, {1002,"P3",14,4,4,0,'R'},,"P4",
};
int num3=4;
PCB pcbdata3[10]={
〃例程三数据
{1000,"A",0,7,7,0,'R'},
{1001,"B",5,4,4,0,'R'},
{1002,"C",7,13,13,0,'R'}, {1003,"D",12,9,9,0,'R'},};
int ready[10]; 〃就绪队列,存放进程在 pcbdata中的位置
int order[10]; //记录排序使用哪个数值作为排序对象
void intput()
{
int i;
printf("进程总数为:");
scanf("%d",&num);
for(i=0;ivnum;i++)
{
pcbdata[i].id=1000+i;
printf("输入第%d个进程名:",i+1);
scanf("%s",&pcbdata[i].name);
printf("输入第%d个进程到达时间:",i+1); scanf("%d",&pcbdata[i].time_start);printf("输入第%d个进程服务时间:",i+1); scanf("%d",&pcbdata[i].time_need); pcbdata[i].time_left=pcbdata[i].time_need; printf("\n");pcbdata[i].time_used=0; pcbdata[i].state='R';}
} void FCFS() {
//**************调度函数
//*
*************
调度函数
int i,j,temp; double k; for(i=0;i<num;i++) {order[i]=pcbdata[i].time_start; ready[i]=i;}
for(i=0;i<num;i++) 〃按到达时间排序
if(order[i]>order[j])
{
temp=order[i]; order[i]=order[j]; order[j]=temp; temp=ready[i]; ready[i]=ready[j]; ready[j]=temp;}
}
printf("---先来先服务算法调度:非抢占,无时间片---\n");
temp=pcbdata[ready[0]].time_start;
for(i=0;i<num;i++)
{
printf("第%d 个进程--%s,",i+1,pcbdata[ready[i]].name);printf("本进程正在运行 ");
_sleep(1)j
printf("运行完毕 \n");
temp+=pcbdata[ready[i]].time_need; j=temp-pcbdata[ready[i]].time_start; k=(float)j/pcbdata[ready[i]].time_need;printf("完成时间--%d,周转时间--%d,带权周转时间--%.1f\n",temp,j,k); } printf(" 所有进程调度完毕 \n");}
void SJF()
{
int i,j,temp,l,temp_num;
double k;
int time=0;
for(i=0;i<num1;i++)
{
order[i]=pcbdata1[i].time_start; ready[i]=i;} for(i=0;i<num1;i++) //按到达时间排序
for(j=i+1;j<num1;j++)
{
if(order[i]>order[j])
{ temp=order[i]; order[i]=order[j];
order[j]=temp; temp=ready[i]; ready[i]=ready[j]; ready[j]=temp;}
}
printf("---短作业算法调度:非抢占,无时间片---\n");
int t_ready[10]; //就绪队列,存放进程在 pcbdata中的位置int t_order[10]; //记录排序使用哪个数值作为排序对象
for(i=0;i<num1;i++)
{
t_order[i]=pcbdata1[ready[i]].time_need;//]艮务时间作为排序对象 t_ready[i]=ready[i];} _
time=order[0];
for(l=0;lvnum1;l++){
〃判断到达的进程数,用temp_num存放
for(i=0;i<num &&pcbdata1[ready[i]].time_startv=time;i++) temp_num=i+1;//把到达的进程按服务时间大小进行排序
for(i=0;ivtemp_num;i++) for(j=i+1;jvtemp_num;j++) { _if(t_order[i]>t_order[j]&&t_order[j]!=0||t_order[i]==0)殳 _ _ 一 一
temp=t_order[i]; t_order[i]=t_order[j]; t_order[j]=temp; temp=t_ready[i]; t_ready[i]=t_ready[j]; t_ready[j]=temp;} _
}
printf("第%d 个进程--%s,",l+1,pcbdata1[t_ready[0]].name); printf("正在运行 ");_sleep(1)j
printf("运行完毕 \n");
time+=pcbdata1[t_ready[0]].time_need;
j=time-pcbdata1[t_ready[0]].time_start; k=(float)j/pcbdata1[t_ready[0]].time_need; t_order[0]=0;printf("完成时间--%d,周转时间--%d,带权周转时间
--%.1f\n",time,j,k);
} printf(" 所有进程调度完毕 \n");
}
void HRF()
{
int i,j,temp,l,temp_num; double k;
int time=0;
for(i=0;ivnum2;i++)
{
order[i]=pcbdata2[i].time_start; ready[i]=i;} for(i=0;i<num2;i++) //按到达时间排序
for(j=i+1;j<num2;j++)
{
if(order[i]>order[j])
{ temp=order[i]; order[i]=order[j]; order[j]=temp; temp=ready[i]; ready[i]=ready[j]; ready[j]=temp;}
}
printf("---高响应比算法调度:非抢占,无时间片---\n"); int t_ready[10];int t_order[10]; for(i=0;i<num2;i++)
{
t_order[i]=1; t_ready[i]=ready[i];
} _
time=order[0]; for(l=0;l<num2;l++){
〃判断到达进程数
for(i=0;i<num &&pcbdata2[ready[i]].time_startv=time;i++) temp_num=i+1;for(i=0;ivtemp_num;i++) //计算已到达进程的优先权
{ if(t order[i])
t_order[i]=(time-pcbdata2[t_ready[i]].time_start+ pcbdata2[t_ready[i]].time_need)/pcbdata2[t_ready[i]].time_need;} for(i=0;ivtemp_num;i++) // 按优先权排序
for(j=i+1;jvtemp_num;j++)
{
if(t_order[i]vt_order[j])
{ 一 一
temp=t_order[i]; t_order[i]=t_order[j]; t_order[j]=temp; temp=t_ready[i]; t_ready[i]=t_ready[j]; t_ready[j]=temp;} _
}
printf("第%d 个进程--%s,",l+1,pcbdata2[t_ready[0]].name);printf("正在运行 ");
_sleep(1);
printf("运行完毕 \n");
time+=pcbdata2[t_ready[0]].time_need;
j=time-pcbdata2[t_ready[0]].time_start; k=(float)j/pcbdata2[t_ready[0]].time_need; t_order[0]=0;printf("完成时间--%d,周转时间--%d,带权周转时间 --%.1f\n",time,j,k);}
printf(" 所有进程调度完毕 \n");
}
void Timeslice()
{
int i,j,temp,l,temp_num;
double k;
int time=0;
int done=0;
for(i=0;i<num;i++)
{
order[i]=pcbdata[i].time_start;
ready[i]=i;
} for(i=0;i<num;i++) //按到达时间排序
for(j=i+1;jvnum;j++)
if(order[i]>order[j])
{
temp=order[i]; order[i]=order[j]; order[j]=temp; temp=ready[i]; ready[i]=ready[j]; ready[j]=temp;}
}
printf("---时间片轮转算法调度:非抢占,时间片大小为 2---\n");int t_ready[10];
for(i=0;i<num;i++)
{
t_ready[i]=ready[i];
} time=order[0]; for(l=0;done<num;l++){
〃判断到达的进程数
for(i=0;i<num &&pcbdata[ready[i]].time_startv=time;i++) temp_num=i+1;if(time!=order[0]){
〃将已使用时间片的进程,即第一个移到队列末尾
for(i=1;ivtemp_num;i++){ temp=t_ready[i]; t_ready[i]=t_ready[i-1]; t_ready[i-1]=temp;}
}
if(pcbdata[t_ready[0]].state!='F'){
printf(" 第 %d 个时间片被进程 %s 使 用,",l+1,pcbdata[t_ready[0]].name);printf("正在运行 \n ");
_sleep(1);
printf("时间片使用完,所需时间 %d,",pcbdata[t_ready[0]].time_left); time+=2;pcbdata[t_ready[0]].time_used+=2; pcbdata[t_ready[0]].time_left-=2; printf("使用时间 %d,还需时间 %d,",2,pcbdata[t_ready[0]].time_left);〃判断进程是否结束
if(pcbdata[t_ready[0]].time_leftv=0){
printf("进程 %s 结束\n",pcbdata[t ready[0]].name);done++;
pcbdata[t_ready[0]].state='F';
} _
else
printf("进程 %s 就绪\n",pcbdata[t_ready[0]].name);}
} printf(" 所有进程调度完毕 \n");
}
void MRLA()
{
int i,j,temp,l,temp_num,temp_num2; double k;int time=0; //系统时间
int done=0; //已完成的进程
int t_ready[10];
int queue[10]; 〃进程对应的队列
int qtime[10]; 〃进程对应的时间片
for(i=0;ivnum3;i++)
{
order[i]=pcbdata3[i].time_start;
ready[i]=i; queue[i]=1; qtime[i]=0;
} for(i=0;i<num3;i++) 〃按到达时间排序
for(j=i+1;j<num3;j++)
{
if(order[i]>order[j])
{ temp=order[i]; order[i]=order[j]; order[j]=temp; temp=ready[i]; ready[i]=ready[j]; ready[j]=temp;}
}
printf("---多级反馈算法调度:抢占式,时间片大小为 2---\n");
for(i=0;i<num3;i++)
{
t_ready[i]=ready[i];
time=order[0]; for(l=0;done<num3;l++){
〃判断到达的进程数
for(i=0;i<num3&&pcbdata3[ready[i]].time_startv=time;i++) temp_num=i+1;if(time!=order[0]){ for(i=0;ivtemp_num;i++) II 按队列优先级排序 for(j=1;jvtemp_num-i;j++){ if(pcbdata3[t_ready[j-1]].state=='F'||(queue[j-1]>queue[j] && pcbdata3[t_ready[j]].state!='F')){ temp=queue[j-1]; queue[j-1]=queue[j]; queue[j]=temp;temp=t_ready[j-1];
t_ready[j-1]=t_ready[j]; t_ready[j]=temp;temp=qtime[j-1];
qtime[j-1]=qtime[j]; qtime[j]=temp;
}
}
}
if(pcbdata3[t_ready[0]].state!='F'){ printf("队列 %d 中的进程 %s 占用 CPU,",queue[0], pcbdata3[t_ready[0]].name);printf("正在运行 \n ");
_sleep(1); if(!qtime[0]) //判断是否有未用完的时间片
qtime[0]=pow(2,queue[0]);
else printf("继续使用时间片,"); for(i=1;ivqtime[0];i++){
time++;
for(j=0;j<num3&&pcbdata3[ready[j]].time_startv=time;j++) temp_num2=j+1;〃判断是否有进程进入比本进程更高优先级的队列
if(temp_num!=temp_num2&&queue[0]>queue[temp_num2-1]&& pcbdata3[t_ready[0]].time_left-i>0){ qtime[0]-=i;break;
if(temp_num!=temp_num2&&queue[0]>queue[temp_num2-1]&&pcbdata3[t_read y[0]].time_left-i>0){printf("发生抢占,使用时间片%d,剩余时间片%d,返回队列尾部\n",i,qtime[0]);}
else{
printf("时间片使用完,所需时间%d,", pcbdata3[t_ready[0]].time_left);time++;
pcbdata3[t_ready[0]].time_used+=pow(2,queue[0]); pcbdata3[t_ready[0]].time_left-=pow(2,queue[0]);if(pcbdata3[t_ready[0]].time_leftv=0){ printf("使用时间%d,还需时间%d,进程%s结束\n",qtime[0], pcbdata3[t_ready[0]].time_left,pcbdata3[t_ready[0]].name);done++;
pcbdata3[t_ready[0]].state='F';
} _
else printf("使用时间%d,还需时间%d,进程%s进入队列%d就绪 \n",qtime[0],pcbdata3[t_ready[0]].time_left,pcbdata3[t_ready[0]].name,++queue[0]);qtime[0]=0;
}
} for(j=1;jvtemp_num2;j++){ //将执行的程序返回队尾排队temp=queue[j];
queue[j]=queue[j-1]; queue[j-1]=temp;
temp=qtime[j]; qtime[j]=qtime[j-1]; qtime[j-1]=temp;temp=t_ready[j];
t_ready[j]=t_ready[j-1]; t_ready[j-1]=temp;} _
}
printf(" 所有进程调度完毕 \n");
int main()
{
int i=0,sch=99; while(sch!=0) {printf("\n请选择其中一种调度算法:\n"); printf("(1)先来先服务 FCFS\n"); printf("(2)短作业优先 SJF\n");printf("(3)高响应比 HRF\n");
printf("(4)时间片轮转 Timeslice\n"); printf("(5)多级反馈队列 MRLA\n");printf("(0)退出 \n");
printf("请输入上述一个数字:");
scanf("%d", &sch);
switch(sch)
{
case 1:FCFS();break;
case 2:SJF();break;
case 3:HRF();break;
case 4:Timeslice();break;
case 5:MRLA();break;
case 0:printf('退出程序 \n");break;
}
}
_keygo(); return 0;
}
void dis_pcb(PCB * pr)
{ _ printf("%s 的 PCB:\n",pr->name); printf("标识符--%d,状态--%c,到达时间--%d\n",pr->id,pr->state,pr->time_start); printf(" 服务时间--%d,剩余运行时间--%d,已用时间 --%d\n",pr->time_need,pr->time_left,pr->time_used);printf(" \n");
}
void dis_pcb_all()
{ 一 一
int i;
printf("***当前所有进程状态******\n");
for(i=0;i<num;i++)
dis_pcb(&pcbdata[i]);
L
void dis_ready()
{ _
int i;
printf("当前就绪队列为:");
for(i=0;ivnum-1;i++) printf("%s--",pcbdata[order[i]].name);printf("%s\n",pcbdata[order[i]].name);
}
zhouj i ancan?zhouj i ancan-PC /2011150368 $ - /aBI回匚-/201115036a四、实验结论:(提供运行结果,对结果进行探讨、分析、评价,并提出结论性意见和改进想法) 先来先服务算法 FCFS:优点:实现简单,算法开销小,有利于长时间作业(进程) 缺点:不利于短时间作业(进程)O'E i 口 E
zhouj i ancan?zhouj i ancan-PC /2011150368 $ - /a
B
I回
匚-/201115036a
四、实验结论:(提供运行结果,对结果进行探讨、分析、评价,并提出结论性意见和改进想法) 先来先服务算法 FCFS:
优点:实现简单,算法开销小,有利于长时间作业(进程) 缺点:不利于短时间作业(进程)
O'E i 口 E i CJEO'E 一有
日
炸进斛进尊尊转. 谢具本酣本聘本周本周本周 ybB* JH J- J J J * J
-繭-A空-B仆-C12T14-E18进 述月 一一 -一一 一一一 -一一rm
矍时程时程曰
鸟seR
调cfjf-S
T务先HRP转队 搭福燼勞課課課畧一
请 0(2(3(4(5(0请蔓一蚩_蚩_ 畫矍元一
匕r 呂 匕L O匕1-5呂5 一 E 耳 ayt ■耳- 一完「完弋完-2完-5完-3 丄gr-1-「-2.- 丁.」「"」「 间运SJ-运B1-运挖运加运推 !▼ J % ■- 1 - -二.? L; ? n~T 寸一 17 -专
HwvcnH■车
无2转穆【包周【周一 为周【周-权-权【权 怆f■权一T-^T'带T-带一厂带一 非运岸肖运10运11运14 ;在『在y在一在一在一4- 1廈器肚福需庇fflE 卜度 调
,程
短作业优先算法 SJF:
优点:有利于短作业或短进程
缺点:导致长作业或进程长时间不被调度,不能保证实时性,执行时间一般基于用户估算,准确性 不足高响应比算法HRF:
高响应比优先调度算法的优点:
对于等待时间相同的时候,服务时间愈短则优先权愈高,算法有利于短作业 ;
对于服务时间相同的时候,等待时间愈长其优先权愈高,算法实现的是先来先服务 ;
对于长作业,作业的优先级可以随等待时间的增加而提高,当其等待时间足够长时,其优先级便可 升到很高保证能获得处理机。缺点:每次调度前都要计算优先权,增加系统开销。
IB时B(0〕退 H 请输人 —t请选择其中一种调度算法;(1) "
IB
时
B
(0〕退 H 请输人 —t
请选择其中一种调度算法;
(1) " ⑵
(3) ⑷日
高响应比HRF
第昇跚 第课輪 时砺 第8个时间 时1$片 第11个日1 曲呷 第13个日
在时间片轮转算法中,时间片大小对系统性能有很大的影响,如选择很小的时间片将有利于短作 业,因为它能较快的完成,但会频繁的发生中断、进程上下文的切换,从而增加系统的开销;反 之,如选择较长的时间片,使得每个进程都能在一个时间片内完成,时间片轮转算法便退化为 FCFS算法,无法满足交互式用户的需求。
g转Timeslice 贵队列MRLA
时间片轮转算法 Timeslice:
C -/2011150568
时间片大小为込
需时wt用时间z还需时间z进程蹴绪 ,正在运行
需时间3使用时间N还需时间1.进程B就绪 Jffl正隹运行
MW; 嚨时间5』蓮用时间z还需时间3,进程C就绪 祕逑程嗾就正在运行……
一亠亠需时间生使用时间Z还需时间①进程牆束
__ 正在运行……
Wfro 时间2』使用时间N还需时间a进程D结束 碱卓程礙,正在运行…… 用完'一噜呷瘻髀字 还需时间Z进程E就绪 翼描乎離甯时间Z还需时间7进程B结束 定在运行……
畫时间3使用时间2,还需时间1.进程C就绪 墨时i呕 使用时间z还需时间a进程e结束 横耳 正在运存…… 篇體镯漏率鬱寸间1,使用时间占还需时间迸程C结束
多级反馈队列算法 MRLA :
匸-/2011150368
zhouj iancan?zhouj i ancan-PC V2011150368 $?/a|请选择基中二f申调虞算法:
(砸翻娜
⑸多紡 请输人一
扌轮转T-mesl ice 疋馈队列MRIA
h~掙縫屈壇募威 抢占式1时间片大小为2— 队列臧鱷A占蔵巴JEfefefc-.-:■1巾申
审£1比八匚…—…亠?”…, 诵的迸程C占用C也 正在坯行……
队歹骡
「0
队歹!
鷹品完己所需时i班負用时间z还需时间氐进程趟入队列蹴绪
「“占皤隸黒辐爲捅片1,返回队列尾部
PU,正在运彳亍
,所需时间4,使用时间占还需时间可进程B进入队列蹴绪
队歹! 队员
B 队列
队列
队歹!
队列
队列
队列
?A^cpuJlfer-;-:' L L _「二…]…. 用时间生时|可片使用完. 逻1B占用CPU,正注运〔二……
硬用完,所需时间2,傅用时间4,还需时间吆进程B结東
遴程D占用CPU,正在运花?一
僅用完,所需时咸,傳用时间N还需时间亿进程瞪入队列2就绪 进程C占用CPU,正在逾……时间*还需时间加程C进入队那就绪 傳篇烈鲁需时備闕諒啊还需时间3」进程D进入队列3就绪 间甘偉用丸 所需时间1,0时间務还需时间7进程A结束 电櫃程站朋?正在镒…" 亠J「
用时间Z还需时间11,进程C进入队列2就绪
,所需时间瓦使用时间1,还需时间1,进程A进入队列3就绪
忖旦片
3中
寸间
Si ■ _ _
由旬片使用芫'厮需月間点用时间&还需时间-1,进程C结束 ”3中曲进握D占用CPU,主右运卩 时间片使用完,所壷」* — . 一—「二—1 : 一-所有撐錨度唾牟
曲完上所需0?,?_
至眩瞬鬻孺闊需畝还需时间弋进程D结束
E -720111503^8
zhon j i anc an@ zhouj i an c an~PC /2$ ■畑法ce 算11A 匱丫esRL 调帀卩.K 申卩£ F T歹 T弟先HRF转队 时先业应宦腾艮r/Mk 1寸24511寸1寸2怡2寸1寸2_寸2寸3寸第寸3寸 选粢用)a序应日列疥日列日专列日列日列日列日列日列日列日 聘ICZlcgluKSKO请一队队队队队队队队队队队队备囂M第彎書亶暑書書一 <|'0]7囂農1鳖1豐理證嚅琶 5 u 冒pu间pu需pu需pu时pu需pu需pu需pu需pu需pu需pum 黑 ■ ■ ■ ■ 用犬罰仆用戶用F用戶用F.用戶用F用序匱 1A£=^?S>宀S间砧兄站宀S完站宀S宀一SS& ? …J程用程用程时程用程用程用程用程用程用趕醫 ■间间中间中:^^^中间中间中间-E-s^ <±7<L+JHJ2kt 21J1XJ21J2XJ- 31J 3XJ 31J 一n~n八
9 * ?
■ ■
八 r_T八 nn - -Hn 八 八 ftr 八 nn - An 八 nn 订B屢xax墨霽-征扌亚15^. JTH
:」Jnn - -- I u ■ — — — — — — — UPU需阡卩日IHEPtm日田P鲁日IBER詈日兽日鲁日書P甯 F=度那所那时取所班所班書班所那所班所那所班所那所 与禺 at. at.冃片 at. 异 at. ttt.斤 ttt. t±t r斗e;
多级反馈队列调度算法的性能:
终端型作业用户一般能在第一队列完成,响应时间短,满足用户交互型需求;
短批处理作业用户一般能在第二队列,至多第三队列可以完成,经历队列少,等待时间也少; 长批处理作业用户可能经过多个队列才能完成,但在每个队列都能够得到时间片的分配,不会出现 长时间不处理的情况。五、实验体会:(根据自己情况填写)
通过本次实验,基本了解计算机 CPU对执行进程时的运作模式,掌握了先来先服务算法、短作业优先算法、高响应比算法、时间片轮转算法、多级反馈队列算法这五种 CPU调度算法,掌握了这五种算法的的基本原理和运作机制,以及其算法实现。通过对这五种算法的模拟实验,对这五 种调度算法有了更进一步的理解。指导教师批阅意见:
完成了给定的所有调度算法,结果正确,过程完整,非常好。
成绩评定:
指导教师签字:
2013 年 6 月 1 日
备注:
相关热词搜索: 处理机 调度 实验 报告