模拟进程调度功能的设计与实现操作系统课程设计(MFC版本)_第1页
模拟进程调度功能的设计与实现操作系统课程设计(MFC版本)_第2页
模拟进程调度功能的设计与实现操作系统课程设计(MFC版本)_第3页
模拟进程调度功能的设计与实现操作系统课程设计(MFC版本)_第4页
模拟进程调度功能的设计与实现操作系统课程设计(MFC版本)_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

本文格式为Word版,下载可任意编辑——模拟进程调度功能的设计与实现操作系统课程设计(MFC版本)

目录

1、设计目的意义2

1.1、目的意义21.2、实现目标22、设计方案3

2.1、软硬件环境32.2、开发工具32.3、思路33、程序功能模块设计4

3.1、总体模块43.2、部分模块43.3、详细功能描述64、程序总控流程图65、数据结构设计8

5.1、PCB结构85.2、进程状态结构85.3、控件结构96、程序代码结构97、程序主要代码解析108、测试数据及测试结果158.1、运行时部分界面15

8.2、数据测试记录179、设计过程中遇到的问题及解决方法1810、结论1810.1、系统实现状况18

10.2、系统特点1810.3、设计体会及收获1811、参考资料19

模拟进程调度功能的设计与实现

1、设计目的意义

1.1、目的意义

通过课程设计理解进程调度的概念,深入了解进程控制的功能、进程的创立、删除以

及进程各个状态间的转换过程;实现先来先服务、时间片轮转、最短作业优先、优先级调度算法对进程进行的调度过程;通过观测有关的队列结构的内容的动态变化过程深入体会各个调度算法的特点;从而能够更好的稳定从书本上学到的知识。编程过程中需要建立队列等结构进行各种操作,通过该次课程设计,我们更加从实用

的角度对《数据结构》课程内容进行更深入理解和更熟练的应用。

使用C++语言进行编程,通过对调度功能的编程实现,不但能有效训练我们对编程语

言的熟练使用,还能促进我们独立思考解决问题、以及独立查新获取知识的能力。1.2、实现目标

一个进程的生命期可以划分为一组状态,这些状态刻画了整个进程。系统根据PCB结

构中的状态值控制过程。在进程的生命期内,一个进程至少具有5种基本状态,它们是:初始态、执行状态、等待状态、就绪状态和终止状态。通过系统设计,实现进程相关数据结构的创立和查看功能;实现多种进程调度算法:先来先服务算法、优先级调度算法、时间片轮转法等;实现对执行进程的阻塞,对等待进程的唤醒等功能。进程的转换过程如下:

2、设计方案

2.1软硬件环境硬件设备:PC机

软件设备:WINDOWSXP、MicrosoftVisualC++6.02.2、开发工具

由于现在使用的操作系统大多数都是微软公司的产品,为了更好更贴近的模拟操作系

统中进程调度功能,我们选择使用C++语言,开发平台MicrosoftVisualC++6.0,借助MFC来完成应用Windows应用程序的开发。另外通过课余时间的学习,对Windows应用程序的开发过程也有一些了解,很想学以致用,做点使用的东西加深对学习过的知识的理解与吸收。2.3、思路

进程根据外界条件的不断变化引起状态的改变,可以利用系统时间片的大小、进程执

行时间、进入主存的时间、系统内存大小、以及调度算法的选择来作为条件对进程进行调度。通过在对话框中添加按钮、文本编辑框、列表等控件,并为控件关联相应的变量和消息函数,实现各个控件内部以及控件之间的协同工作,并使用定时器进行时间的设置,从而完成系统所要求的进程调度工作。Windows应用程序,操作系统,计算机硬件之间的相互关系如下:

3、程序功能模块设计(程序功能模块划分及层次等)

3.1、总体模块

3.2、部分模块

3.3、详细功能描述

根据需要设置系统内存的大小

选择不同的进度调度算法进行进程调度模拟设置进程的各种属性值创立进程

根据进程不同的状态放在不同的位置显示进程调度过程中的动态变化状况在某一时间点击按钮进行进程调度模拟

进程调度模拟过程中可以暂停调度过程,查看进程的状态变化过程通过双击状态列表中的某个进程可以查看进程的各属性值对执行进程、就绪进程进行强制“阻塞〞操作对等待进程进行强制“就绪〞操作

将没有执行完毕的进程进行强制“杀死〞操作

4、程序总控流程图

(见下页)

5、数据结构设计

5.2、进程状态结构

6、程序代码结构

程序主要函数如下,各函数通过关联相关变量进行消息传递CProgressExDlg::CProgressExDlg(CWnd*pParent/*=NULL*/)

:CDialog(CProgressExDlg::IDD,pParent)

构造函数,调用基类CProgressExDlg,并传递两个参数:一个CProgressExDlg类的IDD成员,一个是父窗口指针。

voidCProgressExDlg::DoDataExchange(CDataExchange*pDX)

主要用来完成对话框数据的交换和校验。voidCProgressExDlg::OnButPause()

用于暂停进程调度操作

voidCProgressExDlg::OnButStart()

用于启动进程调度

voidCProgressExDlg::OnButton1()

用于复位,清除各进程

voidCProgressExDlg::OnButton2()

用于创立进程

voidCProgressExDlg::OnButtonBlock()

用于使选定进程进入就绪状态

voidCProgressExDlg::OnButtonKill()

用于杀死选定进程

voidCProgressExDlg::OnButtonNotify()

用于阻塞选定进程

HBRUSHCProgressExDlg::OnCtlColor(CDC*pDC,CWnd*pWnd,UINTnCtlColor)

用于设置显示进程属性时的字体和颜色

voidCProgressExDlg::OnDblclkListReadypro()

用于双击就绪队列中的某个进程,进而显示其属性voidCProgressExDlg::OnDblclkListRunpro()

用于双击执行队列中的某个进程,进而显示其属性voidCProgressExDlg::OnDblclkListWaitpro()

用于双击等待队列中的某个进程,进而显示其属性BOOLCProgressExDlg::OnInitDialog()

初始化对话框

voidCProgressExDlg::OnPaint()

绘制对话框

voidCProgressExDlg::OnTimer(UINTnIDEvent)

处理各种调度算法

7、程序主要代码解析

由于代码较多,以下只列出了先来先服务算法和最短作业优先算法的代码。

if(nIDEvent==0)//为先来先服务调度算法

{

if(((((CListBox*)GetDlgItem(IDC_LIST_RUNPRO))-GetCount())==0)(ReadyVec.size()!=0))//假使没有进程运行,先择优先级最高的进入运行{

sort(ReadyVec.begin(),ReadyVec.end(),Compare);

((CListBox*)GetDlgItem(IDC_LIST_READYPRO))-ResetContent();for(inti=0;iReadyVec.size();i++){

CStringbuf;

buf.Format(%d%s,ReadyVec[i].PID,ReadyVec[i].PName);

((CListBox*)GetDlgItem(IDC_LIST_READYPRO))-InsertString(i,buf);}

ReadyVec[0].status=0;

RunVec.push_back(ReadyVec[0]);tempRunPcb=ReadyVec[0];

((CListBox*)GetDlgItem(IDC_LIST_READYPRO))-DeleteString(0);CStringbuf;

buf.Format(%d%s,ReadyVec[0].PID,ReadyVec[0].PName);((CListBox*)GetDlgItem(IDC_LIST_RUNPRO))-AddString(buf);}

elseif(((((CListBox*)GetDlgItem(IDC_LIST_RUNPRO))-GetCount())!=0)(ReadyVec.size()!=0)){

RunVec[0].WorkTime-=100;

if(RunVec[0].WorkTime=0){

((CListBox*)GetDlgItem(IDC_LIST_RUNPRO))-ResetContent();m_memSize+=ReadyVec[0].MemCount;runTime=0;

RunVec.clear();

vectorPCB::iteratorpos1=ReadyVec.begin();ReadyVec.erase(pos1);}}

elseif(((((CListBox*)GetDlgItem(IDC_LIST_RUNPRO))-GetCount())!=0)(ReadyVec.size()==0)){

RunVec[0].WorkTime-=100;

if(RunVec[0].WorkTime=0){

((CListBox*)GetDlgItem(IDC_LIST_RUNPRO))-ResetContent();m_memSize+=ReadyVec[0].MemCount;runTime=0;

RunVec.clear();

vectorPCB::iteratorpos1=ReadyVec.begin();ReadyVec.erase(pos1);}}

if((((CListBox*)GetDlgItem(IDC_LIST_WAITPRO))-GetCount())!=0){

if(WaitVec.size()!=0){

sort(WaitVec.begin(),WaitVec.end(),Compare);for(intj=0;jWaitVec.size();j++){

if(WaitVec[j].MemCount=m_memSize){

//删除掉可以进入就绪队列的优先权最高的进程m_memSize-=WaitVec[j].MemCount;WaitVec[j].status=1;

ReadyVec.push_back(WaitVec[j]);

vectorPCB::iteratorpos=WaitVec[j];WaitVec.erase(pos);

((CListBox*)GetDlgItem(IDC_LIST_WAITPRO))-DeleteString(j);CStringbuf;

buf.Format(%d%s,ReadyVec[j].PID,ReadyVec[j].PName);((CListBox

*)GetDlgItem(IDC_LIST_RUNPRO))-InsertString(ReadyVec.size(),buf);

}}

((CListBox*)GetDlgItem(IDC_LIST_WAITPRO))-ResetContent();for(j=0;jWaitVec.size();j++){

CStringbuf;

buf.Format(%d%s,WaitVec[j].PID,WaitVec[j].PName);

((CListBox*)GetDlgItem(IDC_LIST_WAITPRO))-InsertString(j,buf);}

}}

UpdateData(FALSE);}

elseif(nIDEvent==1)//最短作业优先算法{if((!ReadyVec.empty())((((CListBox*)GetDlgItem(IDC_LIST_RUNPRO))-GetCount())==0)){

std::stable_sort(ReadyVec.begin(),ReadyVec.end(),CompareByWkt);((CListBox*)GetDlgItem(IDC_LIST_READYPRO))-ResetContent();for(inti=0;iReadyVec.size();i++){

CStringbuf;

buf.Format(%d%s,ReadyVec[i].PID,ReadyVec[i].PName);

((CListBox*)GetDlgItem(IDC_LIST_READYPRO))-InsertString(i,buf);}

ReadyVec[0].status=0;

RunVec.push_back(ReadyVec[0]);ReadyVec[0].WorkTime-=100;

tempRunPcb=ReadyVec[0];CStringbuf;

((CListBox*)GetDlgItem(IDC_LIST_READYPRO))-GetText(0,buf);((CListBox*)GetDlgItem(IDC_LIST_READYPRO))-DeleteString(0);((CListBox*)GetDlgItem(IDC_LIST_RUNPRO))-AddString(buf);UpdateData(false);}

elseif(((((CListBox*)GetDlgItem(IDC_LIST_RUNPRO))-GetCount())!=0)(ReadyVec.size()!=0)){

ReadyVec[0].WorkTime-=100;

if(ReadyVec[0].WorkTime=0){

((CListBox*)GetDlgItem(IDC_LIST_RUNPRO))-ResetContent();UpdateData(false);

m_memSize+=ReadyVec[0].MemCount;runTime=0;

RunVec.clear();

vectorPCB::iteratorpos1=ReadyVec.begin();ReadyVec.erase(pos1);}

//操作阻塞队列

stable_sort(WaitVec.begin(),WaitVec.end(),CompareByWkt);if(WaitVec.size()!=0){

if(WaitVec[0].MemCount=m_memSize){

m_memSize-=WaitVec[0].MemCount;WaitVec[0].status=1;

ReadyVec.push_back(WaitVec[0]);vectorPCB::iteratorpos=WaitVec.begin();WaitVec.erase(pos);

if(ReadyVec.size()!=0){

((CListBox*)GetDlgItem(IDC_LIST_READYPRO))-ResetContent();for(inti=0;iReadyVec.size();i++){

CStringbuf;

buf.Format(%d%s,ReadyVec[i].PID,ReadyVec[i].PName);((CListBox*)GetDlgItem(IDC_LIST_READYPRO))-InsertString(i,buf);}

UpdateData(false);}

((CListBox*)GetDlgItem(IDC_LIST_WAITPRO))-ResetContent();for(inti=0;iWaitVec.size();i++){

CStringbuf;

buf.Format(%d%s,WaitVec[i].PID,WaitVec[i].PName);

((CListBox*)GetDlgItem(IDC_LIST_WAITPRO))-InsertString(i,buf);}

UpdateData(FALSE);}}}

elseif(((((CListBox*)GetDlgItem(IDC_LIST_RUNPRO))-GetCount())!=0)(ReadyVec.empty())){

ReadyVec[0].WorkTime-=100;

if(ReadyVec[0].WorkTime=0){

((CListBox*)GetDlgItem(IDC_LIST_RUNPRO))-ResetContent();UpdateData(FALSE);m_memSize+=ReadyVec[0].MemCount;runTime=0;

RunVec.clear();}}else{

UpdateData(FALSE);}}

8、测试数据及测试结果

8.1、运行时部分界面刚启动时

添加进程后:

先来先服务算法调度点击开始模拟后:

双击执行进程时:

点击阻塞时:

8.2、数据测试记录

9、设计过程中遇到的问题及解决方法

满足进程动态生成的需要,使用向量vector进行存放进程

向量vector中的内容不能直接使用下标删除,使用迭代器iterator并结合函数erase

使用。

使用组合框ComboBox时没有下拉滚动条,可以刚开始时把组合框画的大一点就可以。运行时同一个进程在不同的两个状态同时出现,在状态转换时删除列表框中的内容后

要更新一下。

进程运行完后对应的内存资源没有增加,在每次的进程运行终止或是从执行状态转换

到等待状态,都要释放资源。

编码过程中也出现了规律不够严密等错误,经过一一排查都把错误改正了。

10、结论

10.1、系统实现状况

课程设计任务书中所要求的功能我们都已经确凿无误的实现,测试中没有出现什么错

误。该系统实现了进程控制的功能、进程的创立、删除以及进程各个状态间的转换过程;实现了先来先服务、时间片轮转、最短作业优先、优先级调度算法对进程进行调度过程;系统界面上所有的功能部件说明的功能都已实现。10.2、系统特点

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论