#include <stdio.h> #include <stdlib.h> #define MAX 5 //进程数
/*短作业优先算法*/ struct pro {
int num; //进程名 int arriveTime; //到达时间 int burst; //运行时间; struct pro *next; };
//函数声明
struct pro* creatList();
void insert(struct pro *head,struct pro *s); struct pro* searchByAT(struct pro *head,int AT); void run(struct pro *head); void del(struct pro* p);
int getCount(struct pro *head,int time);
struct pro* creatList() //创建链表,按照进程的到达时间排列 {
struct pro* head=(struct pro*)malloc(sizeof(struct pro)); head->next=NULL; struct pro* s; int i;
for(i=0;i<MAX;i++) {
s=(struct pro*)malloc(sizeof(struct pro)); printf("请输入进程名:\\n"); scanf("%d",&(s->num)); printf("请输入到达时间:\\n"); scanf("%d",&(s->arriveTime)); printf("请输入运行时间:\\n"); scanf("%d",&(s->burst)); s->next=NULL; insert(head,s);
}
return head; }
void insert(struct pro *head,struct pro *s) //插入节点 {
struct pro *p=searchByAT(head,s->arriveTime); s->next=p->next; p->next=s; return; }
struct pro* searchByAT(struct pro *head,int AT) //查找第一个到达时间大于等于AT的节点,返回其前一个指针 {
struct pro *p,*q; p=head; q=head->next;
while(q!=NULL&&q->arriveTime<=AT) { p=q; q=q->next; } return p; }
void del(struct pro* p) //删除p的下一个节点 {
struct pro *tmp; tmp=p->next; p->next=tmp->next; free(tmp); return; }
int getCount(struct pro *head,int time) //察看当前就绪队列中的进程数 {
int count=0; struct pro *p,*q; p=head; q=p->next;
while(q!=NULL&&q->arriveTime<=time) { count++;
p=q; q=q->next; }
return count; }
struct pro* SJF(struct pro *head,int count) //在头节点后的count个节点中选择burst最小的,返回其前一个节点的指针 { int min;
struct pro *p,*q,*flag; p=head; q=p->next; min=q->burst;
flag=p; //flag记录返回指针 while(count>0) {
if(q->burst<min) {
min=q->burst; flag=p; } count--; p=q; q=q->next; }
return flag; }
void run(struct pro *head) //按短作业优先算法调度进程,并输出其运行情况 {
int time=0,count; struct pro *s,*t;
while(head->next!=NULL) {
count=getCount(head,time);
if(count==0) //如果当前就绪队列中没有进程,时间自增 time++;
else if(count==1) //如果就绪队列中只有1个进程,则必定是第一个节点 { t=head; s=t->next;
printf("进程名:%d\\n",s->num); printf("到达时间:%d\\n",s->arriveTime);
printf("运行开始时间:%d\\n",time);
printf("响应时间:%d\\n",time-s->arriveTime); time+=s->burst;
printf("运行结束时间:%d\\n",time);
printf("周转时间:%d\\n",time-s->arriveTime); printf("*********************************\\n"); del(t
); }
else //如果就绪队列中的进程数>=2,则在head后的count个节点中进行短作业优先调度 {
t=SJF(head,count); s=t->next;
printf("进程名:%d\\n",s->num); printf("到达时间:%d\\n",s->arriveTime); printf("运行开始时间:%d\\n",time);
printf("响应时间:%d\\n",time-s->arriveTime); time+=s->burst;
printf("运行结束时间:%d\\n",time);
printf("周转时间:%d\\n",time-s->arriveTime); printf("*********************************\\n"); del(t); } } }
void main() {
struct pro *head=creatList();
printf("按短作业优先算法调度运行结果如下:\\n"); run(head);
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- yrrf.cn 版权所有 赣ICP备2024042794号-2
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务