b) 采用最短作业优先(SJF)
思路:根据最短作业优先的原则,将就绪的进程根据作业的长短排成一个就绪队列,根据队列进行进程的调度。 源码:
#include
char name[10]; int readytime; int runtime; char state; struct jcb *next; };
typedef struct jcb JCB;
void insertJCB(JCB *head,JCB *jcb) {
JCB* p,*p1; if(head->next) { p=head->next->next; p1=head->next;
} else { p=head->next; p1=head;
}
while(p!=NULL&&(jcb->runtime>=p->runtime)) { p1=p; p=p->next;
}
jcb->next=p;
第6页 共11页
p1->next=jcb; }
void input(JCB *head) {
int num=0,i; JCB *jcb1;
cout<<\请输入作业的个数:\ cin>>num;
for(i=0;i void showRunning(JCB *p) { cout<<\正在运行的作业是:\ cout<<\名称 就绪时间 运行时间 状态\ cout< void showReady(JCB *p) { JCB* p1=p; cout<<\就绪作业是:\ while(p1) { jcb1=new JCB(); jcb1->readytime=i; cout<<\输入作业名称:\cin>>jcb1->name; cout<<\输入作业运行时间\cin>>jcb1->runtime; jcb1->state='w'; jcb1->next=NULL; insertJCB(head,jcb1); cout<<\名称 就绪时间 运行时间 状态\ 第7页 共11页 cout< void main() { JCB* head=new JCB(),*pready,*p; char c; int num=0; double circulateTime=0,averCTime=0,fTime=0,wTime,TotalCTime=0,TotalWCTime=0; head->next=NULL; input(head); pready=head->next; c=getchar(); while(pready) { p1=p1->next; c=getchar(); num++; p=pready; pready=p->next; p->next=NULL; p->state='r'; showRunning(p); fTime=fTime+p->runtime; circulateTime=fTime-p->readytime; wTime=circulateTime/p->runtime; TotalCTime+=circulateTime; TotalWCTime+=wTime; c=getchar(); showReady(pready); c=getchar(); cout<<\当前运行作业已完成,时间情况如下:\ 第8页 共11页 cout<<\就绪时间 完成时间 周转时间 带权周转时间\ cout< } cout<<\所有作业已经完成:\ if(num!=0) { cout<<\总周转时间平均值:\ cout< cout<<\总带权周转时间平均值:\ cout< } else { cout<<\总周转时间平均值:\ cout<<0< cout<<\总带权周转时间平均值:\ cout<<0< } 测试结果如下: 第9页 共11页 第10页 共11页 c) 采用响应比高者优先(HNR) 思路:根据就绪的时间进行排序,当运行一个进程后,对其后的进程计算响应比,并进行比较,重新对其按照响应比的大小由大到小进行排序。然后继续运行。 源码: 测试结果如下: 2、编写并调度一个多道程序系统的作业调度模拟程序。 作业调度算法:采用基于先来先服务的调度算法。可以参考课本中的方法进行设计。 对于多道程序系统,要假定系统中具有的各种资源及数量、调度作业时必须考虑到每个作业的资源要求。 第11页 共11页