操作系统.docx
- 文档编号:25888224
- 上传时间:2023-06-16
- 格式:DOCX
- 页数:22
- 大小:281.55KB
操作系统.docx
《操作系统.docx》由会员分享,可在线阅读,更多相关《操作系统.docx(22页珍藏版)》请在冰豆网上搜索。
操作系统
三系12软件本科专业
操作系统课程设计报告
时间片轮转法进行CPU调度
学院名称:
专业班级:
学生学号:
学生姓名:
指导教师姓名:
2014年12月
目录
一、设计目的1
二、设计原理1
三、设计内容2
四、算法实现3
五、流程图5
六、源程序6
七、运行示例及结果分析13
八、实验总结18
九、参考资料19
时间片轮转法进行CPU调度
一、设计目的
处理机调度是操作系统中非常重要的部分。
为深入理解进程管理部分的功能,设计时间片轮转法进行CPU调度算法,模拟实现处理机的调度。
通过本次课程设计理解进程调度的概念,深入理解进程控制的功能、进程的创建与删除以及进程各个状态之间的转换过程,实现时间片轮转算法调度进程。
本课程设计以Windows操作系统为实验平台,进行源代码分析和修改。
通过该课程设计,使学生学会使用C++语言编写和调试一个简单的时间片轮转法进行CPU调度的程序;加深了解有关进程控制块和进程队列的概念;并体会时间片轮转算法的具体实现方法;掌握Windows操作系统各部分结构、实现机理和各种典型算法;系统地了解操作系统的设计和实现思路,运用内核开发环境实现对内核的修改,培养学生的系统设计能力,并了解操作系统的发展动向和趋势。
二、设计原理
在早期的时间片轮转法中,系统将所有的就绪进程按先来先服务的原则排成一个队列,每次调度时,把CPU分配给队首进程,并令其执行一个时间片。
时间片的大小从几ms到几百ms。
当执行的时间片用完时,由一个计时器发出时钟中断请求,调度程序便据此信号来停止该进程的执行,并将它送往就绪队列的末尾;然后,再把处理机分配给就绪队列中新的队首进程,同时也让它执行一个时间片。
这样就可以保证就绪队列中的所有进程再一给定的时间内均能获得一时间片的处理机执行时间。
换言之,系统能再给定的时间内响应所有用户的请求。
三、设计内容
用时间片轮转算法模拟单处理机调度。
1、建立一个进程控制块PCB来代表。
PCB包括:
进程名、链接指针、到达时间、估计运行时间、剩余时间和进程状态。
进程状态分为就绪(R)和完成(C)。
2、为每个进程任意确定一个要求运行时间和到达时间。
3、按照进程到达的先后顺序排成一个循环队列。
再设一个对首指针指向第一个到达进程的首址。
4、执行处理机调度时,开始选择对首的第一个进程运行。
另外再设一个当前运行进程的指针,指向当前正运行的进程。
5、由于本实验是模拟实验,所以对被选中的进程不实际启动运行,而只是执行:
a)预计运行时间减1;
b)输出当前运行进程的名字。
6、进程运行一次后。
若该进程的剩余运行时间为零,则将该进程的状态置为完成态C,并退出循环队列;若不为空,则将其移至队尾,等待下一轮执行。
当前指针依次下移一个位置,指向下一个进程,并继续在运行队首的进程。
7、若就绪队列不空,则重复上述的(5)和(6)步骤直到所有进程都运行完为止。
8、在所设计的调度程序中,应包含显示或打印语句。
以便显示或打印每次选中进程的名称及运行一次后队列的变化情况。
四、算法实现
1、需求分析:
1)建立一个dataGridView1表代表进程。
dataGridView1包括:
进程名、到达时间、剩余运行时间、运行序号和进程状态。
2)建立五个进程,并对其按到达时间进行排序,使得运行序号成为一个由0开始从小到大的数。
3)开始对运行序号最小进程运行。
4)进程运行一次后。
若该进程的剩余运行时间为零,则将该进程的状态置为完成态C,并退出dataGridView1;若不为空,则将其序号加总进程数,等待下一轮执行。
继续在运行队首的进程。
5)需实现对进程进行插入
6)需实现对进程进行按到达时间排序
7)需实现对运行序号最小进程运行后使其剩余运行时间减去时间片时间
8)需判断进程运行后剩余时间。
若为0,退出;若不为0,运行序号变化,待下一轮执行,
9)需实现在dataGridView1不空时不断对运行序号最小进程运行
2、数据结构:
1)系统初始化时给每一个进程赋以一个cretime,并将所有进程按cretime从小到大的次序标序号no。
2)取序号最小进程,并投入运行。
3)采用相对固定时间片(设为1),进程每执行一次,进程运行时间sptime-1。
4)若进程没有运行完,将no加进程数,使no由最小变为最大,排到就绪进程的尾部,等待下一轮执行。
5)如果尚有进程在队列中,那么转入2)
Form2界面:
6)dataGridView1用于输入进程,各属性为进程名(name),到达时间(cretime),所需执行时间(sptime),执行序号(no),进程状态(static)。
7)inta获取总进程数。
Form1界面:
8)自定义结构tenor记录Form2中dataGridView1每一条进程信息,等待Form1的dataGridView1读取。
9)自定义结构aa,记录Form2中dataGridView1中所有进程最短到达时间,最长到达时间及总进程数。
10)intm表示进程执行的序号(no)
11)intk表示剩余进程总数
12)intpaixu判断是否进行初始排序
13)dataGridView1获取tenor中进程信息,显示在界面。
14)inttime获取进程到达时间(cretime),只用于进程初始排序
15)intpx用于判断是否等于到达时间(time),只用于进程初始排序
16)intxh所有进程初始排序序号(no),只用于进程初始排序
五、流程图
运行开始后添加进程,属性包含进程名,到达时间,剩余运行时间,运行序号。
在表中载入所添加进程的信息。
根据到达时间从小到大重新将运行序号排序。
单每没运行一次,只运行表中运行序号最小的进程,将其剩余运行时间减去时间片时间。
判断所运行进程剩余时间是否为0,若不是,就将该进程运行序号加上总进程数,是运行序号变为最大,等待下一轮执行;若是,删除该进程,并将总进程数减去1。
判断总进程数是否为0,若是,则结束运行;若不是,则继续单步执行所有进程中运行序号最小的进程。
图1
六、源程序
Form2:
添加进程界面
usingSystem;
usingSystem.Collections.Generic;
usingSystem.ComponentModel;
usingSystem.Data;
usingSystem.Drawing;
usingSystem.Linq;
usingSystem.Text;
usingSystem.Threading;
usingSystem.Windows.Forms;
usingSystem.Text.RegularExpressions;
namespaceWindowsFormsApplication1
{
publicpartialclassForm2:
Form
{
publicForm2()
{
InitializeComponent();
}
//退出界面
privatevoidbutton2_Click(objectsender,EventArgse){
this.Close();
}
//将进程信息保存在aa.mytenor[i]中
privatevoidbutton1_Click(objectsender,EventArgse)
{
inta=newint();
//获取进程数
a=Convert.ToInt32(dataGridView1.RowCount.ToString());aa.bb=a;
//进程及其属性不可为空
if(a==1){
MessageBox.Show("进程不可以为空!
");
return;
}
for(inti=0;i { for(intj=0;j<2;j++) { if((dataGridView1.Rows[i].Cells[j].Value)==null) { MessageBox.Show("进程属性不可以为空! "); return; } } } //判断输入进程到达时间,剩余时间格式 for(inti=0;i { for(intj=1;j<2;j++) { Regexr=newRegex("^\\d+$"); if(! r.IsMatch(dataGridView1.Rows[i].Cells[j].Value.ToString())) { MessageBox.Show("您输入的时间格式不正确! "); return; } } } //将输入进程的表中数据//保存在aa.mytenor[i]中 for(inti=0;i { aa.mytenor[i].name=dataGridView1.Rows[i].Cells[0].Value.ToString(); aa.mytenor[i].cretime=dataGridView1.Rows[i].Cells[1].Value.ToString(); if(aa.starttime>Convert.ToInt32(dataGridView1.Rows[i].Cells[1].Value)) { aa.starttime=Convert.ToInt32(dataGridView1.Rows[i].Cells[1].Value); } if(aa.endtime { aa.endtime=Convert.ToInt32(dataGridView1.Rows[i].Cells[1].Value); } aa.mytenor[i].sptime=dataGridView1.Rows[i].Cells[2].Value.ToString(); } MessageBox.Show("进程创建成功! "); } } } Form1: 运行进程界面 usingSystem; usingSystem.Collections.Generic; usingSystem.ComponentModel; usingSystem.Data; usingSystem.Drawing; usingSystem.Linq; usingSystem.Text; usingSystem.Threading; usingSystem.Windows.Forms; usingSystem.Text.RegularExpressions; namespaceWindowsFormsApplication1 { publicpartialclassForm1: Form { publicForm1() { InitializeComponent(); } intm=-1; intk=0; intpaixu=0; privatevoidbutton1_Click(objectsender,EventArgse) { if(aa.bb==1) { MessageBox.Show("请添加进程! "); return; } //将aa.mytenor[i]中信息载入表中 dataGridView1.Rows.Add(aa.bb); for(inti=0;i { dataGridView1.Rows[i].Cells[0].Value=aa.mytenor[i].name; dataGridView1.Rows[i].Cells[1].Value=aa.mytenor[i].cretime; dataGridView1.Rows[i].Cells[2].Value=aa.mytenor[i].sptime; dataGridView1.Rows[i].Cells[3].Value=i; dataGridView1.Rows[i].Cells[4].Value="R"; } aa.cc=1; k=aa.bb; button1.Enabled=false; } privatevoidbutton2_Click(objectsender,EventArgse) { if(aa.cc==0) { MessageBox.Show("请载入数据! "); return; } if(paixu==0) { MessageBox.Show("请排序! "); return; } //进程数为0时,结束运行 if(aa.bb==1) { MessageBox.Show("所有进程运行完毕! "); button2.Enabled=false; aa.cc=0; return; } m=m+1; for(inti=0;i { //执行运行序号为m的进程 if(m==Convert.ToInt32(dataGridView1 .Rows[i].Cells[3].Value)) { //剩余运行时间减去时间片时间 dataGridView1.Rows[i].Cells[2].Value=Convert.ToInt32(dataGridView1.Rows[i].Cells[2].Value.ToString())-1; label1.Text="正在执行进程: "; textBox1.Text=dataGridView1.Rows[i].Cells[0].Value.ToString(); if(dataGridView1.Rows[i].Cells[2] .Value.ToString()=="0") { //剩余时间为0,状态设为C dataGridView1.Rows[i].Cells[4].Value="C"; }if(dataGridView1.Rows[i].Cells[2].Value.ToString()=="-1") { //删除进程 label1.Text="此进程执行完毕: ";dataGridView1.Rows.Remove(dataGridView1.Rows[i]);aa.bb=aa.bb-1; k=k-1; } //运行序号变大 else{ dataGridView1.Rows[i].Cells[3].Value=Convert.ToInt32(dataGridView1.Rows[i]. Cells[3].Value.ToString())+k-1; } } } } //进程按到达时间重新标运行序号 privatevoidbutton3_Click(objectsender,EventArgse) { if(aa.cc==0) { MessageBox.Show("请载入数据! "); return; } inttime=0; intxh=0; for(intpx=0;px { for(inti=0;i { time=Convert.ToInt32(dataGridView1.Rows[i].Cells[1].Value); if(time==px) { dataGridView1.Rows[i].Cells[3].Value=xh; xh=xh+1; } } } paixu=1; button3.Enabled=false; } //跳转到添加进程界面 privatevoidbutton4_Click(objectsender,EventArgse) { Form2restart=newForm2(); restart.Show(); button4.Enabled=false; } //退出运行 privatevoidbutton5_Click(objectsender,EventArgse) { Environment.Exit(0); } } publicclassaa//定义aa { publicstaticintbb=1; publicstaticintcc=0; publicstatictenor[]mytenor=newtenor[10]; publicstaticintstarttime=100; publicstaticintendtime=0; } publicstructtenor//定义tenor { publicstringname; publicstringcretime; publicstringsptime; publicstringlevel; } } 七、运行示例及结果分析 进入运行界面 图2 添加界面添加进程a,b,c 图3 进程加载到运行界面 图4 按到达时间排运行序号 图5 执行0号进程b,剩余时间由2变为1,执行序号由0变为3 图6 执行1号进程a,剩余时间由2变为1,执行序号由1变为4 图7 执行2号进程c,剩余时间由2变为1,执行序号由2变为5 图8 执行3号进程b,剩余时间由1变为0,执行序号由3变为6,状态由“R”变为“C” 图9 执行4号进程a,剩余时间由1变为0,执行序号由4变为7,状态由“R”变为“C” 图10 执行5号进程c,剩余时间由1变为0,执行序号由5变为8,状态由“R”变为“C” 图11 进程b执行完毕,删除进程 图12 进程a执行完毕,删除进程 图13 进程c执行完毕,删除进程。 所有进程运行完毕 图14 八、实验总结 首先,我们认为这次课程设计是对学习《操作系统》的一次综合考察,锻炼我们综合分析问题、解决问题的能力。 这次课程设计,我的收获颇丰。 课程设计之初我对时间片轮转法基本上没有什么深入的研究,只是通过课堂的讲解大致了解其思想。 经过这将近一周的学习后,我对时间片轮转算法的理解有了更进一步的提高,并通过自己设计程序,自己试验,自己调试对算法的内容更进一步的深刻认识。 在课程设计初期,我无从下手,老师让我们去互联网查阅资料。 在这期间,我不仅重新学习了时间片轮转算法的相关知识,还在网上找到一些别人书写的程序段,这对我了解程序大致框架起了很大的帮助。 等到自己真正编写程序时,又是困难重重。 很多以前所学的关于C#的知识被遗忘,我不得不又重新拾起书本学习,尽管如此,编写的程序还是错误百出,尤其体现在数据使用方面,因为不熟悉C#语言规则,参数经常不能调用。 而对于循环的嵌套使用也是稀里糊涂。 在编写的过程中曾经一度想放弃,但是看见其他同学积极思考,不怕困难的神情,又让我重新拥有了走下去的力量。 其次,我们感受了真诚的友谊。 在实验中,遇到的问题是多方面的,而且有那么一部分是以前学过的C问题,但是已经忘却或是以前没有真正的理解过。 但是你会发现就在你的身边,会有那么一批人热心的帮助你。 团队的协作和彼此心的交流让我们彼此丰厚起来,这也是我们成长中必不可失的重要部分。 然后,我认识到了自己的不足。 平心而论,以前真的没有认真的学习过,即使是在听课,可是后来却没有对学习中出现的问题而仔细分析过,得过且过。 专技能也不扎实,不能用代码实现脑中的想法,一些功能实现不出来。 就拿本次课程设计来说,时间片是固定为1,不可调整。 最后,回顾这次课程设计,虽然艰难,但是我仍然坚持到最后,对我来说收获最大的莫过于这份不怕艰难的精神。 这次的课程设计让我学会了自己走,相信这种经历会在以后的毕业设计甚至在以后的工作岗位上都会受益匪浅。 九、参考资料 [1].罗福强,白忠建,杨剑.VisualC#.NET程序设计教程(第2版).北京: 人民邮电出版社,2012 [2].王万森,孙卫真,温邵洁,霍其润,汪国安.计算机操作系统原理(第2版).北京: 高等教育出版社,2008
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统