文档介绍:操作系统实验报告
--进程调度
计科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;