注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

我的博客

 
 
 

日志

 
 

操作系统实验报告——处理机调度  

2007-12-05 23:19:38|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

实验名称:处理机调度

实验内容:选择一个调度算法,实现处理机的调度。   

实验目的:进程调度是处理机管理的核心内容。多道系统中,当就绪进程数大于处理机数时,就必须按照某种策略决定哪些进程优先占用处理机。本实验模拟实现处理机调度,以加深对进程控制块,进城队列,进城状态(后备,就绪,运行,挂起,解挂等)等概念的理解,从而较好地了解作业/进程调度的工作过程。此外,通过该实验体会和了解优先权和时间片轮换调度算法的具体实施办法。

实验题目:(1)设计一个按优先权调度算法实现处理机调度的程序

             (2)设计按时间片轮转算法实现处理机调度的程序

实验要求:(1)可以随机输入若干进程,并按优先权排序

             (2)从就绪队列的首选进程开始运行;优先权-1/要求运行时间-1,要求当运行时间=0时,撤销该进程

             (3)重新排序,进行下一轮调度

             (4)采用图形界面实现,可以适当加入动画效果

             (5)可以随时增加进程

             (6)规定道数,设置后备队列和挂起状态。若内存中进程少于规定道数,可以自动从后备队列调度一作业进入。被挂起进程进入挂起队列,设置解挂功能用于将指定挂起进程解挂并加入就绪队列

             (7)每次调度后,显示个进程的状态

实验分析:(1)本实验中设定时间片是50毫秒,所以提交作业时,最好提交一个运行时间超过50毫秒的作业。

          (2)1.作业调度时间片原则:各进程按时间片运行,当一个时间片用完后,便停止该进程的执行而重新进行调度。这种原则是用于分时系统以及某些实时系统。

               2.优先权原则:通常是对一些重要的和紧急的作业赋予较高的优先权。当这种作业到达时,如果其优先权比正在运行的进程的优先权高,便停止正在执行的进程,将处理机分配给高优先权作业的进程,使之执行。

               3.段作业优先原则:当新到达的作业比正在执行的作业明显短时,将剥夺长作业的执行。将处理机分配给短作业,使之优先执行。

            (3)作业调度程序是本实验的重点,它负责响应用户的命令,这些命令可以是提交作业,删除作业,察看信息和执行响应得动作。同时还要在运行作业的时间片到期时重新进行调度。这其中涉及如何设定一个时钟,让它在一个时间片结束时提醒调度程序进行调度,进行作业切换,还有与用户命令进程之间的通信问题。

            (4)对于按优先权调度算法进行调度,PCB所包含的内容主要如下:

                进程名/PID ;要求运行时间(单位时间) 优先权;状态;

PCB指针。

            (5)对于按时间片轮转算法进行调度,PCB所包含的内容主要如下:

                进程名/PID ;要求运行时间(单位时间);已运行时间;

状态;PCB指针。

 

   

实验心得:因自己的c语言学的不是很好,且自己不会用一门好的开发工具,所以上次实验后去图书馆借了一本VC来看,那有点难,学了很久也不知道是怎么回事,而关于图形界面编程就更难了,心里感觉不怎么好,而这次实验要比上次实验难, 所以我就更难做出来了,上次实验我还做出来了,这次我除了懂单工停等协议的原理之外,其它我什么都不会。同学说VC很难学,那是比较专业的开发工具,建议我们去学VB,说VB很容易上手。不知道是不是真的,反正先去借本书来看看,希望能学到些东西,下次实验上机的时候能够有事情做,这次实验做得不好,希望下次我能够做好。

实验参考书:《计算机操作系统》

           《操作系统实验指导》

实验代码:

#include<iostream.h>

#include<stdlib.h>

#include<time.h>

#include<stdio.h>

#include<string.h>

 

const int  MAXCOMMANDLEN =50;        

 

/////////////////////////////////////////////////////////////////////////////////////

//          

//         PROCESS 

//

/////////////////////////////////////////////////////////////////////////////////////

 

class Process                          //进程类

{

friend class CPU;

protected:

 static int init_ID;     //随机进程ID

    int ID;        //进程ID

 char runText[MAXCOMMANDLEN];  //进程指令数组

 int IP;        //进程指令指针,保存进程指令执行到的具体位置

 bool ISuseSource;     //此进程是否使用资源,ture:使用中  false : 未使用

 bool ISblocked;      //此进程是否被阻塞  ture:阻塞  false :未阻塞

 int unitTime;      //进程单位被cpu执行时间, 默认 1

 int blockTime;      //进程被阻塞时间

public:

 static void RandID();    //随机生成进程ID

 Process();

 int getID();     

 int getIP();     

 void setIP(int);    

 void Runed();      //进程被cpu执行

 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 ) );

 init_ID=rand();

}

Process::Process()

{

 ID=init_ID++;    

 int commandLen;

 IP=0;

 cout<<"Please input the text which process runed by CPU [#command#] :>\ ";

 cin>>runText;

 if( (commandLen=strlen(runText) ) > MAXCOMMANDLEN )

  exit(0);

 runText[commandLen]='#';     // 指令结束标志 '#'

 runText[commandLen+1]='';

 ISuseSource=false;

 ISblocked=false;

 unitTime=1;

 blockTime=0;

}

void Process::Runed()

int Process::getID()

{

 return ID;

}

int Process::getIP()

{

 return IP;

}

void Process::setIP(int ip)

bool Process::getISusesource()

{

 return ISuseSource;

}

void Process::setISusesource(bool s)

char* Process::getRuntext()

{

 return runText;

}

int Process::getUnittime()

{

 return unitTime;

}

int Process::getBlcoktime()

{

 return blockTime;

}

void Process::setBlocktime(int BT)

void Process::setUnittime(int UT)

void Process::setBlockstate(bool state)

bool Process::getBlockstate()

{

 return ISblocked;

}

char Process::getResult(int k)

{

  return runText[k];

}

/////////////////////////////////////////////////////////////////////////////////////

//          

//         SOURCE 

//

/////////////////////////////////////////////////////////////////////////////////////

class Source        //资源类

{

protected:

 int ID;         //资源 ID

 bool state;        //资源状态 true : 未被进程占有  false : 已被占有

 int pro_ID;        //使用资源的进程id

 Process *pro;       //使用资源的进程指针

 int time;        //进程使用资源的时间

public:

 Source(int);

 bool getState();      //得到进程状态

 void setState(bool);     //设置进程状态

 void setTime(int);      //设置进程使用资源的时间

 void setPro(Process *);     //设置使用该资源的进程

 int getID();       //得到资源id

 int getPorID();       //得到使用资源的进程id

 void setProID(int);      //设置使用资源的进程id

 void runned();       //资源被cpu调用

};

Source::Source(int id)

void Source::setProID(int id)

void Source::setTime(int t)

void Source::setState(bool s)

bool Source::getState()

{

 return state;

}

void Source::setPro(Process *p)

void Source::runned()

{

 if(time>0)

 {

  cout<<"( Source :"<<ID<<")";

  time--;

 }

 if(time<=0)          //进程使用完资源释放资源,使用资源的时间到

 {

  pro->setISusesource(false);

  int ip=pro->getIP();

  pro->setIP(++ip);

  Source::setState(true);

  cout<<endl<<"The process "<<pro->getID()<<" relase the source!"<<endl;

  pro=NULL;

 }

}

/////////////////////////////////////////////////////////////////////////////////////

//          

//         CPU 

//

/////////////////////////////////////////////////////////////////////////////////////

 

typedef struct Block     //阻塞队列结构

{

 Process *p_BlockProcess;   //被阻塞的进程队列

 int index;       //被阻塞的进程在就绪队列中的索引(位置)

}Block;

class CPU      

{

protected:

 Process *p_Process;     //进程队列

 Process **pp_Process;    //进程就绪队列

 Block *blockQueue ;    //进程阻塞队列

 Source  *p_Source;     //资源指针

 int numOfprocess;     //进程数量

 int numOfblock;      //被阻塞的进程数

 int PC;        //程序计数器

 int allTime;      //cpu运行的总时间

public :

 CPU(int);

 void Run();       //cpu运行进程

 bool _IC(Process&);     //虚拟IC,进行进程指令翻译

 void useSource(Process&);   //进程申请资源

 void blockProcess(Process&);        //阻塞进程

 void releaseBlockPro();    //释放阻塞进程

 int getAlltime();     //得到进程运行的总时间

 void displayPro();     //显示进程的基本信息,id,指令,运行时间等

 void blockTimeADD();    //阻塞时间加1

};

CPU::CPU(int num)

{

  p_Source=new Source(379857);

  numOfprocess=num;

  numOfblock=0;

  allTime=0;

  p_Process=new Process[numOfprocess];

  pp_Process=new Process*[numOfprocess];

  blockQueue=new Block[numOfprocess];

  for(int i=0;i<numOfprocess;i++)

}

int CPU::getAlltime()

{

 return allTime;

}

void CPU::displayPro()

{

 for(int i=0;i<numOfprocess;i++)

 {

  cout<<" Process ID : "<<p_Process[i].getID()<<endl;

  cout<<"   text of runned :"<<p_Process[i].getRuntext()<<endl;

 }

}

void CPU::Run()

{

 int numPro=numOfprocess;

 do

 {

  for(int num=0;num < numOfprocess;num++)

  {

   if(!pp_Process[num])      //如果该指针为空,说明该进程不在就绪队列中

    continue;

   for(int t=0;t<p_Process[num].getUnittime();t++)

   {

    PC=p_Process[num].getIP();

    if(_IC(p_Process[num]))     

    {

     if(t==0)

      cout<<"the process ["<<p_Process[num].getID()<<"] runed : ";

     if(!p_Process[num].getISusesource())

    

     else

     {

       p_Source->runned();

       if( p_Source->getState() && numOfblock>0 )     //释放阻塞进程

     }

    }

    else

    {

     if(!p_Process[num].getBlockstate())

     {

      numPro--;

         pp_Process[num]=NULL;

      continue;

     }

     break;

    }

    allTime++;

    if(numOfblock>0)

     blockTimeADD();

   }//end for t...

   if( p_Process[num].getUnittime() )

    p_Process[num].setUnittime(1);

   cout<<endl;

  }//end for num...

 }while(numPro);

}

bool CPU::_IC(Process &p)                    

{

 //对进程中的指令进行翻译

 char resultRunned;

 resultRunned=p.getResult(PC);

 if(resultRunned=='#')

  return false;

 else

 {

  if(resultRunned=='

)      //申请资源指令

  {

   PC++;

   p.setIP(PC);

   resultRunned=p.getResult(PC);

   if( resultRunned >='1' && resultRunned <='9' )

   {

    if(p_Source->getState())

    {

     //资源未被使用则使用资源

     useSource(p);

     cout<<"The process "<<p.getID()<<" take up the source!"<<endl;

    }

    else

    {

     //资源已被使用则阻塞进程

     blockProcess(p);

     cout<<"The process "<<p.getID()<<" is blocked !"<<endl;

     return false;

    }

   }

   else

   {

    //' 后跟的不是数字,则语法错误

    cout<<"The process ["<<p.getID()<<"] runned fail ! It has been stopped! "<<endl;

    return false;

   }

  }

 }

  return true;

}

void CPU::blockTimeADD()

{

 for(int i=0;i<numOfblock;i++)

 {

  int BT=blockQueue[i].p_BlockProcess->getBlcoktime();

  blockQueue[i].p_BlockProcess->setBlocktime(++BT);

 }

}

void CPU::useSource(Process& p)

{

 p.setISusesource(true);

 p_Source->setState(fa

  评论这张
 
阅读(1499)| 评论(1)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017