一、实验目的
(1) 加深对进程的理解
(2) 理解进程控制块的结构
(3) 理解进程运行的并发性
(4) 掌握时间片轮转法进程调度算法
二、实验原理
(1)建立进程控制块
(2)设计两个链队列,分别表示就绪队列和完成队列
(3)用户输入进程标识符,进程到达时间,进程所需的时间,申请空间存放进程,PCB信息。
(4)每一个时间片结束输出各进程的进程标识符,CPU运行时间
,进程所需时间,达到时间,周转时间,以及状态(运行完成或者就绪)
三、实验步骤、数据记录及处理
1.算法流程
本程序中用到抽象数据类型的定义。
struct _PCBNode
{
char name[20]; //进程名称
int arrive_time; //到达时间
int need_time; //服务时间
int cputime; //CPU已经执行的时间
int accomplish_Time; //完成时间
int turn_over_time; //周转时间
bool tag; //是否完成
};
class _PCB
{
private:
queue<struct _PCBNode> _PNode;
queue<struct _PCBNode> _CNode;
int TIME;
}
主程序的流程以及各程序模块之间的层次(调用)关系。
实现概要设计中定义的主要函数,对主要函数写出核心算法(要求注释);并尽可能画程
序流程图)
本程序写着的就绪队列中放着客户外界输入未到达的进程,所以在进行时间片轮转时要判断当前时间和到达时间,到达时间大于当前时间时才能CPU的调度
void Pop()//模仿时间轮转调度 { struct _PCBNode node; unsigned int n = _PNode.size(); unsigned int i = 0; for(; i< n; ++i)// for循环找队列中到达时间大于当前时间时的进程 { node = _PNode.front();_PNode.pop(); if(node.arrive_time <= TIME) { break; } _PNode.push(node); } TIME = TIME+Time_Pice;//模拟进程运行中 if(i == n)//没找到到达时间大于当前时间时的进程 { Display_PCB(); return ; } node.cputime +=Time_Pice; //进程占有CPU运行的时间 if(node.cputime >= node.need_time)//完成运行,进入完成队列 { node.accomplish_Time = TIME; node.tag = true; node.turn_over_time = node.accomplish_Time -node.arrive_time ; _CNode.push(node); cout<<node.name<<" run over"<<endl; } else { _PNode.push(node); } Display_PCB(); }
2.运行结果分析
时间片被设置为 2,打印TIME时间时就绪队列和运行完成队列的进程状态
四、总结与体会
通过做本次实验,我模拟了CPU进程调度中的时间片轮转调度算法。时间片轮状调度算法可以实现进程共享CPU。在试验中,我发现时间片不能太大,否则会导致大部分的进程在一个时间片中就能运行完成,不能实现进程对CPU资源的共享。
附录:源程序
#include<iostream>
#include<queue>
#include<string>
using namespace std;
#define Time_Pice 2
struct _PCBNode
{
char name[20]; //进程名称
int arrive_time; //到达时间
int need_time; //服务时间
int cputime; //CPU已经执行的时间
int accomplish_Time; //完成时间
int turn_over_time; //周转时间
bool tag; //是否完成
};
class _PCB
{
public:
void Push(struct _PCBNode& node)
{
_PNode.push(node);
}
void init_time()
{
TIME = 0;
}
bool empty()
{
return _PNode.empty();
}
void Pop()
{
struct _PCBNode node;
unsigned int n = _PNode.size();
unsigned int i = 0;
for(; i< n; ++i)
{
node = _PNode.front();_PNode.pop();
if(node.arrive_time <= TIME)
{
break;
}
_PNode.push(node);
}
TIME = TIME+Time_Pice;
if(i == n)
{
Display_PCB();
return ;
}
node.cputime +=Time_Pice;
if(node.cputime >= node.need_time)
{
node.accomplish_Time = TIME;
node.tag = true;
node.turn_over_time = node.accomplish_Time -node.arrive_time ;
_CNode.push(node);
cout<<node.name<<" run over"<<endl;
}
else
{
_PNode.push(node);
}
Display_PCB();
}
void Display_PCB()
{
cout<<" TIME "<<TIME<<endl;
int n = _PNode.size();
if(n != 0)
{
cout<<"ready......."<<endl;
cout<<"name arrive_time need_time cputime tag"<<endl;
for(int i = 0;i<n; ++i)
{
struct _PCBNode node = _PNode.front();_PNode.pop();
if(node.arrive_time <= TIME)
{
cout<<node.name<<" "<<node.arrive_time<<" "
<<node.need_time<<" "<<node.cputime <<" "<<node.tag <<endl;
}
_PNode.push(node);
}
cout<<endl;
}
n = _CNode.size();
if(n != 0)
{
cout<<"run over"<<endl;
cout<<"name arrive_time need_time accomplish_Time turn_over_time tag"<<endl;
for(int i = 0;i<n; ++i)
{
struct _PCBNode node = _CNode.front();_CNode.pop();
cout<<node.name<<" "<<node.arrive_time<<" "
<<node.need_time<<" "<<node.accomplish_Time<<" "<< node.turn_over_time<<" "<<node.tag <<endl;
_CNode.push(node);
}
cout<<endl;
}
cout<<"**************************************************"<<endl;
}
private:
queue<struct _PCBNode> _PNode;
queue<struct _PCBNode> _CNode;
int TIME;
};
void main()
{
_PCB pcb;
pcb.init_time();
int PCB_Numble;
char PCBname[20];
int arrive_time;
int need_time;
cout<<"input PCB_Numble : ";
cin>>PCB_Numble;
cout<<"input PCBname arrive_time need_time example A 0 5\n";
for(int i = 0; i<PCB_Numble; ++i)
{
cin>>PCBname>>arrive_time>>need_time;
struct _PCBNode node;
strcpy(node.name ,PCBname);
node.arrive_time = arrive_time;
node.need_time = need_time;
node.accomplish_Time = 0;
node.cputime = 0;
node.tag = 0;
pcb.Push(node);
}
pcb.Display_PCB();
while(!pcb.empty())
{
pcb.Pop();
}
}