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

  • 156
  • 0
  • 约4.48千字
  • 约 9页
  • 2016-08-22 发布于重庆
  • 举报
计算机操作系统实验---进程调度

操作系统实验报告 --进程调度 计科02-8 王长青 05年4月17日 计算机操作系统实验 ——进程调度 一.实验目的 进程调度是处理机管理的核心内容。通过本实验可以加深理解有关进程控制块、进程队列的概念,并体会和了解优先数调度算法的具体实施办法。 二.程序功能 本程序使用VC++编译调试,用于实现进程优先数调度的模拟。主要包含三个模块:1、主界面:用于显示进程调度的过程。2、数据录入模块:用于获取进程的初始值,其中有三种获取方式,手动输入方式、随即生成方式和从文件中读去数据的方式。当用户在主窗口中点击“开始”菜单项时即可打开数据录入对话框,用户通过这三种方式之一均可完成数据的录入。3、进程控制模块:主要实现创建新的进程,就绪队列的管理,完成队列的管理,进程的调度。 三.实验原理 (1)本程序采用优先数调度算法对进程进行调度,每个进程可有三个状态,即:就绪状态,运行状态,完成状态。并假设初始状态为就绪状态。这三种状态的转换情况如右图: (2)为了便于处理,程序中的某进程运行时间以时间片为单位计算。各进程的优先数以及进程需运行的时间片数的初始值均由用户给定(通过数据录入模块完成)。 (3)程序通过设置一个定时器来实现时间片的轮转,时间片的大小是1秒,在定时器消息的响应函数中从用户录入的数据中读取一个创建进程,将其加入到就绪队列中,然后进行调度和执行。在调度函数中,对于遇到优先数一致的情况,采用FIFO策略解决。 (4)在优先数算法中,进程每执行一次,优先数减3,进程还需要运行的时间数减1。 四.详细设计 (1)设计进程控制块PCB结构: struct PCB { int 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 p-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; } else { p=(PCB*)m_readyList.RemoveHead(); m_pRunning=p; m_pRunning-status=1; } } else { if(!m_readyLis

文档评论(0)

1亿VIP精品文档

相关文档