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

2023-11-08



一、实验目的

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

} 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

进程调度:时间片轮转调度算法 的相关文章

随机推荐

  • 如何在csdn转载文章

    Question 如何在CSDN中快速转载文章 Solution 1 在CSDN中找到想要转载的文章 右击点击 检查 或者快捷键F12 出现以下界面 图下图右侧所示 2 按住Ctrl F快捷键 在弹出的搜索框中寻找 article cont
  • 整理注解使用

    常用注解 三个标注注解 Override 检查该方法是否是重写方法 如果发现其父类 或者是引用的接口中并没有该方法时 会报编译错误 Deprecated 标记过时方法 如果使用该方法 会报编译警告 SuppressWarnings 指示编译
  • Mybatis执行流程剖析

    这里写自定义目录标题 一 流程 从项目中看流程 一 流程 Resource获取加载全局配置文件 如图 引入properties文件和连接数据库等配置都在xml中 实例化SqlSessionFactoryBuider构造器 SqlSessio
  • 解决Oracle数据库ORA-01157: cannot identify/lock data file 10 - see DBWR trace file ORA-01110: data file 1

    解决Oracle数据库启动报错ORA 01157 cannot identify lock data file 10 see DBWR trace file ORA 01110 data file 10 u01 app oracle ora
  • 蓝桥杯-时间显示(java)

    问题描述 小蓝要和朋友合作开发一个时间显示的网站 在服务器上 朋友已经获取了当前的时间 用一个整数表示 值为从1970年1月1日O0 00 00到当前时刻经过的毫秒数 现在 小蓝要在客户端显示出这个时间 小蓝不用显示出年月日 只需要显示出时
  • es ik 词库添加词语_五、IK自定义词库及远程热更新

    IKAnalyzer cfg xml为IK分词器的配置文件 一 IKAnalyzer cfg xml文件分析properties SYSTEM http java sun com dtd properties dtd gt IK Analy
  • 本周参加两个SAP项目面试后的感想

    本周参加两个SAP项目面试后的感想 本周二和周四 应约参加了2个不同项目的电话面试 感触挺多的 1 行业经验在很多项目选人的时候具有关键性的决定作用 A项目 是一个快消品行业的大项目 客户是世界跨国巨头 听对方介绍起来该项目规模庞大 极其复
  • JS多个对象添加到一个对象中

    var obj1 qq 10 var obj2 mm 2 nn 3 var obj3 xx 1 yy 5 obj1 field1 obj2 obj1 field2 obj3 console log obj1 转载于 https www cn
  • linux系统查看文件大小及使用空间大小

    1 查看 data test文件夹下所有文件大小之和命令 du h max depth 1 data test 2 查看 data test文件夹下所有文件大小明细 每个文件大小 命令 du h max depth 1 data test
  • 四路服务器选型项目,四路服务器详细

    四路服务器详细 内容精选 换一换 在待分析的服务器上安装节点 Web服务器 即安装鲲鹏性能分析工具的服务器 默认安装了节点 如果待分析的服务器与安装工具的服务器是同一个 请跳过该章节 已成功登录系统性能分析 待添加节点的服务器已配置操作系统
  • 17款最佳的代码审查工具

    好的代码审查器可以大大地帮助程序员提高代码质量 减少错误几率 虽然现在市场上有许多可用的代码审查工具 但如何挑选也是一个艰巨的任务 在咨询过有关专家的建议和意见之后 我们罗列出了以下17款最佳的代码审查工具 1 CodeStriker Co
  • Vue.js 条件渲染全解析

    注意标题是条件渲染而不是条件判断 Vue给v if这类条件判断属性取名叫条件渲染 这些属性的目的是判断要不要渲染这些元素 而不仅仅是所谓的判断 是否渲染才是最主要的功能 v if的使用 例如下面的代码 span里面可以显示message的信
  • 关于 Diffie-Hellman 组

    Diffie Hellman DH 组确定了在密钥交换进程中使用的密钥的强度 组的编号越大安全性就越高 但是也就需要更多的时间来计算密钥 WatchGuard 设备支持 Diffie Hellman 组 1 2 和 5 DH 组 1 768
  • PAT C 语言入门题目-7-60 删除重复字符 (20 分)

    7 60 删除重复字符 20 分 本题要求编写程序 将给定字符串去掉重复的字符后 按照字符ASCII码顺序从小到大排序后输出 输入格式 输入是一个以回车结束的非空字符串 少于80个字符 输出格式 输出去重排序后的结果字符串 输入样例 ad2
  • 06_列表渲染_1

    div h2 测试 v for 遍历数组 h2 ul li index p name li ul div
  • Linux多进程:zombie process——僵尸进程

    僵尸进程zombie process 子进程终止时 父进程尚未回收子进程残留的内核区资源 从而变成僵尸进程 僵尸进程不能被 kill 9 杀死 如果父进程不调用wait 或waitpid 的话 僵尸进程不会被处理 其pcb pid等资源一直
  • 英语二作文模板及范文

    文章目录 四大写作模板 辩证分析类 短文题目 二选一 模板 A OR B 范文 解决问题类 短文题目 提纲思路 写作模板 题目 范文 Fight against Haze 个人介绍类 短文题目 提纲思路 写作模板 范文 My Hobby 电
  • 在微信公众号里使用LaTeX数学公式

    quicklatex这个神器和它的wordpress插件QuickLaTeX 几乎完美支持和兼容Mathjax所支持的LaTeX数学公式 方法很简单 只要在wordpress中安装quicklatex 然后在文章的开头添加一个 latexp
  • b树和b+树的数据结构

    在B树中 你可以将键和值存放在内部节点和叶子节点 但在B 树中 内部节点都是键 没有值 叶子节点同时存放键和值 B 树的叶子节点有一条链相连 而B树的叶子节点各自独立 B树 普通的二叉树一个节点有一个元素 B树一个节点可以有多个元素 节点里
  • 进程调度:时间片轮转调度算法

    一 实验目的 1 加深对进程的理解 2 理解进程控制块的结构 3 理解进程运行的并发性 4 掌握时间片轮转法进程调度算法 二 实验原理 1 建立进程控制块 2 设计两个链队列 分别表示就绪队列和完成队列 3 用户输入进程标识符 进程到达时间