收藏 分享(赏)

计算机操作系统实验---进程调度.doc

上传人:fcgy86390 文档编号:6988787 上传时间:2019-04-29 格式:DOC 页数:9 大小:111KB
下载 相关 举报
计算机操作系统实验---进程调度.doc_第1页
第1页 / 共9页
计算机操作系统实验---进程调度.doc_第2页
第2页 / 共9页
计算机操作系统实验---进程调度.doc_第3页
第3页 / 共9页
计算机操作系统实验---进程调度.doc_第4页
第4页 / 共9页
计算机操作系统实验---进程调度.doc_第5页
第5页 / 共9页
点击查看更多>>
资源描述

1、操作系统实验报告-进程调度计科 02-8 王长青05 年 4 月 17 日1计算机操作系统实验进程调度一实验目的进程调度是处理机管理的核心内容。通过本实验可以加深理解有关进程控制块、进程队列的概念,并体会和了解优先数调度算法的具体实施办法。二程序功能本程序使用 VC+编译调试,用于实现进程优先数调度的模拟。主要包含三个模块:1、主界面:用于显示进程调度的过程。2、数据录入模块:用于获取进程的初始值,其中有三种获取方式,手动输入方式、随即生成方式和从文件中读去数据的方式。当用户在主窗口中点击“开始”菜单项时即可打开数据录入对话框,用户通过这三种方式之一均可完成数据的录入。3、进程控制模块:主要实

2、现创建新的进程,就绪队列的管理,完成队列的管理,进程的调度。三实验原理(1)本程序采用优先数调度算法对进程进行调度,每个进程可有三个状态,即:就绪状态,运行状态,完成状态。并假设初始状态为就绪状态。这三种状态的转换情况如右图:(2)为了便于处理,程序中的某进程运行时间以时间片为单位计算。各进程的优先数以及进程需运行的时间片数的初始值均由用户给定(通过数据录入模块完成) 。(3)程序通过设置一个定时器来实现时间片的轮转,时间片的大小是 1 秒,在定时器消息的响应函数中从用户录入的数据中读取一个创建进程,将其加入到就绪队列中,然后进行调度和执行。在调度函数中,对于遇到优先数一致的情况,采用 FIF

3、O 策略解决。(4)在优先数算法中,进程每执行一次,优先数减 3,进程还需要运行的时间数减1。四详细设计(1)设计进程控制块 PCB 结构:struct PCB int pid; /进程号int pri; /进程优先数2int time; /进程所需运行时间int status; / 进程状态 0 就绪,1 执行,-1 完成;(2)将进程的各种操作封装在类 CProMoni 中,该类的定义如下:class CProMoni public:CProMoni();virtual CProMoni();void InsertRQ(PCB* p); /将 p 所指的进程插入到就绪队列中void Ins

4、ertFQ(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_f

5、inishList; /完成队列bool m_finish; /完成标志CString m_LogFileName; /日志文件名CStdioFile m_LogFile; /日志文件public:int m_clock; /时钟序列;(3)主要成员函数的实现:void CProMoni:InsertRQ(PCB* p)3 /将 p 插入到就绪队列中POSITION pre,pos=m_readyList.GetHeadPosition();PCB *q;while(pos!=NULL)pre=pos;q=(PCB*)m_readyList.GetNext(pos);if(q-pri pri)

6、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;else4p=(PCB*)m_readyList.RemoveHead();m_pRunning=p;m_pRunning-status=1;elseif(!m_readyList.IsEmpty()p=(PCB*)m_readyList.Get

7、Head();/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;5m_pRunning-pri-=3;m_pRunning-time-=1;i

8、f(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;#include“pritimedlg.h“void CProcessView:OnStart() CPriTimeDlg dlg; /定义数据录入对话框dlg.DoModal()

9、;if(dlg.m_ok) m_proTotal=dlg.m_proNum;for(int i=0;im_proTotal;i+) m_prisi=dlg.m_prisi;6m_timesi=dlg.m_timesi;m_proMoni.OpenLogFile(); /打开日志文件PCB* p=CreatePCB(); /创建新进程m_proMoni.InsertRQ(p); /将新进程插入到就绪队列中m_proMoni.WriteLogToFile(); /写日志文件m_proMoni.ProSchedule(); /进程调度m_start=true; /设置开始标志Invalidate()

10、; /刷新视图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()/若已

11、完成则删除定时器KillTimer(1);m_killTimer=true;AfxMessageBox(“演示完毕“);CScrollView:OnTimer(nIDEvent);7五运行结果(1)数据录入界面:(2)进程调度过程的结果:8六、实验总结通过本实验使我对进程的相关概念及进程的优先数调度算法有了更深的理解,使自己在程序设计及编制方面也有了一定的提高。但在实验的过程中也遇到了一些问题。起初,按照实验要求,从文件中读去实验数据,我首先就想到了使用 MFC 中的 CFile 这个文件类,但是当把读去的数据转换成整数时却变成了乱码,由于当时没有想出很好的解决办法,于是我就退而求其次,便通过

12、对话框让用户输入实验所需的数据,后来在不断调试过程中,为了省去反复输入数据的麻烦,就又增加了随机生成数据的功能。不过最后想出了从文件中读去实验数据的办法,那就是先通过 CStdioFile 这个处理文本文件的类,从文件中先读去数据字符串,在从字符串中提取出实验数据。遇到的另一个问题是关于调度过程的显示,首先我是按照时间序列的增长,把每一对应时刻的调度情况通过一个表格的形式显示出来。但这只能反映某一时刻的情况。不能一次反映出整体的调度过程,于是我又在CProMoni 类中增加了用于记录进程调度整体过程的三个链表。然后每次调度的时候就把相应的调度过程信息添加到这三个链表中,这样就可以通过读取这三个

13、链表中的数据来反映出整个调度的情况。当然实验过程中遇到的不仅是这些问题,其他的就不一一列举拉。总之,尽管实验中碰到了很多问题,但经过不断的修改和完善最终完成了这次实验。当然,这个程序还不能算很完美,仍然存在一些小问题,比如:如果输入的数据过多,在显示调度过程时,由于就绪队列过长,可能会导致就绪队列中的进程信息在窗口中显示时会超出其显示范围而跑到完成队列的显示区域中。当然解决的方法应该是根据就绪队列的大小动态地设置其显示区域。还有窗口的滚动条也应该根据需要动态的进行设置其滚动范围,由于时间关系也只能这样牵强拉。七、实验说明本程序在 VC+6.0 环境下调试通过,由于篇幅所限,报告中只给出了部分关键代码。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报