实验二 模拟作业调度
班级 8班 学号 2012012033 姓名 张强
一、 实验目的
1) 加深对作业概念的理解。
2) 深入了解批处理系统如何组织作业、管理作业和调度作业。 3) 掌握采用银行家算法避免系统死锁的方法。
二、 算法思想 1. 数据结构
每个作业由作业控制块linklist表示,包含有如下信息:进程名、运行
状态、到达时间、服务时间、完成时间、周转时间、优先级、带权周转时间。
typedef struct Node
{ char name; /*定义进程名*/
int status; /*定义进程的运行状态*/ int arrive; /*到达时间*/ int server; /*服务时间*/ int end; /*完成时间*/ int zz; /*周转时间*/ int yxj; /*优先级*/ float dqzz; /*带权周转时间*/ struct Node * next; /*结构体指针*/ }Node,*linklist;
作业的状态有两种0:等待,1:完成。本次实验采用了单链表的形式存放后备队列中的作业,采用尾插法将输入的信息资源插入到单链表中。
第一个调度进程的完成时间(end)=到达时间+服务时间
以后进程的完成时间(end)=自己进程的到达时间+前者进程的服务时间 周转时间=完成时间-到达时间 平均周转时间=周转时间/服务时间
2. 调度算法
作业调度算法的关键是在已有的作业后备队列上按照一定的规则选择一
个作业,选择不同的调度算法来调度作业。
① 先来先服务算法
先来先服务算法(FCFS)是从后备作业队列中选择一个最先进入队列的作
业(即比较其到达时间),为之分配处理机,使之运行。
② 短作业优先算法
短作业优先(SJP)的调度算法是从后备队列中选择一个服务时间最短的进程,将处理机分配给它,使之运行。
③ 优先权算法
为了照顾紧迫型的作业,使之在进入系统够便获得优先处理,即使用最高优先权优先(FPF),在本次实验中,假定所有的进程都是在同一时刻到达,然后为各个进程制定优先级,根据不同的优先级为其分配处理机,使之运行。
三、 源程序
#include
typedef struct Node /*定义结构体类型*/
{ char name; int status; int arrive; int server; int end; int zz; int yxj; float dqzz;
struct Node * next; }Node,*linklist;
linklist initlist(void) /*单链表的初始化*/
{ linklist head;
head=(Node*)malloc(sizeof(Node)); head->next=NULL; return(head); }
void createformtail(linklist l) /*利用尾插法建立单链表*/
{ linklist s,r; char nam; int arr,ser; int f=1; r=l; while(f)
{ printf(\enter the process name:\
scanf(\ /*输入进程名,当输入‘*‘时结束输入*/ if(nam!='*')
{ s=(Node*)malloc(sizeof(Node)); s->name=nam;
printf(\enter the arrive time:\
scanf(\ s->arrive=arr;
printf(\enter the server time:\
scanf(\ getchar();
s->server=ser; s->status=0; r->next=s; r=s; } else { f=0;
r->next=NULL; } } }
void fcfs(linklist l) /*先来先服务算法*/ { linklist p,q; int f=0; p=l->next;
while(p!=NULL) { if(f==0)
{ p->end=p->arrive+p->server; f=1; q=p; } else
p->end=q->end+p->server; p->zz=p->end-p->arrive;
p->dqzz=(float)(p->zz)/(float)(p->server);
q=p;
p=p->next; }
p=l->next;
printf(\name arrivetime servertime endtime zztime dqzztime \\n\ while(p!=NULL)
{printf(\10f\\n\end,p->zz,p->dqzz); p=p->next; } }
void sjp(linklist l) /*短作业优先算法*/ { linklist p,q; linklist w,n,m; int x; int f=0,t=0; p=l->next;
while(p!=NULL) { if(f==0)
{ p->end=p->arrive+p->server; p->zz=p->end-p->arrive; p->dqzz=(float)(p->zz)/(float)(p->server);
p->status=1; f=1; p->status=1; q=p; } else { w=l->next; x=10;
while(w!=NULL) { if(w->server
x=n->server; }
w=w->next }
if(t==0)
{ n->end=q->end+n->server; t=1; } else
n->end=m->end+n->server; n->zz=n->end-n->arrive;
n->dqzz=(float)(n->zz)/(float)(n->server);
n->status=1; m=n; }
p=p->next; }
p=l->next;
printf(\name arrivetime servertime endtime zztime dqzztime \\n\ while(p!=NULL)
{printf(\
10f\\n\end,p->zz,p->dqzz); p=p->next; } }
void fpf(linklist l) { linklist p,q; linklist w,m,n; int x,y; int t=0; p=l->next;
printf(\you xian ji:\
while(p!=NULL)
{ printf(\ scanf(\ p->yxj=x; p=p->next; }
printf(\name servertime endtime yxj \\n\
p=l->next;
while(p!=NULL) { w=l->next; y=10;
while(w!=NULL)
{if(w->yxj
if(t==0)
{ n->end=n->server; t=1; } else
n->end=m->end+n->server; n->status=1; m=n;
printf(\d d =\\n\me,m->server,m->end,m->yxj); p=p->next; } }
void main() /*主函数*/ {
int c,i,t1,t2,t3; int x,y,z,f=1; linklist l; l=initlist();
createformtail(l); while(f)
{ printf(\enu~~~~~~~~~~~~~~~~~~\ printf(\ printf(\ printf(\ printf(\
printf(\please enter your select:\
scanf(\ switch(c) { case 1: fcfs(l); break; case 2: sjp(l); break; case 3: fpf(l); break; case 0: f=0; break; } } }??
四、 运行结果
编译好程序后运行程序:首先输入五个进程名及他们的到达时间和服务时
间:
输入1后,调用fcfs函数,即先来先服务的算法,出现如下运行图:
按回车后,会再次出现主菜单:输入2,调用sjp函数,即短作业优先服务的算法,出现如下运行图:
按回车后,会再次出现主菜单:输入3,调用sjp函数,即短作业优先服务