C语言版.docx

上传人:b****2 文档编号:2248608 上传时间:2022-10-28 格式:DOCX 页数:40 大小:579.02KB
下载 相关 举报
C语言版.docx_第1页
第1页 / 共40页
C语言版.docx_第2页
第2页 / 共40页
C语言版.docx_第3页
第3页 / 共40页
C语言版.docx_第4页
第4页 / 共40页
C语言版.docx_第5页
第5页 / 共40页
点击查看更多>>
下载资源
资源描述

C语言版.docx

《C语言版.docx》由会员分享,可在线阅读,更多相关《C语言版.docx(40页珍藏版)》请在冰豆网上搜索。

C语言版.docx

C语言版

目录

课题1进程调度算法的模拟

1.设计目的。

4

2.任务及要求。

4-6

3.算法及数据结构。

6-17

4.实验结果及分析。

17-20

课题2系统动态分配资源的模拟

1.设计目的。

21

2.任务及要求。

21-22

3.算法及数据结构。

23-31

4.实验结果及分析。

31-33

课题3编程序实现磁盘调度算法

1.设计目的。

34

2.任务及要求。

34-35

3.算法及数据结构。

35-41

4.实验结果及分析。

41-44

课题1进程调度算法的模拟

1.设计目的

通过这个课程设计,对进程的调度进行模拟。

加深学生对重要算法的理解,同时通过用C语言编程实现这些算法,或Windows,让学生更好地掌握操作系统中进程调度的原理及实现方法,提高综合运用各专业课知识的能力。

2.任务及要求

1.用语言来实现对n个进程采用不同调度算法的进程调度。

2.每个用来标识进程的进程控制块PCB用结构来描述,包括以下字段:

(1)进程优先数ID,其中0为闲逛进程,用户进程的标识数为1,2,3…。

(2)进程优先级Priority,闲逛进程(idle)的优先级为0,用户进程的优先级大于0,且随机产生,优先数越大,优先级越高。

(3)进程占用的CPU时间CPUtime,进程每运行一次,累计值等于4。

(4)进程总共需要运行时间Alltime,利用随机函数产生。

(5)进程状态,0:

就绪态;1:

运行态;2:

阻塞态。

(6)队列指针next,用来将多个进程控制块PCB链接为队列。

3.优先数改变的原则

(1)进程在就绪队列中每呆一个时间片,优先数增加1。

(2)进程每运行一个时间片,优先数减3。

4.在调度前,系统中拥有的进程数PCB_number由键盘输入,经初始化后,所有的进程控制块PCB链接成就绪队列。

 

3.算法及数据结构

算法的总体思想:

建立主函数,主函数分别调用四个算法函数进行对就绪队列进行存储。

进程的到达时间在这里设定为同时到达。

因为单个程序时,不存在调度顺序的问题,所以只考虑了多个进程同时在就绪队列中的情况

程序的结构图:

 

3.1数据结构:

typedefstructPCBNode

{

intID;

intPriority;

intCPUtime;

intAlltime;

intArrivetime;

intstate;

intcounter;

structPCBNode*next;

}PCB;//定义数据结构

PCB*run;

PCB*ready;

PCB*over;

PCB*head;

//定义指针方便使用

3.2所用到的算法:

3.2.1功能:

创建和显示进程状态

算法:

PCB*CreatPCB(intn)

{

inti;

PCB*p,*q;

head=(PCB*)malloc(sizeof(PCB));

head->next=NULL;

p=head;

for(i=1;i<=n;i++)

{

q=(PCB*)malloc(sizeof(PCB));

q->ID=i;

q->CPUtime=0;

q->Alltime=rand()%200;

q->Priority=rand()%10;

q->state=Ready;

q->Arrivetime=0;

p->next=q;

p=q;

q->next=NULL;

}

head->next->Priority=0;

returnhead;

}//创建pcb块

voidDisplay(PCB*head)

{

PCB*p;

p=head->next;

printf("IDArrivetimeCPUtime(已占用)AlltimePrioritystate\n");

while(p)

{

printf("%d",p->ID);

printf("%d",p->Arrivetime);

printf("%d",p->CPUtime);

printf("%d",p->Alltime);

printf("%d",p->Priority);

printf("%d\n",p->state);

p=p->next;

}

}//显示PCB块

3.2.2FCFS

功能:

根据进程到达的顺序进行调度,先到达的进程先执行。

在就绪队列中排的越靠前越先执行

算法:

voidFCFS(PCB*head,PCB*over)

{

PCB*p,*q;

intj=0;

intn=0,s=0;

doublem;

ready=head;

p=ready->next;

q=over;

while(p)

{

p->state=Running;

ready->next=p->next;

n=p->Alltime+n;

p->CPUtime=p->Alltime;

p->Alltime=0;

s=s+n;

p->next=NULL;

q->next=p;

p->state=Over;

q=q->next;

q->next=NULL;

p=head->next;

j++;

printf("第%d次执行算法后的就绪队列:

\n",j);

Display(head);

}

m=(double)s/j;

printf("完成顺寻为:

\n");

Display(over);

printf("\n");

printf("每个进程等待的平均时间为:

%lf\n",m);

printf("所有进程等待的总时间为:

%d",s);

}

3.2.3SJF

功能:

从就绪队列中选出剩余执行时间最短的就绪进程进行执行。

执行结束后继续从就绪队列中选出剩余执行时间最短的。

直到所有进程都被执行完。

算法:

voidSJF(PCB*head,PCB*over)//sjf算法

{

PCB*p,*q,*b,*o;//b用来记录该块的地址

ints;//记录块号

intm,n,h=0,d=0,j=0;

doublef;

p=head->next;

q=over;

o=head;

printf("完成顺寻为:

\n");

m=p->ID;

n=p->Alltime;

s=Min(head);

b=p->next;

printf("%d:

\n",s);

while(head->next)

{

while(s!

=p->ID)

{

o=p;

p=p->next;

}

d=p->Alltime+d;

p->CPUtime=p->Alltime;

p->Alltime=0;

h=d+h;

b=p;

q->next=b;

o->next=p->next;

p=head->next;

b->next=NULL;

o=head;

q=q->next;

s=Min(head);

j++;

printf("第%d次执行算法后的就绪队列:

\n",j);

Display(head);

}

f=(double)h/j;

printf("完成顺寻为:

\n");

Display(over);

printf("每个进程等待的平均时间为:

%lf\n",f);

printf("所有进程等待的总时间为:

%d",h);

}

3.2.4Prio

功能:

从就绪队列中选出优先级别最高的进程进行执行。

重复进行。

直到所有的所有的进程执行完毕。

算法:

voidPrio(PCB*head,PCB*over)

{

PCB*p,*q,*b,*o;//b用来记录该块的地址

ints;//记录块号

intm,n,h=0,d=0,j=0;

doublef;

p=head->next;

o=head;

q=over;

printf("当前拥有最大优先级的块号为:

\n");

m=p->ID;

n=p->Alltime;

s=Max(head);

b=p->next;

printf("%d:

\n",s);

while(head->next)

{

while(s!

=p->ID)

{

o=p;

p=p->next;

}

d=p->Alltime+d;

p->CPUtime=p->Alltime;

p->Alltime=0;

h=d+h;

b=p;

q->next=b;

o->next=p->next;

p=head->next;

b->next=NULL;

o=head;

q=q->next;

s=Max(head);

j++;

printf("第%d次执行算法后的就绪队列:

\n",j);

Display(head);

}

f=(double)h/j;

printf("完成顺寻为:

\n");

Display(over);

printf("每个进程等待的平均时间为%lf\n",f);

printf("所有进程等待的总时间为:

%d",h);

}

3.2.5RR

功能:

根据时间片的大小,对每个进程依次执行。

时间片用完之后进程进入阻塞的状态,重新得到时间片后接着执行。

直到完成。

算法:

voidRR(PCB*head,PCB*over,intt,intk)//时间片轮转法

{

//k用来记录剩余要执行的进程数目

PCB*p,*q,*r,*o,*tail;//o用来记录当前块的地址

intn=0,s=0,f;

doubleh;

f=k;

p=head->next;

while(p->next)

{

tail=p;

p=p->next;

}

printf("执行顺序为:

\n");

tail=p;

o=p;//前驱

tail->next=head->next;

p=head->next;

q=over;

while(k>0)

{

r=head->next;

if(p->Alltime>t)//该进程还未执行完成

{

p->Alltime=p->Alltime-t;

n=n+t;

s=s+n;

o=p;

printf("执行进程%d",p->ID);

printf("该进程的Alltime变为%d\n",p->Alltime);

p=p->next;

}

else//该进程可以完成了

{

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科 > 法律资料

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1