操作系统实验报告-王宇辰 -作业调度
操作系统实验 -作业调度
专业班级: 计算机1101班 姓 名: 王宇辰 学 号: 20 指导教师: 曾应员
一、实验目的:
(1)理解什么是作业:每个用户请求计算机的一个计算任务叫做一个作业。
(2)作业的执行有几个步骤:一个作业从开始执行到得出结果要经历若干步。
(3)什么是作业控制方式:用户向系统提出作业加工的方式称作业控制方式。
(4)作业控制方式有那几种:终端控制方式(又称直接控制方式或联机控制方式)和批处理控制方式(又称自动控制方式或脱机控制方式)。
(5)作业调度的作用:通过模拟作业调度的实现,了解作业调度在操作系统中的作用。
二、实验内容:
(1):设计一个小系统(能够通过小系统中作业的调度了解多道操作系统中作业执行)。
(2):通过小系统的模拟,分析多道系统的作业执行。
(3):提出系统中作业的调度的改进措施,以提高作业的执行效率,提高多道操作系统的处理能力。
三、流程图如下:
四、源程序如下:
#include "stdio.h"
#include "stdlib.h"
#include "time.h"
#define Max 100 //最大作业数
#define MEMLENGTH 180
#define RECORDERNUM 16
typedef struct JCB //作业控制块
{
int UserID; //用户名
int JobID; //作业名
char status; //状态
float RunTime; //运行时间
int ApplyMem; //申请主存大小
int ApplyRecorder;//申请磁带数
struct JCB * next;
}JCB;
void JTinit(JCB * p)//构造一个空的
{
}
void JTinsert(JCB * jt,JCB * j) //插入
{
JCB * p;
for(p=jt;p->next!=NULL;p=p->next);
p->next=j;
j->next=NULL;
}
int JTdel(JCB * jt,JCB * j) //删除
{
JCB * p;
if(j==NULL)return 0;
p=jt->next;
if(p==NULL)return 0;
for(;p->next!=NULL&&p->next!=j;p=p->next);
if(p->next==NULL)return 0;
p->next=j->next;
return 1;
}
JCB * JTfind(JCB * jcb,char status) //查找
{ p->next=(JCB *)malloc(sizeof(JCB)); p->next->next=NULL; p->UserID=p->JobID=NULL;
JCB * p;
if(jcb==NULL) return NULL;//若作业控制块为空,返回NULL
for(p=jcb->next;p!=NULL&&p->status!=status;p=p->next);
return p;
}
void JTrelease(JCB * jt) //释放
{
JCB * p;
JCB * q;
p=jt->next;
if(p==NULL)return;
for(q=p->next;q!=NULL;p=q,q=q->next)
free(p);
}
JCB jt;
int memory=MEMLENGTH;
int recorder=RECORDERNUM;
int num,num1;
int m;
int e=0;
int runnum=0;
void stop(int n)//运行该函数大概需要n/100秒,用来模拟作业执行时间
{
int i=0,j,m;
for(;i
{
}
void run()
{
JCB * ep,* pd; void recover();//函数声明 if(num>0)//若作业表中有尚未选中的作业 { ep=JTfind(&jt,'s'); pd=ep; if(m==2) { while((pd=JTfind(pd,'s'))!=NULL) for(j=0;j
}
} } if(ep->RunTime>=pd->RunTime) ep=pd; while(num>0&&ep&&memory>=ep->ApplyMem&&recorder>=ep->ApplyRecorder) { num--; ep->status='e'; memory-=ep->ApplyMem; recorder-=ep->ApplyRecorder; e++; printf("选中第%d个占有处理机执行的作业:\n",e); printf("作业名:zy%d\t用户名:User%d\t运行时间:%1.2f秒printf("申请主存量:%dK\t申请磁带printf("剩余主存量:%dK\t剩余磁带数:%d\n\n",memory,recorder); \n",ep->JobID,ep->UserID,ep->RunTime); 数:%d\n",ep->ApplyMem,ep->ApplyRecorder); ep=JTfind(&jt,'s'); pd=ep; if(m==2) } { } if(ep==NULL) { } else if(recorderApplyRecorder) { } else if(memoryApplyMem) { } printf("**************主存量不足**************\n\n"); recover(); printf("**************磁带数不足**************\n\n"); recover(); printf("**************主存中已无收容态的作recover(); while((pd=JTfind(pd,'s'))!=NULL) if(ep->RunTime>=pd->RunTime) ep=pd; 业!**************\n\n");
void recover()
{
} JCB * ep,* pd; ep=JTfind(&jt,'e'); pd=ep; if(m==2) { } while(num1>0&&ep) { int time=int(100*ep->RunTime); runnum++; num1--; ep->status='f'; memory+=ep->ApplyMem; recorder+=ep->ApplyRecorder; printf("第%d个作业执行结束:\n",runnum); printf("作业名:zy%d\t用户名:User%d\t运行时间:%1.2f秒printf("申请主存量:%dK\t申请磁带数:%d\n",ep->ApplyMem,ep->ApplyRecorder); printf("剩余主存量:%dK\t剩余磁带数:%d\n\n\n",memory,recorder); ep=JTfind(&jt,'e'); pd=ep; if(m==2) { } if(num1>=0&&ep==NULL)printf("****************作业全部执行结束 else if(JTfind(&jt,'s')) { } } if(memory>=ep->ApplyMem&&recorder>=ep->ApplyRecorder) { } run(); while((pd=JTfind(pd,'e'))!=NULL) if(ep->RunTime>=pd->RunTime) ep=pd; while((pd=JTfind(pd,'e'))!=NULL) if(ep->RunTime>=pd->RunTime) ep=pd; stop(time); \n",ep->JobID,ep->UserID,ep->RunTime); ****************\n\n");
void init(int n)
{
} JCB *p; JTinit(&jt); //产生随机运行时间数组Tr[Max] int i=0,t[Max]; float tt[Max],Rt[Max]; srand((unsigned)time(NULL)); for(i=0;iUserID=p->JobID=k+1; p->status='s'; p->RunTime=Rt[k]; p->ApplyMem=Am[k]; p->ApplyRecorder=Ar[k]; JTinsert(&jt,p); Ar[r]=rand()*1l*rand()%5; while(Ar[r]==0) {Ar[r]=rand()*1l*rand()%5;} //初始化 Am[j]=rand()*1l*rand()%61; while(Am[j]
void main()
{
} printf("输入你要创建的作业数【 n
五、程序的使用:调试后好运行程序,出现如下界面,显示的是输入所需要的作业数:
这时我们可以输入任何小于100的数字。例如现在我们输入12,显示的是:请求选择算法,1、先来先服务法(FCFS ) ;2、最短作业优先法(SJF );
出现如下界面:
假如输入1 将输出如下:
假如输入2 将输出如下: