精品文档
一、 实验目的
无论是批处理系统、分时系统还是实时系统,用户进程数一般都大于处理机数,这将导致用户进程互相争夺处理机。这就要求进程调度程序按一定的策略,动态地把处理机分配给处于就绪队列中的某一进程,以使之执行。进程调度是处理机管理的核心内容。本实验要求采用调度算法编写和调试一个简单的进程调度程序。通过本实验可以加深理解有关进程控制块、进程队列、阻塞队列、就绪队列等的概念。并了解CPU分配资源的方式。
二、 实验要求
调试一个进程调度程序,对程序进行注释,理解每条语句的用意,掌握CPU对进城进程分配资源的方式,以加深对进程概念及进程调度算法的理解。
三、 实验内容
1.进程调度算法:
采用最高优先数优先的调度算法(即把处理机分配给优先数最高的进程)和先来先服务算法(将用户作业和就绪进程按提交顺序或变为就绪状态的先后排成队列,并按照先来先服务的方式进行调度处理)。 2.进程控制块
每个进程有一个进程控制块( PCB)表示。进程控制块可以包含如下信息:进程ID、进程IP、进程指令(优先级数)、运行时间、阻塞时间、阻塞状况、占用资源情况等。
进程的优先数及需要的运行时间可以事先人为地指定,即输入进程的执行指令。 进程的运行时间以时间片为单位进行计算。
每个进程的状态可以是就绪 、运行和阻塞三种状态之一。 3.资源
资源包括资源ID、资源状态(是否被占用)、使用资源的进程ID、进程指针以及使用时间。
程序规定CPU资源数为1,既所有进程只能请求同一资源,如果所请求资源已被占用,则进程进入阻塞队列等待资源。 4.CPU
CPU包括执行中的进程指针、就绪队列、阻塞队列、CPU资源、进程数、阻塞进程数以及CPU运行时间。
就绪进程获得 CPU后都只能运行一个时间片。用已占用CPU时间加1来表示。 如果运行一个时间片后,进程的已占用 CPU时间已达到所需要的运行时间,则撤消该进程,如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行时间,也就是进程还需要继续运行,此时应将进程的优先数减1(即降低一级),然后把它插入就绪队列等待CPU。
进行调度程序后打印进程所有运行的进程的进程信息,以便进行检查。
四、 实验算法流程
文档下载后可复制编辑
精品文档
开始 输入进程指令 初始化进程ID 进程阻塞 进程加入就绪队列 就绪队列空 进程加入阻塞队列 资源占用 结束 进程运行 进程运行时间结束 进程到达释放进程 进程加入就绪队列
五、 实验程序清单
#include
const int MAXCOMMANDLEN =50;
文档下载后可复制编辑
精品文档
///////////////////////////////////////////////////////////////////////////////////// //
// PROCESS //
///////////////////////////////////////////////////////////////////////////////////// class Process {
friend class CPU; protected:
static int init_ID; int ID;
char runText[MAXCOMMANDLEN]; //进程指令 int IP; //进程IP
bool ISuseSource; //进程是否占用资源 bool ISblocked; //进程是否阻塞 int unitTime; //CPU执行时间 int blockTime; //进程阻塞时间 public:
static void RandID(); //初始化静态成员变量init_ID() Process(); //构造函数 int getID(); //获取进程ID int getIP(); //获取进程IP void setIP(int); //设置进程IP void Runed(); //输出进程IP int getUnittime(); //获得单位时间 int getBlcoktime(); //获得阻塞时间 void setBlocktime(int); //设置阻塞时间 void setUnittime(int); //设置单位执行时间 char getResult(int); //获得进程执行结果 char* getRuntext(); //获得进程执行指令 void setBlockstate(bool); //设置阻塞状态 bool getBlockstate(); //获得阻塞状态 bool getISusesource(); //获得资源转台 void setISusesource(bool); //设置资源状态 };
int Process::init_ID;
void Process::RandID() {
srand( (unsigned)time( NULL ) ); //函数调用time()函数为随机数种子初始化,使每次调用srand()函数产生变值
init_ID=rand(); //自动调用srand((unsigned)time(NULL))初始化init_ID,使每次初始值都不同 }
Process::Process()
文档下载后可复制编辑
精品文档
{
ID=init_ID++; int commandLen; IP=0;
cout<<\ cin>>runText; //输入命令
if( (commandLen=strlen(runText) ) > MAXCOMMANDLEN ) exit(0);
runText[commandLen]='#'; runText[commandLen+1]='\\0'; ISuseSource=false; ISblocked=false; unitTime=1; blockTime=0; }
void Process::Runed() {
cout< int Process::getID() { return ID; } int Process::getIP() { return IP; } void Process::setIP(int ip) { IP=ip; } bool Process::getISusesource() { return ISuseSource; } void Process::setISusesource(bool s) { ISuseSource=s; 文档下载后可复制编辑 //放入runText的命令添加结束符 //设置资源未使用 //设置进程为未阻塞 //设置单位时间为1 //设置快时间为0 //获得下一个地址IP 精品文档 } char* Process::getRuntext() { return runText; } int Process::getUnittime() { return unitTime; } int Process::getBlcoktime() { return blockTime; } void Process::setBlocktime(int BT) { blockTime=BT; } void Process::setUnittime(int UT) { unitTime=UT; } void Process::setBlockstate(bool state) { ISblocked=state; } bool Process::getBlockstate() { return ISblocked; } char Process::getResult(int k) { return runText[k]; } ///////////////////////////////////////////////////////////////////////////////////// // // SOURCE // ///////////////////////////////////////////////////////////////////////////////////// 文档下载后可复制编辑