实验一、作业调度实验
专业:商软二班
姓名:颜文生
学号:201406114256
一、 实验目的
(1)加深对作业调度算法的理解;
(2)进行程序设计的训练。
二、 实验内容和要求
用高级语言编写一个或多个作业调度的模拟程序。
单道批处理系统的作业调度程序。作业一投入运行,它就占有计算机的一切资源直到作业完成为止,因此调度作业时不必考虑它所需要的资源是否得到满足,它所运行的时间等因素。
三、 实验方法、步骤及结果测试
先到先服务FCFS方法:
按照作业进入系统后背作业队列的先后次序来挑选作业,先进入系统的作业将优先被挑选进入内存,创建用户进程,分配所需资源,然后移入就绪队列。
根据到达时间排序代码如下:
void paixu_FCFS(int n){ //排序 int i,j; struct jcb temp; for(i=0;i<n;i++){ for(j=i+1;j<n;j++){ //按到达时间排序 if(job[i].arrtime>job[j].arrtime){ temp=job[i]; job[i]=job[j]; job[j]=temp; } } } }
实验结果截图:
删除作业事例结果如下:
最短作业优先SJF方法:算法以进入系统作业所要求的CPU运行时间的长短为标准,总是选取预计计算时间最短的作业投入运行
根据短作业优先排序代码如下:
此处需要注意第一个到达的作业不需要参与排序,因此需要找出第一个到达的作业。
void paixu_SPF(int n) { int i,j=0; struct jcb temp,min; min = job[0]; for(i=1;i<n;i++){ if(min.arrtime>job[i].arrtime){ min = job[i]; j=i; } } job[j]=job[0]; job[0]=min; for(i=1;i<n;i++){ for(j=i+1;j<n;j++){ //按短作业优先排序 if(job[i].reqtime>job[j].reqtime){ temp=job[i]; job[i]=job[j]; job[j]=temp; } } } }
实验结果截图:
完成以上各自作业调度算法显示开始时间,结束时间,周转时间等信息实现代码如下:
void showprocess(int n) { int sum_turnaroundtime=0; //总的周转时间 int i=0; double sum_Wturnaroundtime=0;//总的带权周转时间 job[0].startime = job[i].arrtime;//开始时间 job[0].finitime = job[i].arrtime + job[0].reqtime;//结束时间 job[0].turnaroundtime = job[0].finitime - job[0].startime; sum_turnaroundtime = job[0].turnaroundtime; sum_Wturnaroundtime = (double)job[0].turnaroundtime/job[0].reqtime; printf("--------------------------------------------------------------- "); printf("作业名 到达系统时间 cpu所需时间 开始时间 结束时间 周转时间 "); printf("%s %d %d %d %d %d ",job[0].name,job[0].arrtime,job[0].reqtime,job[0].startime,job[0].finitime,job[0].turnaroundtime); for(i=1;i<n;i++) { if(job[i-1].finitime>=job[i].arrtime) { job[i].startime = job[i-1].finitime; } else { job[i].startime = job[i].arrtime; } job[i].finitime = job[i].startime + job[i].reqtime; job[i].turnaroundtime = job[i].finitime - job[i].arrtime; printf("%s %d %d %d %d %d ",job[i].name,job[i].arrtime,job[i].reqtime,job[i].startime,job[i].finitime,job[i].turnaroundtime); sum_turnaroundtime += job[i].turnaroundtime; sum_Wturnaroundtime += (double)job[i].turnaroundtime/job[i].reqtime; } printf("平均周转时间为:%.2lf ",(double)sum_turnaroundtime/n); printf("平均带权周转时间为:%.2lf ",(double)sum_Wturnaroundtime/n); }
四、实验总结
1、什么是作业
作业是用户提交给操作系统计算的一个独立任务。每个作业必须经过若干相对独立且相互关联的顺序加工步骤才能得到结果,其中每个加工步骤称为一个作业步。
2、为了方便模拟调度过程,作业使用什么方式的数据结构存放和表示?
使用文件的形式存放作业名,运行时间,提交时刻等信息,在程序中通过读取文件获得信息
代码如下:
//读取文件 int ReadFile() { //int m=0; int i=0; FILE *fp; //定义文件指针 fp=fopen("E:\操作系统\3.txt","r"); //打开文件 if(fp==NULL) { printf("File open error ! "); exit(0); } //printf(" id 作业到达时间 作业运行所需要时间 "); while(!feof(fp)) { fscanf(fp,"%s%d%d",job[i].name,&job[i].arrtime,&job[i].reqtime); //fscanf()函数将数据读入 //printf(" %3d%12d%15d",jcb[i].id,jcb[i].arrivetime,jcb[i].requettime); //输出到屏幕 i++; }; if(fclose(fp)) //关闭文件 { printf("Can not close the file ! "); exit(0); } //m=i-1; return i; }
3、操作系统中,常用的作业调度算法有哪些?
(1)先来先服务调度算法(FCFS)
(2)短作业优先调度算法(SPF)
(3)最高响应比优先算法(HRN)
(4) 基于优先数调度算法(HPF)
(5)多级队列调度算法
4、只完成了FCFS和SPF两个作业调度算法,理解了这两种算法的调度机制。