进程调度:时间片轮转调度算法



一、实验目的

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

} 

  • 9
    点赞
  • 128
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值