加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

进程调度 非抢占短作业优先算法(C语言)源代码

(2014-06-05 15:35:05)
标签:

it

#include
#include


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;
int n;//进程数
printf("请输入进程数:\n");
scanf("%d",&n);
for(i=0;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=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);
}
http://s6/mw690/003gv1Jvzy6Jr8UbZK585&690非抢占短作业优先算法(C语言)源代码" TITLE="进程调度 非抢占短作业优先算法(C语言)源代码" />


0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有