基于时间片轮转法调度算法模拟.docx
- 文档编号:4559569
- 上传时间:2022-12-06
- 格式:DOCX
- 页数:11
- 大小:105.42KB
基于时间片轮转法调度算法模拟.docx
《基于时间片轮转法调度算法模拟.docx》由会员分享,可在线阅读,更多相关《基于时间片轮转法调度算法模拟.docx(11页珍藏版)》请在冰豆网上搜索。
基于时间片轮转法调度算法模拟
操作系统课程设计报告
课程设计题目:
基于时间片轮转法调度算法模拟
姓名:
学号:
专业:
计算机科学与技术
班级:
指导教师:
小辉
2013年1月11日
一.课程设计目的与内容............................................................1
七.附录.........................................................................................................................................8
八.评分表.................................................................................................................................11
一.课程设计目的与内容
1.课程设计目的
(1)在单处理器情况下按时间片轮转算法实现处理器调度,输出运行动态变化过程。
(2)通过算法的实现加深了解处理器调度的工作。
2.课程设计内容
输入实现处理器调度的几个进程信息,任意确定一组“要求运行时间”,启动所设计的处理器调度程序,显示逐次被选中进程的进程名以及进程控制块的动态变化过程。
二、任务分析
时间片轮转的主要思想就是按顺序为每一个进程一次只分配一个时间片的时间。
算法要完成的功能就是将各个进程按照时间片轮转运行的动态过程显示出来。
时间片轮转算法的主要实现过程是首先为每一个进程创建一个进程控制块,定义数据结构,说明进程控制块所包含的内容,有进程名、进程所需运行时间、已运行时间和进程的状态以及指针的信息。
实现的过程即运用指针指向某一个进程,判断当前的进程是否是就绪状态“r”,如果是,则为该进程分配一个时间片,同时,已运行时间加一且要求运行的时间减一,如此循环执行,当某一个进程的所需要运行的时间减少至0时,则将该进程的状态设置为“e”。
然后,将指针指向下一个未运行完成的进程,重复判断,直至所有的进程都运行结束。
三、概要设计
(1)所用数据结构及符号说明
#include"stdio.h"
#include"conio.h"
#include"malloc.h"
#include"string.h"
#defineNULL0
typedefstructPCB{
charname[10];//进程名
structPCB*next;//链指针
intneed_time;//要求运行时间
intworked_time;//已运行时间
charcondition;//进程状态,只有“就绪”和“结束”两种状态
intflag;//进程结束标志
}PCB;
PCB*front,*rear;
intN;//N为进程数
(2)主程序的流程图:
Y
Y
N
Y
(3)程序说明:
处理器调度总是选择指针指示的进程运行。
由于本实验是模拟处理器调度的功能,所以,对被选中的进程并不实际的启动运行,而是执行:
已运行时间+1来模拟进程的一次运行,表示进程已经运行过一个单位的时间。
四、详细设计
(1)首先每一个进程用一个进程控制块PCB来代表。
进程控制块的格式为:
进程名
指针
要求运行时间
已运行时间
状态
其中,进程名——作为进程的标识,如Q1、Q2等。
指针——进程按顺序排成循环链队列,用指针指出下一个进程的进程控制块的首地址,最后一个进程的指针指出第一个进程的进程控制块首地址。
要求运行时间——假设进程需要运行的单位时间数。
已运行时间——假设进程已经运行的单位时间数,初始值为“0”。
状态——有两种状态,“就绪”和“结束”,初始状态都为“就绪”,用“r”表示。
当一个进程运行结束后,它的状态为“结束”,用“e”表示。
(2)每次运行所设计的处理器调度程序前,为每个进程任意确定它的“要求运行时间”。
(3)程序详细设计步骤:
a.首先建立PCB的数据结构,为了便于正确输出,加上了进程结束标志flag。
输入进程信息(包括进程名和要求运行的时间),并为每个进程创建一个PCB并初始化形成一个循环链队列,用函数creatPCB()来实现。
b.建立函数judge()用来判断进程全部运行结束标志,即当所有进程的状态变为’e’(即完成状态)后,循环结束,表示所有进程都已运行成功。
c.建立时间片轮转算法creatProcess()对进程进行轮转运行,首先指针s指向第一个进程PCB,即s=front,判断该进程的状态是否为’r’(就绪状态),即if(s->condition=='r'),若是则表示此进程尚未执行结束,则执行s->worked_time++且s->need_time--,if(s->need_time==0),则表示此进程已运行结束,将其状态置为结束,即s->condition='e',并根据状态位输出完成信息,且以后不会再运行此进程。
将指针指向下个进程,s=s->next,并判断所有进程是否已全部运行结束,没有则重复上面算法。
当所有进程的状态位都变成’e’表示所有进程运行完成,则循环结束。
d.建立主函数main(),输入进程数N,调用初始化循环链队列函数creatPCB()和时间片轮转算法creatProcess(N),每次选中进程的进程名以及运行一次后进程队列的变化,实现处理器的调度。
五、运行结果
六、实验总结
在完成时间片轮转算法的实现过程中,我们遇到了一些问题,比如怎样运用循环队列,如何设计结构体等等,也积极配合并思考进行解决。
整体来说,我们的算法虽然实现了体现进程动态运行变化的过程,但是相对而言比较简单。
实验中,我们小组不断讨论对算法进行优化,使得运行结果看起来更容易理解,也达到了处理机调度的功能。
做实验让我们对于时间片轮转的思想理解的更加透彻,巩固了理论知识的学习。
实验心得体会:
首先,我们认为这次课程设计是对学习《操作系统》的一次综合考察,锻炼我们综合分析问题、解决问题的能力。
初次得到课程设计的题目时,为程序本身的简单而窃喜过;实验过程中也出现了一些难题需要解决,为此去苦苦探索过。
课程设计期间,几乎有几天我们完全投入进去了,就像是在做一个相当重要的项目一样的感觉。
曾经跑过图书馆几次,只是为了一种新的想法得到实现,也曾多次登录网站浏览网页,为了弥补一些知识上的纰漏,为此曾洒下了真实的汗水。
当我们的想法得到实现,又学会了新的知识的时候,心中满是欣喜,或许这是实践出真知的真实验证,有付出就有回报的真实写照吧。
其次,我们感受了真诚的友谊。
在实验中,遇到的问题是多方面的,而且有那么一部分是以前学过的C问题,但是已经忘却或是以前没有真正的理解过。
但是你会发现就在你的身边,会有那么一批人在背后热心的帮助你,让你身处困境却感到无限希望。
这好像是人生的一种历程,风风雨雨中我们一起走过,然后为了一些坑坑洼洼彼此真诚的帮助过和无私的付出过。
团队的协作和彼此心的交流让我们彼此丰厚起来,这也是我们成长中必不可失的重要部分。
最后,我认识到了自己的不足。
平心而论,以前真的没有认真的学习过,即使是在听课,可是后来却没有对学习中出现的问题而仔细分析过。
得过且过,迷失了我前进的方向,而现在却又重新敞开了。
不论是以后的学习还是工作,我想这都是很重要的,我们需要不断进步的动力。
七、附录
实验源程序如下:
#include"stdio.h"
#include"conio.h"
#include"malloc.h"
#include"string.h"
#defineNULL0
typedefstructPCB{
charname[10];//进程名
structPCB*next;//链指针
intneed_time;//要求运行时间
intworked_time;//已运行时间
charcondition;//进程状态,只有“就绪”和“结束”两种状态
intflag;//进程结束标志
}PCB;
PCB*front,*rear;
intN;//N为进程数
voidcreatPCB(){//为每个进程创建一个PCB并初始化形成一个循环链队列
PCB*p,*l;
l=(PCB*)malloc(sizeof(PCB));
printf("Pleaseenterprocessnameandtime\n");
scanf("%s%d",l->name,&l->need_time);
l->condition='r';//进程初始状态为就绪
l->worked_time=0;
l->next=NULL;
l->flag=0;
front=l;
for(inti=1;i p=(PCB*)malloc(sizeof(PCB)); scanf("%s%d",p->name,&p->need_time); p->condition='r'; p->worked_time=0; p->flag=0; l->next=p; l=l->next; } rear=l;rear->next=front; } voidoutput(){//进程输出函数 printf("nameruntimeneedtimestate\n"); for(intj=1;j<=N;j++){printf("%-4s\t%-4d\t%-4d\t%-c\n",front->name,front->worked_time,front->need_time,front->condition); front=front->next; } printf("\n"); } intjudge(PCB*p){//判断所有进程运行结束 intflag=1; for(inti=0;i if(p->condition! ='e'){ flag=0; break;} p=p->next; } returnflag; } voidcreatProcess(intn){//时间片轮转算法 PCB*s,*p; inti,j,flag1=0; s=(PCB*)malloc(sizeof(PCB)); s=front; printf("\n--------------------------------------------\n"); output(); printf("Pressanykeytocontinue...\n\n"); getch();//按任意键继续 s=front; while(flag1! =1){ if(s->condition=='r'){ s->worked_time++; s->need_time--; if(s->need_time==0) s->condition='e'; output(); printf("Pressanykeytocontinue...\n\n"); getch(); } if(s->condition=='e'&&s->flag==0){ printf("进程%s已经运行完成! \n\n",s->name); s->flag=1; } s=s->next; flag1=judge(s); } printf("--------------------------------------------\n"); } voidmain(){ printf("Pleaseenterprocessnumber\n"); scanf("%d",&N);; creatPCB(); creatProcess(N); } 东华理工大学信息工程学院 课程设计评分表 学生姓名: 班级: 学号: 课程设计题目: 基于时间片轮转法调度算法模拟 项目内容 满分 实评 选 题 能结合所学课程知识、有一定的能力训练。 符合选题要求 (5人一题) 10 工作量适中,难易度合理 10 能 力 水 平 能熟练应用所学知识,有一定查阅文献及运用文献资料能力 10 理论依据充分,数据准确,公式推导正确 10 能应用计算机软件进行编程、资料搜集录入、加工、排版、制图等 10 能体现创造性思维,或有独特见解 10 成 果 质 量 总体设计正确、合理,各项技术指标符合要求。 10 说明书综述简练完整,概念清楚、立论正确、技术用语准确、结论严谨合理;分析处理科学、条理分明、语言流畅、结构严谨、版面清晰 10 设计说明书栏目齐全、合理,符号统一、编号齐全。 格式、绘图、表格、插图等规范准确,符合国家标准 10 有一定篇幅,字符数不少于5000 10 总分 100 指导教师评语: 指导教师签名: 年月日
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 时间 轮转 调度 算法 模拟
