CPU调度算法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、设计目的
通过CPU调度相关算法的实现,了解CPU调度的相关知识,通过实现CPU调度算法,理解CPU的管理,以及不同的CPU调度算法实现过程。体会算法的重要性。
二、设计要求
1、编写算法,实现FCFS、非抢占SJF、可抢占优先权调度
2、针对模拟进程,利用CPU调度算法进行调度
3、进行算法评估,计算平均周转时间和平均等待时间
4、调度所需的进程参数由输入产生(手工输入或者随机数产生)
5、输出调度结果
6、输出算法评价指标
三、设计说明
1、采用数组、指针
2、FCFS
先来先服务调度算法是一种最简单的调度算法,当作业调度中采用该算法时,每次调度都是从后备作业队列中选择一个最先进入该队列的作业
3、非抢占SJF
短作业优先调度算法,是指对短作业有限调度算法。是从后备队列中选择一个估计运行时间最短的作业将他们调入内存。
4、可抢占优先权调度
在这种方式下,系统把处理机分配给优先权最高的进程,使之执行。但在其执行期间,只要出现另一个其优先权更高的进程,进程调度程序就立即停止当前进程(原优先权最高的进程)的执行,重新将处理及分配给新到的优先权最高的进程。
四、程序流程图。
1、可抢占优先权调度算法
2、FCFS
3、非抢占SJF
五、程序部分
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;i {if(p->state=='F') {q=p; run_fcfs(q); } p=p->next;} } void getInfo() {int num; printf("\n作业个数:"); scanf("%d",&n); for(num=0;num {p=(pcb*)malloc(sizeof(pcb)); printf("依次输入:进程名到达时间服务时间\n"); scanf("%s%d%d",&p->name,&p->arrivetime,&p->servicetime); if(head==NULL) {head=p;q=p;time=p->arrivetime;} if(p->arrivetime 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 *p, float arrivetime,float servicetime,float starttime,float finishtime,float zztime,float avezztime,int N) {int k; printf("调度顺序:"); printf("%s",p[0].name); for(k=1;k {printf("-->%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 {jcb temp; temp=p[i]; p[i]=p[j]; p[j]=temp; } } void deal(jcb *p, float arrivetime,float servicetime,float starttime,float finishtime,float &zztime,float &avezztime,int N) {int k; for(k=0;k<=N-1;k++) {if(k==0) {p[k].starttime=p[k].arrivetime; p[k].finishtime=p[k].arrivetime+p[k].servicetime;} else {p[k].starttime=p[k-1].finishtime; p[k].finishtime=p[k-1].finishtime+p[k].servicetime;}