logo资料库

CPU调度算法.pdf

第1页 / 共11页
第2页 / 共11页
第3页 / 共11页
第4页 / 共11页
第5页 / 共11页
第6页 / 共11页
第7页 / 共11页
第8页 / 共11页
资料共11页,剩余部分请下载后查看
通过 CPU调度相关算法的实现,了解 CPU调度的相关知识,通过实现 CPU调度算法, 理解 CPU的管理,以及不同的 CPU调度算法实现过程。体会算法的重要性。 一、设计目的 二、设计要求 1、编写算法,实现 FCFS、非抢占 SJF、可抢占优先权调度 2、针对模拟进程,利用 CPU 调度算法进行调度 3、进行算法评估,计算平均周转时间和平均等待时间 4、调度所需的进程参数由输入产生(手工输入或者随机数产生) 5、输出调度结果 6、输出算法评价指标 三、设计说明 1、采用数组、指针 2、 FCFS 先来先服务调度算法是一种最简单的调度算法,当作业调度中采用该算法时,每 次调度都是从后备作业队列中选择一个最先进入该队列的作业 3、非抢占 SJF 短作业优先调度算法,是指对短作业有限调度算法。是从后备队列中选择一个估 计运行时间最短的作业将他们调入内存。 4、可抢占优先权调度 在这种方式下,系统把处理机分配给优先权最高的进程,使之执行。但在其执行 期间, 只要出现另一个其优先权更高的进程, 权最高的进程)的执行,重新将处理及分配给新到的优先权最高的进程。 进程调度程序就立即停止当前进程 (原优先 四、程序流程图 。 1、可抢占优先权调度算法 Y 开 始 当前作业为按编号找到第一 个还没有执行的作业 当 前 作 业 是 最 后一个作业 N 和下一个还没有执行的作业 比较 N Y 当前在上次作业 被执行之前到达 当前作业取较早到达且相应 比更高的一个 Y 同时到达 N 当前作业取响应比更高的一个 当前作业取较早到达的 一个 返回这一次要执行的作业
2 、 FCFS 3、非抢占 SJF 开 始 初始化进程 判断运行队 列是否为空 否 将等待队列中最早到的进 程放入运行队列 开 始 一次比较相邻两个进程的优先级 前者优先级是小于 还是等于后者 < 比较两个进程所需占用的 时间 = CPU 是 对运行队列中的进程时 间做减一 否 判断正在运行进程 所需时间是否为 0 是 将完成进程放入完成队列 前者 >后者? Y 交换位置 N 依次执行位于前面的进程 改变进程的相关数值的大小 判断等待队 列是否为空 是 结 束 否 Y 判断 Alltime 是 否为 0 结束 五、程序部分 1、 FCFS #include #include typedef struct PCB { char name[10]; char state; int arrivetime; int starttime; int finishtime; int servicetime; float turnaroundtime; float weightedturnaroundtime; struct PCB *next; }pcb; int time; int n; pcb *head=NULL,*p,*q;
void run_fcfs(pcb *p1) {time=p1->arrivetime>time?p1->arrivetime:time;p1->starttime=time; printf("\n 现在时间是 %d,开始运行作业 %s\n",time,p1->name); time+=p1->servicetime; p1->state="T"; p1->finishtime=time; p1->turnaroundtime=p1->finishtime-p1->arrivetime; p1->weightedturnaroundtime=p1->turnaroundtime/p1->servicetime; printf(" 到达时间 开始时间 服务时间 完成时间 周转时间 带权周转时间 \n "); printf("%6d%10d%10d%8d%10.1f%10.2f\n", p1->arrivetime,p1->starttime,p1->servicetime,p1->finishtime,p1->turnaroundtime,p1->weightedtu rnaroundtime); } void fcfs() {int i,j; p=head; for(i=0;istate=='F') {q=p; run_fcfs(q); } p=p->next;} } void getInfo() {int num; printf("\n 作业个数 :"); scanf("%d",&n); for(num=0;numname,&p->arrivetime,&p->servicetime); if(head==NULL) {head=p;q=p;time=p->arrivetime;} if(p->arrivetimearrivetime; q->next=p; p->starttime=0; p->finishtime=0; p->turnaroundtime=0; p->weightedturnaroundtime=0; p->next=NULL; p->state='F'; q=p;} } void main() { system("graftabl 936"); printf(" 先来先服务算法模拟 "); getInfo(); p=head; fcfs(); getch(); } 2、非抢占 SJF #include #include #define MAX 100 struct jcb{ char name[10];
float arrivetime; float starttime; float finishtime; float servicetime; float zztime; float avezztime; }; struct jcb a[MAX]; void input(jcb *p,int N) { int i; printf(" 请分别输入 \n\t 进程名 到达时间 服务时间 \n\n"); for(i=0;i<=N-1;i++) {printf(" 请输入第 %d 个进程信息 :",i+1); scanf("%s%f%f",&p[i].name,&p[i].arrivetime,&p[i].servicetime); printf("\n"); } } void Print(jcb zztime,float avezztime,int N) *p, float arrivetime,float servicetime,float starttime,float finishtime,float {int k; printf(" 调度顺序 :"); printf("%s",p[0].name); for(k=1;k%s",p[k].name);} printf("\n\n"); printf("\t\t\t 进程信息 :\n"); printf("\nname\tarrive\tservice\tstart\tfinish\tzz\tavezz\n"); for(k=0;k<=N-1;k++) {printf("%s\t%-.2f\t%-.2f\t%-.2f\t%-.2f\t%-.2f\t%-.2f\t\n",p[k].name,p[k].arrivetime,p[k].serviceti me,p[k].starttime,p[k].finishtime,p[k].zztime,p[k].avezztime); } } void sort(jcb *p,int N) {int i,j; for(i=0;i<=N-1;i++) for(j=0;j<=i;j++) if(p[i].arrivetime
} for(k=0;k<=N-1;k++) { p[k].zztime=p[k].finishtime-p[k].arrivetime; p[k].avezztime=p[k].zztime/p[k].servicetime; } } void jcbf(jcb *p,int N) { float arrivetime=0, servicetime=0, starttime=0, finishtime=0, zztime=0, avezztime=0; int m,n,next,k,i=0;float min; sort(p,N); for(m=0;mMAX){ printf("\t!! 输入的作业数目太大,请输入不大于 printf(" 按 Q 或者 q 退出程序 ,按其他任意键继续测试 ..."); ch=getch(); if(ch=='Q'||ch=='q'){ break; } else continue; } input(a,N); jcb *b=a; jcbf(b,N); printf(" 按 Q 或者 q 退出程序 ,按其他任意键继续测试 ..."); ch=getch(); if(ch=='Q'||ch=='q'){ %d 的整数 \n",MAX);
break; } } return 0; getch(); } 3、可抢占优先权调度算法 #include #include #include #include #include #include typedef char string[10]; struct task{ string name; int arrTime; int serTime; int waiTime; int begTime; int finTime; int turTime; int wTuTime; int priority; int finish; }JCB[10]; int num; void input() { int i; system("cls"); printf("\n 请输入作业数量 :"); scanf("%d",&num); for(i=0;i
{ current=i; break; } } for(j=i;jJCB[current].priority) current=j; } else { if(JCB[j].arrTimeJCB[current].priority) current=j; } } } return current; } void runing(int i,int times,int pre,int staTime,int endTime) { if(times=0) { JCB[i].begTime=JCB[i].arrTime; JCB[i].finTime=JCB[i].begTime+JCB[i].serTime; JCB[i].turTime=JCB[i].serTime; JCB[i].wTuTime=1.0; staTime=JCB[i].begTime; } else { if(JCB[i].arrTime>JCB[pre].finTime) JCB[i].begTime=JCB[i].arrTime; else JCB[i].begTime=JCB[pre].finTime; JCB[i].finTime=JCB[i].begTime+JCB[i].serTime; JCB[i].turTime=JCB[i].finTime-JCB[i].arrTime; JCB[i].wTuTime=JCB[i].turTime/JCB[i].serTime; } if(times==num-1) endTime=JCB[i].finTime; JCB[i].finish=1; } void print(int i,int times) { if(times==0) { printf(" 名称 到达时间 服务时间 开始时间 完成时间 周转时间 带权周转时间 \n"); }
printf("%3s%9d%9d%9d%9d%9d%9d\n",JCB[i].name,JCB[i].arrTime,JCB[i].serTime,JCB[i].be gTime,JCB[i].finTime,JCB[i].turTime,JCB[i].wTuTime); check() } void { int i; int staTime,endTime,sumTurTime=0.0,sumWTuTime=0.0,aveturTime,aveWTuTime; int current=0,times=0,pre=0; JCB[pre].finTime=0; for(i=0;i%9d%9d%9d%9d\n",NULL,sumTurTime,aveturTime,aveWTuTime); printf("-------------------------------------------------------\n"); } void main() { char again; system("graftabl 936"); do{ system("cls"); printf(" 请输入 4 组数据 :"); input(); check(); printf("Continue...(Y/N) : "); do{ again=getch(); }while(again!='Y'&&again!='y'&&again!='N'&&again!='n'); }while(again=='Y'||again=='y'); getch(); }
分享到:
收藏