C语言版.docx
- 文档编号:2248608
- 上传时间:2022-10-28
- 格式:DOCX
- 页数:40
- 大小:579.02KB
C语言版.docx
《C语言版.docx》由会员分享,可在线阅读,更多相关《C语言版.docx(40页珍藏版)》请在冰豆网上搜索。
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//该进程可以完成了
{
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言版