CPU调度算法

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一、设计目的

通过CPU调度相关算法的实现,了解CPU调度的相关知识,通过实现CPU调度算法,理解CPU的管理,以及不同的CPU调度算法实现过程。体会算法的重要性。

二、设计要求

1、编写算法,实现FCFS、非抢占SJF、可抢占优先权调度

2、针对模拟进程,利用CPU调度算法进行调度

3、进行算法评估,计算平均周转时间和平均等待时间

4、调度所需的进程参数由输入产生(手工输入或者随机数产生)

5、输出调度结果

6、输出算法评价指标

三、设计说明

1、采用数组、指针

2、FCFS

先来先服务调度算法是一种最简单的调度算法,当作业调度中采用该算法时,每次调度都是从后备作业队列中选择一个最先进入该队列的作业

3、非抢占SJF

短作业优先调度算法,是指对短作业有限调度算法。是从后备队列中选择一个估计运行时间最短的作业将他们调入内存。

4、可抢占优先权调度

在这种方式下,系统把处理机分配给优先权最高的进程,使之执行。但在其执行期间,只要出现另一个其优先权更高的进程,进程调度程序就立即停止当前进程(原优先权最高的进程)的执行,重新将处理及分配给新到的优先权最高的进程。

四、程序流程图。

1、可抢占优先权调度算法

2、FCFS

3、非抢占SJF

五、程序部分

1、FCFS

#include

#include

typedef struct PCB

{

char name[10];

char state;

int arrivetime;

int starttime;

int finishtime;

int servicetime;

float turnaroundtime;

float weightedturnaroundtime;

struct PCB *next;

}pcb;

int time;

int n;

pcb *head=NULL,*p,*q;

void run_fcfs(pcb *p1)

{time=p1->arrivetime>time?p1->arrivetime:time;p1->starttime=time;

printf("\n现在时间是%d,开始运行作业%s\n",time,p1->name);

time+=p1->servicetime;

p1->state="T";

p1->finishtime=time;

p1->turnaroundtime=p1->finishtime-p1->arrivetime;

p1->weightedturnaroundtime=p1->turnaroundtime/p1->servicetime;

printf(" 到达时间开始时间服务时间完成时间周转时间带权周转时间\n ");

printf("%6d%10d%10d%8d%10.1f%10.2f\n",

p1->arrivetime,p1->starttime,p1->servicetime,p1->finishtime,p1->turnaroundtime,p1->weightedtu rnaroundtime);

}

void fcfs()

{int i,j;

p=head;

for(i=0;i

{if(p->state=='F')

{q=p;

run_fcfs(q);

}

p=p->next;}

}

void getInfo()

{int num;

printf("\n作业个数:");

scanf("%d",&n);

for(num=0;num

{p=(pcb*)malloc(sizeof(pcb));

printf("依次输入:进程名到达时间服务时间\n");

scanf("%s%d%d",&p->name,&p->arrivetime,&p->servicetime);

if(head==NULL)

{head=p;q=p;time=p->arrivetime;}

if(p->arrivetimearrivetime;

q->next=p;

p->starttime=0;

p->finishtime=0;

p->turnaroundtime=0;

p->weightedturnaroundtime=0;

p->next=NULL;

p->state='F';

q=p;}

}

void main()

{ system("graftabl 936");

printf("先来先服务算法模拟");

getInfo();

p=head;

fcfs();

getch();

}

2、非抢占SJF

#include

#include

#define MAX 100

struct jcb{

char name[10];

float arrivetime;

float starttime;

float finishtime;

float servicetime;

float zztime;

float avezztime;

};

struct jcb a[MAX];

void input(jcb *p,int N)

{ int i;

printf("请分别输入\n\t进程名到达时间服务时间\n\n");

for(i=0;i<=N-1;i++)

{printf("请输入第%d个进程信息:",i+1);

scanf("%s%f%f",&p[i].name,&p[i].arrivetime,&p[i].servicetime);

printf("\n");

}

}

void Print(jcb *p, float arrivetime,float servicetime,float starttime,float finishtime,float zztime,float avezztime,int N)

{int k;

printf("调度顺序:");

printf("%s",p[0].name);

for(k=1;k

{printf("-->%s",p[k].name);}

printf("\n\n");

printf("\t\t\t进程信息:\n");

printf("\nname\tarrive\tservice\tstart\tfinish\tzz\tavezz\n");

for(k=0;k<=N-1;k++)

{printf("%s\t%-.2f\t%-.2f\t%-.2f\t%-.2f\t%-.2f\t%-.2f\t\n",p[k].name,p[k].arrivetime,p[k].serviceti me,p[k].starttime,p[k].finishtime,p[k].zztime,p[k].avezztime);

}

}

void sort(jcb *p,int N)

{int i,j;

for(i=0;i<=N-1;i++)

for(j=0;j<=i;j++)

if(p[i].arrivetime

{jcb temp;

temp=p[i];

p[i]=p[j];

p[j]=temp;

}

}

void deal(jcb *p, float arrivetime,float servicetime,float starttime,float finishtime,float &zztime,float &avezztime,int N)

{int k;

for(k=0;k<=N-1;k++)

{if(k==0)

{p[k].starttime=p[k].arrivetime;

p[k].finishtime=p[k].arrivetime+p[k].servicetime;}

else

{p[k].starttime=p[k-1].finishtime;

p[k].finishtime=p[k-1].finishtime+p[k].servicetime;}

相关文档
最新文档