资源简介

实验内容: 进程调度模拟程序:假设有10个进程需要在CPU上执行,分别用:  先进先出调度算法;  基于优先数的调度算法;  最短执行时间调度算法 确定这10个进程在CPU上的执行过程。要求每次进程调度时在屏幕上显示:  当前执行进程;  就绪队列;  等待队列 实验目的: 1)掌握处理机调度及其实现; 2)掌握进程状态及其状态转换; 3)掌握进程控制块PCB及其作用。 实验要求: 1) 创建10个进程的PCB,每个PCB包括:进程名、进程状态、优先级(1~10)、需要在处理机上执行的时间(ms)、队列指针等; 2) 初始化10个PCB(产生随机数0或1,分别表示进程处于就绪态或等待态); 3) 根据调度算法选择一个就绪进程在CPU上执行; 4) 在进程执行过程中,产生随机数0或1,该随机数为1时,将等待队列中的第一个PCB加入就绪队列的对尾; 5) 在进程执行过程中,产生一个随机数,表示执行进程能在处理机上执行的时间,如果随机时间大于总需要的时间,则执行完成。如果小于,则从总时间中减去执行时间。 6) 如果执行进程没有执行完成。则产生随机数0或1,当该随机数为0时,将执行进程加入就绪队列对尾;否则,将执行进程加入等待队列对尾; 7) 一直到就绪队列为空,程序执行结束。

资源截图

代码片段和文件信息

#include
#define OK 1
#define ERROR 0
#include 
#include 
using namespace std;

struct PCB//进程控制块的结构定义 
{
int name;//用数字对数据块标号 1-10 
int state;//其状态为0或1 其中0表示 等待状态 1表示就绪状态 
int prior;//优先级  随机数1-10 
int time; //执行进程所需时间 随机产生  
};
//////////////////////////////////////////////////队列的链式存储结构 
typedef struct QNode//定义结点
{
   PCB   data;
   struct QNode  *next;
} QNode *QueuePtr;
typedef struct 
{
   QueuePtr  front;            //队头指针   
   QueuePtr  rear;             //队尾指针
}linkQueue; 
/////////////////////////////////////////////////以下是处理链队的基本函数
 int InitQueue (linkQueue &Q)//初始化队列
{
   Q.front=Q.rear=new QNode;
    Q.front->next=NULL;
    return OK;
}
int EnQueue(linkQueue &QPCB e)//将一个结点插入到队列当中 

QueuePtr p=new QNode;
    if(!p) 
exit(0);
    p->data=e;
p->next=NULL;
    Q.rear->next=p;
    Q.rear=p;
    return OK;
}
int PrintQueue(linkQueue &Q)//打印整个队列
{
QueuePtr p=new QNode;
if(Q.front==Q.rear) 
return ERROR;
p=Q.front->next;
do
{
cout<<“         “<data.name<<“         “<data.state<<“         “<data.prior<<“         “<data.time< p=p->next;
}while(p!=NULL);
cout< delete p;
return OK;
}
int DeQueue (linkQueue &QPCB &e)//删除一个结点 
{
QueuePtr p=new QNode;
   if(Q.front==Q.rear) return ERROR;
   p=Q.front->next;
   e=p->data;
   Q.front->next=p->next;
   if(Q.rear==p) Q.rear=Q.front;
   delete p;
   return OK;
}
int GetHead (linkQueue &QPCB &e)//读取对列头元素
{
e=Q.front->next->data;
return OK;
}
int QueueEmpty (linkQueue Q)//判断队列是否为空,为空则返回0
{

if(Q.front==Q.rear)
return 0;    
else
return 1;
 }
 void fifo(linkQueue &waitlinkQueue &oklinkQueue &run)//先进先出调度算法,wait为等待对列,ok为就绪队列run为运行队列 
{
srand((unsigned)time(NULL));//让随机数不重复
PCB temp1; 
int t;
while(QueueEmpty(wait)==1||QueueEmpty(ok)==1)//当等待或者就绪队列其中一个不为空时执行 
{
int cpu=rand()%50+1; 
///////////////////////////////////////////////就绪队列放一个元素到运行队列中
if(1==QueueEmpty(ok))//ok队列非空
{
DeQueue (oktemp1);//就绪队列中出一个元素
if(temp1.time<=cpu) 
{
temp1.state=2; //2表示运行状态 
EnQueue(runtemp1);//就绪队列头进入运行队列
cout< cout<<“当前执行进程为:“< cout<<“执行完成!!!!\n该进程所需时间为“< }
else
{
cout<<“当前执行进程为:“< cout<<“执行一部分,该进程所需时间为“< temp1.time=temp1.time-cpu;
int j=rand()%2;
if(j==1)
{
EnQueue(oktemp1);
}
else
{
EnQueue(waittemp1); 
 } 
}
}
else
{
cout<<“就绪队列为空“< }
//////////////////////////////////////////////////////////产生一个随机数0或者1,1的话等待队列的第一个进程插入到就绪队列
if(1==QueueEmpty(wait))//等待队列非空
{
int j=rand()%2;
if(j==1)
{
DeQueue (waittemp1);
temp1.state = 1;
EnQueue(oktemp1);
}
}
////////////////////////////////////////////////////////////输

评论

共有 条评论