CPU轮转算法设计报告佘远程.docx
- 文档编号:16739352
- 上传时间:2023-07-17
- 格式:DOCX
- 页数:17
- 大小:161.78KB
CPU轮转算法设计报告佘远程.docx
《CPU轮转算法设计报告佘远程.docx》由会员分享,可在线阅读,更多相关《CPU轮转算法设计报告佘远程.docx(17页珍藏版)》请在冰点文库上搜索。
CPU轮转算法设计报告佘远程
目录
一、需求分析1
1、设计要求:
1
2、解决方案:
1
二、概要设计2
1、结构说明:
2
2、数据结构及模块说明:
2
3、流程图:
3
三、详细设计:
3
1、主要函数设计与说明:
3
四、调试分析:
5
1、调试过程:
5
2、结果分析:
7
五、设计总结:
7
1、问题分析:
7
2、设计不足:
8
3、运行特点:
8
4、心得体会:
8
六、参考文献:
8
附录:
源代码9
计算机操作系统课程设计
——时间片轮转法进行CUP调度
一、需求分析
1、设计要求:
在多道程序或多任务系统中,系统同时处于就绪状态的进程有若干个。
为了使系统中各进程能有条不紊地进行,必须选择某种调度策略,以选择一进程占用处理机。
要求用时间片轮转算法模拟单处理机调度,以巩固和加深处理机调度的概念。
2、解决方案:
(1)、假设系统有5个进程,每个进程用一个进程控制块PCB来表示。
PCB包括:
进程名、链接指针、到达时间、估计运行时间和进程状态。
其中,进程名即进程标识。
链接指针指出下一个到达进程的进程控制块地址,按照进程到达的顺序排队,统设置一个队头和队尾指针分别指向第一个和最后一个进程,新生成的进程放队尾。
估计运行时间:
可由设计者任意指定一个时间值。
到达时间:
进程创建时的系统时间或由用户指定,调度时,总是选择到达时间最早的进程。
进程状态:
为简单起见,假定进程有两种状态,就绪和完成,并假定进程一创建就处于就绪状态,用R表示,当一个进程运行结束时,就将其置成完成状态,用C表示。
(2)、为每个进程任意确定一个要求运行时间和到达时间。
(3)、按照进程到达的先后顺序排成一个循环队列。
再设一个队首指针指向第一个到达进程的首址。
(4)、执行处理机调度时,开始选择队首的第一个进程运行。
另外再设一个当前运行进程的指针,指向当前正运行进程。
(5)、由于本实验是模拟实验,所以对被选中进程并不实际启动运行,而只是执行:
a)、估计运行时间减1;
b)、输出当前运行进程的名字。
用这两个操作来模拟进程的一次运行。
(6)、进程运行一次后,以后的调度则将当前指针依次下移一个位置,指向下一个进程,即调整当前运行指针指向该进程的链接指针所指进程,以指示应运行进程。
同时还应判断该进程的剩余运行时间是否为零。
若不为零,则等待下一轮的运行;若该进程的剩余运行时间为零,则将该进程的状态置为完成状态C,并退出循环队列。
(7)、若就绪队列不空,则重复上述(5)和(6)步骤直到所有进程都运行完为止。
(8)、在所有设计的调度程序中,应包含显示或打印语句,以便显示或打印每次选中进程的名称及运行一次后队列的变化情况。
二、概要设计
1、结构说明:
系统将所有的就绪进程按先来先服务的原则排成一个队列,每次调度时,把CPU分配给队首进程,并令其执行一个时间片。
时间片的大小从几MS到几百MS。
当执行的时间片用完时,由一个计时器发出时钟中断请求,调度程序便据此信号来停止该进程的执行,并将它送往就绪队列的末尾;然后再把处理机分配给就绪队列中的新的队首进程,同时也让他执行一个时间片。
这样就可以保证就绪队列中的所有进程在一给定的时间内均能获得一时间片的处理机执行时间。
换言之,系统能在给定时间内相应所有用户的请求。
2、数据结构及模块说明:
(1)、数据结构模块
主要是定义本设计中需要的两个主要的结构体PCB和node,从而定义进程控制块变量与队列指针。
(2)、函数模块
只要用于实现进程的插入,时间片的插入,轮转法的实现。
(3)、菜单界面块
主要用于提示使用者进入时间片轮转算法系统。
3、流程图:
三、详细设计:
1、主要函数设计与说明:
(1)、创建进程;使用单链表的方法,单链表中的每个结点相当于一个进程:
typedefstruct{
charname[20];//进程名
intarrtime;//到达时间
intruntime;//运行时间
}DataType;
typedefstructnode{
DataTypepcb;
structnode*next;
}ListNode;
(2)、自定义所需进程数目:
intf;cin>>f。
(3)、创建一个进程单链表,作为进程队列:
LinkListhead;
p=(ListNode*)malloc(sizeof(ListNode));
head=p;
p->next=NULL;
在进程数目之内,手动输入进程:
p=(ListNode*)malloc(sizeof(ListNode));
cin>>p->pcb.name;
cin>>p->pcb.arrtime;
cin>>p->pcb.worktime;
每输入一个进程都插进进程队列,并按arrtime从小到大排序。
(4)、自定义时间片大小,intT;cin>>T。
(5)、创建执行队列:
LinkListH;
ListNode*rear;
p=(ListNode*)malloc(sizeof(ListNode));
p=NULL;H=p;
并且定义一个参考变量f2!
=f。
(6)、定义时间轴,初始化时间轴和执行队列:
H=head->next;
head->next=head->next->next;
rear=H;
rear->next=NULL;
time=H->pcb.arrtime;
(7)、当f!
=0时,分配给执行队列队首一个时间片t。
(8)、当t!
=0时;t=t-1;time=time+1。
进程队列的队首进程是否到达,若到达,将其插到执行队列的队尾:
rear->next=head->next;
head->next=head->next->next;rear=rear->next;
rear->next=NULL。
执行队列不为空时,执行队列的队首进程的worktime=worktime-1,判断是否执行完。
执行完,f2=f2-1,该进程退出执行队列。
(9)、执行队列队首是否得到过一个完整的时间片,若有则该进程插入到执行队列的队尾:
q=H;H=H->next;rear->next=q;rear=rear->next;rear->next=NULL。
(10)、执行队列不为空时,转到第(7)步。
当执行队列和进程队列都为空时,转到第(6)步。
当两队列都为空时,所有进程运行完,模拟结束。
四、调试分析:
1、调试过程:
(1)、调试VC++6.0,执行程序:
(2)、输入时间片,进程数,各个进程名字,提交时间,执行时间:
(3)、运行结果:
2、结果分析:
五、设计总结:
1、问题分析:
问题:
(1)、程序编程语言不熟悉,代码的算法不熟悉导致编程遇到很多困难。
(2)、程序的算法结构没有事先分析完成,编程感到无从下手。
解决:
(1)、复习了一遍C++的编程语言和结构,多参考一些操作系统实例开发的编程代码。
(2)、开始做程序之前做好任务分配,这样每天做好自己的任务,既能熟悉学过的知识,也能更好的把握编程的结构。
2、设计不足:
(1)、算法结构尚可以优化。
(2)、没有形成相对友好的显示界面。
(3)、程序相对简单,整体的工程量不是很大。
3、运行特点:
(1)、界面简洁、清晰。
(2)、操作方便、快捷。
(3)、运算准确率高,可用性强。
(4)、含有个性化的操作(变色),程序相对美观大方。
4、心得体会:
本次课程设计让我深入了解了时间片轮转调度算法的具体功能实现,时间片轮转调度算法是最简单,最公平且使用最广泛的算法。
每个进程被分配一个时间段,即它的时间片,也就是该进程允许运行的时间。
如果在时间片结束时进程还在运行,CPU将被释放并分配给另一个进程。
如果进程在时间片结束前阻塞或结束,则CPU立即进行切换。
调度程序所要做的就是维护一张就绪进程列表,当进程用完它的时间片后,它被移到队列的末尾。
流程简单易懂,操作实用简洁,确保了进程的高效执行。
但是处理不好依然对计算机CPU资源产生浪费,时间片设得太短会导致过多的进程切换,降低了CPU效率;而设得太长又可能引起对短的交互请求的响应变差。
但是作为初期了解计算机CPU进程调度系统而言,时间片轮转算法具有很重大的意义和指导方向。
编程过程不是很复杂,但还是遇到了很多的困难。
主要是编程语言不熟悉和程序算法不熟悉导致的,这次课程设计帮助我复习了过往的很多知识,是一次很有意义的实践课。
与此同时,本次课程设计,在与同学们的积极讨论中,也掌握了一些自己平时没有掌握牢靠的知识点,相信经过了这一次的课程设计,我们捡起了平时疏忽的知识点,对期末考试也增加了底气。
六、参考文献:
[1]、汤小丹.《计算机操作系统》(第三版).西安电子科技大学出版社。
[2]、张丽芬.《操作系统实验教程》清华大学出版社。
[3]、谭浩强.《C++程序设计》清华大学出版社。
附录:
源代码
#include
#include
#include
charX;
intstart;
typedefstruct{
charname[20];//进程名
intarrtime;//到达时间
intruntime;//运行时间
}DataType;
typedefstructnode{
DataTypepcb;
structnode*next;
}ListNode;
typedefListNode*LinkList;
LinkListhead;
voidcreate_insert_LinkList(intf1)//创建进程队列
{
ListNode*p,*p1,*p2;
p=(ListNode*)malloc(sizeof(ListNode));
head=p;
p->next=NULL;
while(f1>0)
{
p=(ListNode*)malloc(sizeof(ListNode));//新建结点
cout<<"进程名:
";
cin>>p->pcb.name;
cout<<"到达时间:
";
cin>>p->pcb.arrtime;
cout<<"运行时间:
";
cin>>p->pcb.runtime;
cout<<"****************"< p->next=NULL; p1=head; p2=p1->next; while(p2! =NULL&&p2->pcb.arrtime { p1=p2; p2=p2->next; } p1->next=p; p->next=p2; f1=f1-1; } } //进行CPU调度 voidpcb_LinkList(intf2) { LinkListH; ListNode*rear,*p,*q; intT,t,time,m,n; p=(ListNode*)malloc(sizeof(ListNode)); p=NULL; H=p;//创建执行队列 cout<<"定义时间片大小: "; cin>>T; cout<<"**********************"< t=T; H=head->next; head->next=head->next->next; rear=H; rear->next=NULL; time=H->pcb.arrtime; while(f2! =0) { n=0; while(t! =0) { t=t-1; time=time+1; if(head->next! =NULL) { if(head->next->pcb.arrtime<=time)//检测是否有新的进程到达 { if(H==NULL) { H=head->next; head->next=head->next->next; rear=H; rear->next=NULL; } else { rear->next=head->next; head->next=head->next->next; rear=rear->next; rear->next=NULL; } } } if(H! =NULL) { H->pcb.runtime=H->pcb.runtime-1; m=1;//该进程有被执行 n=n+1;//该进程(队首)在这时间片中所有时间 if(H->pcb.runtime==0)//该进程服务完,从执行队列中删除 { cout<<"在第"< cout<<"进程名"< C"<<"完成时间: "<
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- CPU 轮转 算法 设计 报告 远程