计算机操作系统实验进程调度.doc_第1页
计算机操作系统实验进程调度.doc_第2页
计算机操作系统实验进程调度.doc_第3页
计算机操作系统实验进程调度.doc_第4页
计算机操作系统实验进程调度.doc_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

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

文档简介

操作系统实验报告-进程调度计科02-8 王长青05年4月17日计算机操作系统实验 进程调度一实验目的进程调度是处理机管理的核心内容。通过本实验可以加深理解有关进程控制块、进程队列的概念,并体会和了解优先数调度算法的具体实施办法。二程序功能本程序使用VC+编译调试,用于实现进程优先数调度的模拟。主要包含三个模块:1、主界面:用于显示进程调度的过程。2、数据录入模块:用于获取进程的初始值,其中有三种获取方式,手动输入方式、随即生成方式和从文件中读去数据的方式。当用户在主窗口中点击“开始”菜单项时即可打开数据录入对话框,用户通过这三种方式之一均可完成数据的录入。3、进程控制模块:主要实现创建新的进程,就绪队列的管理,完成队列的管理,进程的调度。三实验原理(1)本程序采用优先数调度算法对进程进行调度,每个进程可有三个状态,即:就绪状态,运行状态,完成状态。并假设初始状态为就绪状态。这三种状态的转换情况如右图:(2)为了便于处理,程序中的某进程运行时间以时间片为单位计算。各进程的优先数以及进程需运行的时间片数的初始值均由用户给定(通过数据录入模块完成)。(3)程序通过设置一个定时器来实现时间片的轮转,时间片的大小是1秒,在定时器消息的响应函数中从用户录入的数据中读取一个创建进程,将其加入到就绪队列中,然后进行调度和执行。在调度函数中,对于遇到优先数一致的情况,采用FIFO策略解决。(4)在优先数算法中,进程每执行一次,优先数减3,进程还需要运行的时间数减1。四详细设计(1)设计进程控制块PCB结构:struct PCBint pid;/进程号int pri;/进程优先数int time;/进程所需运行时间int status;/ 进程状态 0就绪,1 执行,-1完成;(2)将进程的各种操作封装在类CProMoni中,该类的定义如下:class CProMoni public:CProMoni();virtual CProMoni();void InsertRQ(PCB* p);/将p所指的进程插入到就绪队列中void InsertFQ(PCB* p);/将p所指的进程插入到完成队列中void ProSchedule();/进程调度函数void ProRun();/运行函数void Display(CDC* pDC);/以表格形式输出运行过程bool GetFinishFlag();bool OpenLogFile();/打开日志文件void CloseLogFile();/关闭日志文件bool WriteLogToFile();/向日志文件中写入数据private:PCB *m_pRunning;/指向当前运行的进程CPtrList m_readyList;/就绪队列CPtrList m_finishList; /完成队列bool m_finish;/完成标志CString m_LogFileName;/日志文件名CStdioFile m_LogFile;/日志文件public:int m_clock;/时钟序列;(3)主要成员函数的实现:void CProMoni:InsertRQ(PCB* p)/将p插入到就绪队列中POSITION pre,pos=m_readyList.GetHeadPosition();PCB *q;while(pos!=NULL)pre=pos;q=(PCB*)m_readyList.GetNext(pos);if(q-pri pri)m_readyList.InsertBefore(pre,p);return;if(pos=NULL)m_readyList.AddTail(p);void CProMoni:ProSchedule()/进程调度PCB *p;if(m_pRunning=NULL)if(m_readyList.IsEmpty()m_finish=true;return;elsep=(PCB*)m_readyList.RemoveHead();m_pRunning=p;m_pRunning-status=1;elseif(!m_readyList.IsEmpty()p=(PCB*)m_readyList.GetHead();/m_readyList将头节点与当前PCB的权值比较if(p-pri m_pRunning-pri )PCB *q=m_pRunning;m_pRunning=(PCB*)m_readyList.RemoveHead();m_pRunning-status=1;q-status=0;InsertRQ(q);void CProMoni:ProRun()/运行进程if(!m_finish)if(m_pRunning=NULL)AfxMessageBox(当前运行的进程不存在!);return;m_pRunning-pri-=3;m_pRunning-time-=1;if(m_pRunning-time time=0;PCB*p=m_pRunning;p-status=-1;InsertFQ(p);m_pRunning=NULL;(4)试图类的主要成员函数:PCB* CProcessView:CreatePCB()/创建PCBPCB* p=new PCB;p-pid=n+1;p-pri=m_prisn;p-time=m_timesn;p-status=0;n+;return p;#includepritimedlg.hvoid CProcessView:OnStart() CPriTimeDlg dlg;/定义数据录入对话框dlg.DoModal();if(dlg.m_ok)m_proTotal=dlg.m_proNum;for(int i=0;im_proTotal;i+)m_prisi=dlg.m_prisi;m_timesi=dlg.m_timesi;m_proMoni.OpenLogFile();/打开日志文件PCB* p=CreatePCB();/创建新进程m_proMoni.InsertRQ(p);/将新进程插入到就绪队列中m_proMoni.WriteLogToFile();/写日志文件m_proMoni.ProSchedule();/进程调度m_start=true;/设置开始标志Invalidate();/刷新视图m_killTimer=false;SetTimer(1,1000,NULL);/设置定时器void CProcessView:OnTimer(UINT nIDEvent) m_proMoni.m_clock+;m_proMoni.WriteLogToFile();/写日志m_proMoni.ProRun();/运行进程if(nm_proTotal)PCB *p=CreatePCB();/创建新进程m_proMoni.InsertRQ(p);m_proMoni.ProSchedule();Invalidate();if(m_proMoni.GetFinishFlag()/若已完成则删除定时器KillTimer(1);m_killTimer=true;AfxMessageBox(演示完毕);CScrollView:OnTimer(nIDEvent);五运行结果(1)数据录入界面:(2)进程调度过程的结果:六、实验总结通过本实验使我对进程的相关概念及进程的优先数调度算法有了更深的理解,使自己在程序设计及编制方面也有了一定的提高。但在实验的过程中也遇到了一些问题。起初,按照实验要求,从文件中读去实验数据,我首先就想到了使用MFC中的CFile这个文件类,但是当把读去的数据转换成整数时却变成了乱码,由于当时没有想出很好的解决办法,于是我就退而求其次,便通过对话框让用户输入实验所需的数据,后来在不断调试过程中,为了省去反复输入数据的麻烦,就又增加了随机生成数据的功能。不过最后想出了从文件中读去实验数据的办法,那就是先通过CStdioFile这个处理文本文件的类,从文件中先读去数据字符串,在从字符串中提取出实验数据。遇到的另一个问题是关于调度过程的显示,首先我是按照时间序列的增长,把每一对应时刻的调度情况通过一个表格的形式显示出来。但这只能反映某一时刻的情况。不能一次反映出整体的调度过程,于是我又在CProMoni类中增加了用于记录进程调度整体过程的三个链表。然后每次调度的时候就把相应的调度过程信息添加到这三个链表中,这样就可以通过读取这三个链表中的数据来反映出整个调度的情况。当然实验过程中遇到的不仅是这些问题,其他的就不一一列举拉。总之,尽管实验中碰到了很多问题,但经过不断的修改和完善最终完成了这次实验。当然,这个程序还不能算很完美,仍然存在一些小问题,比如

温馨提示

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

评论

0/150

提交评论