操作系统课程设计报告abc.docx
- 文档编号:15680425
- 上传时间:2023-07-06
- 格式:DOCX
- 页数:31
- 大小:429.97KB
操作系统课程设计报告abc.docx
《操作系统课程设计报告abc.docx》由会员分享,可在线阅读,更多相关《操作系统课程设计报告abc.docx(31页珍藏版)》请在冰点文库上搜索。
操作系统课程设计报告abc
操作系统课程设计报告
进程调度模拟程序
院系:
信息工程学院
专业:
计算机科学与技术
班级:
计算机122班
姓名:
张贝贝
学号:
201210311042
指导教师:
刘晋
目录
一、课程题目概述1
1.1课程题目1
1.2设计要求1
三、总体设计2
3.1需求分析2
3.2课程设计使用的语言及开发工具2
3.3总体设计框架3
3.4系统结构图3
3.5功能模块分析3
3.5数据结构分析5
四、详细设计6
4.1界面设计6
4.2先来先到算法12
4.2.1算法思想12
4.2.2算法流程图12
4.2.3程序代码分析13
4.3动态优先级算法14
4.3.1算法思想14
4.3.2算法流程图15
4.3.3程序代码分析15
4.4时间片轮转算法17
4.4.1算法思想17
4.4.2算法流程图17
4.4.3程序代码分析18
4.4基础函数19
六、程序调试与运行结果说明21
七、遇到的问题及解决办法23
八、课程设计总结与体会24
参考文献25
一、课程题目概述
1.1课程题目
有限的时间内模拟实现操作系统内核及文件系统的进程调度
1.2设计要求
编写一个进程调度程序,模拟实现进程的创建、运行、阻塞、完成等进程控制,允许多个进程并行的进程调度程序。
(1)系统能够真实模拟多任务操作系统中进程生命周期中的相关活动,主要功能涉及进程管理和进程调度。
(2)进程状态:
每个进程的状态可以是就绪W(Wait)、运行R(Run)、阻塞B(Blocked)或完成F(Finish)四种状态之一[]。
(3)每个进程相关的数据结构有:
进程控制块(PCB)和进程生命周期数据。
进程控制块(PCB):
至少应该包含如下信息:
进程名、优先级、创建时间、需要运行时间、已使用CPU时间、进程状态、进程生命周期数
据、队列链表等等。
进程生命周期数据:
即CPU-I/O时间序列,它是进程调度、进入不同队
列的依据。
要求序列有一定长度,在进程创建时随机生成,作为进程PCB结构的一个数据项。
(4)系统管理的数据结构[]
♦系统PCB结构数组;
♦系统就绪队列、完成队列和阻塞队列;
♦系统参数:
时钟(可以调节速度,以利于观看系统运行)、时间片大小;
e.系统运行时的显示信息
时钟以时间片为单位计数,系统每次有进程发生状态改变时都给出改变进程的显著提示信息,系统在运行完每个时间片后都要显示所有队列和相关进程的状态(基本是FCB的值,格式如下仅供参考),以便掌握系统的运行情况。
(5)采用:
A.时间片轮转调度算法
B.先来先服务
C.动态优先级(优先级的计算自己决定,但一个进程的优先级要随时间改变,即UNIX的策略)调度算法。
三、总体设计
3.1需求分析
在多道程序环境下,主存中有着多个进程,其数目往往多于处理机数目,要使这多个进程能够并发地执行,这就要求系统能按某种算法,动态地把处理机分配给就绪队列中的一个进程,使之执行。
分配处理机的任务是由处理机调度程序完成的。
由于处理机是最重要的计算机资源,提高处理机的利用率及改善系统必(吞吐量、响应时间),在很大程度上取决于处理机调度性能的好坏,因而,处理机调度便成为操作系统设计的中心问题之一。
本次实验在vs2010环境下实现先来先服务调度算法,时间片轮转调度算法和高优先权调度算法。
3.2课程设计使用的语言及开发工具
语言:
C#
开发工具:
MicrosoftVisualStudio2010
3.3总体设计框架
♦用C#语言编程实现操作模拟操作系统进程调度子系统的基本功能;运用多种算法实现对进程的模拟调度。
♦通过编写程序实现进程或作业先来先服务、按时间片轮转、高优先权,进一步掌握进程调度的概念和算法,加深对处理机分配的理解。
♦用.net框架实现程序界面,嵌套在算法中共同实现。
3.4系统结构图
图1系统结构图
3.5功能模块分析
1.进程概念
进程是被独立分配资源的最小单位。
进程是动态概念,必须程序的运行才有进程的概念。
2.进程的状态模型:
(1)就绪状态:
当进程分配到除CPU以外的所有必要资源后,只要再获得CPU,便可立即执行。
(2)执行状态:
进程已获CPU,其程序正在执行。
(3)阻塞状态:
正在执行的进程由于发生某事件而暂时无法继续执行,便放弃处理机而处于暂停状态,即进程的执行受到阻塞。
3.处理机调度
在多道程序设计系统中,内存中有多道程序运行[],他们相互争夺处理机这一重要的资源。
处理机调度就是从就绪队列中,按照一定的算法选择一个进程并将处理机分配给它运行,以实现进程并发地执行。
4.进程调度算法的功能
记录系统中所有进程的执行情况、选择占有处理机的进程、进行进程的上下文切换。
5.进程调度的算法:
(1)先来先服务算法
如果早就绪的进程排在就绪队列的前面,迟就绪的进程排在就绪队列的后面,总是把当前处于就绪队列之首的那个进程调度到运行状态。
进入运行状态的进程在生命周期的一个CPU时间后进入阻塞排到队尾,由下一个进入内存最早的进程进入执行状态,以此类推。
(2)时间片轮转算法
固定时间片,系统将所有的就绪进程按先来先服务的原则排成一个队列,每次调度时,把CPU分配给队首进程,令其执行一个时间片,然后进入阻塞状态排在队尾,下一个队首进程进入CPU进入执行状态。
(3)动态优先级算法
为了照顾紧迫性作业,使之在进入系统后便获得优先处理,引入最高优先权优先。
系统将从后备队列中选择若干个优先权最高的作业装入内存。
动态优先权是指在创建进程时所赋予的优先权,是可以随进程的推进或其等待的时间的增加而改变的。
运行状态进程的优先权随时间自减,阻塞状态进程的优先权随时间自增,当阻塞态的优先权高于运行态的优先权时,进入运行状态,这样依次反复。
3.5数据结构分析
在本课程设计中我们设计了两个数据结构以代表每个进程的不同信息,分别是进程控制块PCB和进程生命周期life。
关于两个数据结构的全局变量描述如下。
1.进程控制块PCB
表1进程控制块PCB变量
数据结构变量名称
变量含义
pcname
进程名称,由用户自己决定用以标识不同进程
intotime
进程进入内存时间,由用户自己决定,表示进程进入内存的时间
requiretime
进程完成所需时间,由用户自己决定,表示完成某一进城所需要的时间
grade
进程优先级,有用户自己决定,用以表示进程的优先关系
yiyong
进程已用时间,表示进程从执行开始已用的时间
wancheng
进程完成时间,表示进程完成的时间
2.生命周期life
表2生命周期life数据结构变量
数据结构变量名称
变量含义
Life[]
表示生命周期的数组,数组长度由life[0]决定,life[0]随机生成
CPUtime
进程的CPU已用时间
IOtime
进程的IO已用时间
四、详细设计
4.1界面设计
本次课程设计我们使用的是c#语言,c#语言具有界面设计非常简洁便于修改的特点,在此次界面设计中我们使用了从c#本身的控件从而实现简洁完整界面设计。
1.设置页面整体属性
publicForm1()
{
InitializeComponent();
tbxgrade.Enabled=false;
btcreater.Enabled=false;
btstop.Enabled=false;
btstart.Enabled=false;
this.Size=newSize(811,637);
}
图2系统主界面
2.系统设置
图3系统设计界面
选择调度算法和进程数中使用ComoboBox控件的下拉框属性,分别选择算法和进程数,用privatevoidbtsure_Click(objectsender,EventArgse)实现控件按钮事件响应:
图4确定清空按钮
确定按钮和清空数据按钮使用Button控件的按钮属性,其中,清空数据按钮事件触发中使用。
privatevoidbtclear_Click(objectsender,EventArgse):
包括tbxname.Clear();
tbxinto.Clear();
dataGridView1.Rows.Clear();
dataGridView2.Rows.Clear();
currentTimeTextBox.Clear();
等,将主界面上所有数据清空。
2.创建进程
图5创建进程界面
进程名、进入内存时间、服务时间以及优先级使用TextBox控件,填入数据。
其中,如果选择了“动态优先权调度算法”,则通过
privatevoidcurrentTimeTextBox_TextChanged(objectsender,EventArgse)
触发“优先级”按钮,系统确认信息完整后,点击创建进程按钮。
3.进程观察区
图5进程观察区界面
if(maxreadypri<=maxblockpri)
{
dataGridView1[5,maxblockpro].Value="就绪";
}
创建的进程依次通过dataDridView控件显示在表格里。
进程创建完毕,通过MessageBox控件弹出窗体,点击确定开始进行模拟。
4.时钟界面设计
图6时钟
currentTimeTextBox.Text=time.ToString();
privatevoidcurrentTimeTextBox_TextChanged(objectsender,EventArgse)
privatevoidcurrentTimeTextBox_Click(objectsender,EventArgse)
5.执行进度条设计
图7执行进度条
用ProgressBar这个控件显示当前执行状态的进程的执行进度:
for(inta=0;a this.progressBar1.Value=this.progressBar1.Minimum; 进程刚进入执行状态时,进度条显示最小,即最左边; if(d==Convert.ToInt32(pcnum)) { timer1.Enabled=false; this.progressBar1.Value=this.progressBar1.Maximum; …… } 进程执行完,则进度条在最右边。 6.进程执行区设计 图8进程执行图界面 用DataGridView控件显示各个进程的运行情况 for(intb=0;b { if(dataGridView2.Rows.Count { dataGridView2.Rows.Add(); } dataGridView2[0,b].Value=dataGridView1[0,b].Value; } for(intb=0;b if(dataGridView1[5,b].Value.ToString()=="执行") { for(intv=0;v { if(dataGridView1[0,b].Value==dataGridView2[0,v].Value) { if(dataGridView2.ColumnCount<=time+1) dataGridView2.ColumnCount++; dataGridView2[time,v].Style.BackColor=System.Drawing.Color.Pink; dataGridView2.Columns[time+1].HeaderCell.Value=(time+1).ToString(); } } } 7.进程信息输入规范界面设计 (1)进入内存时间文本框变化事件 privatevoidtbxinto_TextChanged(objectsender,EventArgse) { try { if(tbxinto.Text! =""&&(Convert.ToInt32(tbxinto.Text.Trim())<0|| Convert.ToInt32(tbxinto.Text.Trim())>20)) { MessageBox.Show("请输入0至20之间的整数! "); tbxinto.Text=""; } } catch { MessageBox.Show("请输入0至20之间的整数! "); tbxinto.Text=""; } } (2)要求服务时间文本框变化事件 privatevoidtbxfinish_TextChanged(objectsender,EventArgse) { try { if(tbxfinish.Text! =""&&(Convert.ToInt32(tbxfinish.Text.Trim())<0|| Convert.ToInt32(tbxfinish.Text.Trim())>20)) { MessageBox.Show("请输入0至20之间的整数! "); tbxfinish.Text=""; } } catch { MessageBox.Show("请输入0至20之间的整数! "); tbxfinish.Text=""; } } (3)优先级文本框变化事件 privatevoidtbxgrade_TextChanged(objectsender,EventArgse) { try { if(tbxgrade.Text! =""&&(Convert.ToInt32(tbxgrade.Text.Trim())<0|| Convert.ToInt32(tbxgrade.Text.Trim())>20)) { MessageBox.Show("请输入0至20之间的整数! "); tbxgrade.Text=""; } } catch { MessageBox.Show("请输入0至20之间的整数! "); tbxgrade.Text=""; } (4)进程名文本框变化响应事件 privatevoidtbxname_TextChanged(objectsender,EventArgse) { if(tbxname.Text.Length>10) { MessageBox.Show("字符数超出限制,请输入1--10位字符! "); tbxname.Text=""; } for(inta=0;a { if(tbxname.Text==huan[a]&&tbxname.Text! ="") { MessageBox.Show("请确保进程名不重复! "); tbxname.Text=""; } } } 8.开始模拟按钮单击响应事件 privatevoidbtstart_Click(objectsender,EventArgse) { btstart.Enabled=false; btstop.Enabled=true; if(cmbdiaodu.Text=="时间片轮转调度算法") { timer2.Enabled=true; } else { timer1.Enabled=true; } time++; } 9.暂停按钮单击响应事件 privatevoidbtstop_Click(objectsender,EventArgse) { if(btstop.Text=="暂停") { timer1.Stop(); timer2.Stop(); btstop.Text="继续"; } else { timer1.Start(); timer2.Start(); btstop.Text="暂停"; } } 4.2先来先到算法 4.2.1算法思想 先来先服务调度算法的思想[]是按照进程进入就绪队列的先后顺序调度并分配处理机执行。 先来先服务调度算法是一种不可抢占的算法,先进入就绪队列的进程,先被处理机运行。 一旦一个进程占有了处理机,它就一直运行下去,直到该进程完成工作或者因为等待某事件而不能继续运行时才释放处理机。 4.2.2算法流程图 图9先来先到算法流程图 4.2.3程序代码分析 1.先来先服务的CPU调度 privatevoidFCFS(){ intd=0; for(intc=0;c { if(dataGridView1[5,c].Value.ToString()=="执行") d++; } if(d==0) { findnext(); } else { p[i].CPUtime--; if(p[i].CPUtime<=0){ if(p[i].lposition==p[i].life[0]) { dataGridView1[5,i].Value="完成"; p[i].wancheng=time; findnext(); } else { p[i].lposition++; dataGridView1[5,i].Value="阻塞"; p[i].IOtime=p[i].life[p[i].lposition]; ZS.Enqueue(p[i].pcname); findnext(); } } } } 2.先来先服务的IO调度 privatevoidFCFSIOdd() { for(intc=0;c { if(dataGridView1[5,c].Value.ToString()=="阻塞") { p[c].IOtime--; if(p[c].IOtime<=0) { if(p[c].lposition==p[c].life[0]) { dataGridView1[5,c].Value="完成"; p[c].wancheng=time; if(ZS.Count>0) { stringsuibian=Convert.ToString(ZS.Dequeue()); } } else { JX.Enqueue(p[c].pcname); dataGridView1[5,c].Value="就绪"; p[c].lposition++; intm=Convert.ToInt32(ZS.Dequeue());// } } 3.先来先服务的调度算法 在FCFSsf()方法中调用FCFS()方法和FCFSIOdd()方法。 privatevoidFCFSsf() { FCFS(); FCFSIOdd(); } 4.3动态优先级算法 4.3.1算法思想 进程的执行顺序由高优先级到低优先级,用户给进程指定一个优先级来表示该进程所享有的调度优先权。 优先级随其执行情况改变,执行一次,优先级-1,就绪状态下,优先级+1,阻塞状态下优先级不变。 该算法核心是确定进程的优先级。 4.3.2算法流程图 图10动态优先级算法流程图 4.3.3程序代码分析 1.改变算法优先级函数 voidchangegrade() { for(intc=0;c { if(dataGridView1[5,c].Value.ToString()=="就绪") p[c].grade=p[c].grade+1; if(dataGridView1[5,c].Value.ToString()=="执行") p[c].grade=p[c].grade-1; dataGridView1[3,c].Value=p[c].grade.ToString(); } } 2.设置指针GetMaxReady寻找就绪队列的下一个进程 publicvoidGetMaxReady() { maxreadypri=0; for(intc=0;c { if(dataGridView1[5,c].Value.ToString()=="就绪"&&Convert.ToInt32(dataGridView1[3,c].Value)>maxreadypri) { maxreadypri=Convert.ToInt32(dataGridView1[3,c].Value); maxreadypro=c; } } } 3.设置指针GetMaxBlock寻找阻塞队列的下一个进程 voidGetMaxBlock() { maxblockpri=0; for(intc=0;c { if(dataGridView1[5,c].Value.ToString()=="阻塞"&&Convert.ToInt32(dataGridView1[3,c].Value)>maxblockpri) { maxblockpri=Convert.ToInt32(dataGridView1[3,c].Value); maxblockpro=c; } } 4.定义DPSP方法,比较阻塞中的进程与就绪中的进程的优先级关系,选择优先级大的进入运行状态 voidDPSP() { Get
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 课程设计 报告 abc
![提示](https://static.bingdoc.com/images/bang_tan.gif)