【操作系统 - 2】时间片轮转RR进程调度算法

 操作系统系列



2017.03.17:整理第一版。

2018.01.08:添加使用 DEV C++ 的说明。


========

  学习至此,发现很多学了但很久没用的知识,久而久之,慢慢遗忘。等哪天还需要的话,却发现已经忘得差不多了,即使整理了文档(word等),还是得从头再学一遍。读研第一学期,发现很多东西都可以从博客上学习到,也有不少博主呕心沥血整理了挺多有用的博文。于是,本人借此契机,也慢慢开始整理一些博文,不断改进完善中。整理博文(IT)有如下目的:

  • 首要目的:记录“求学生涯”的所学所悟,不断修改,不断更新!(有读者的互动)
  • 其次目的在这“开源”的时代,整理并分享所学所悟是一种互利的行为!

博文系列:操作系统课程所学相关算法

  • 1.先来先服务FCFS和短作业优先SJF进程调度算法
  • 2.时间片轮转RR进程调度算法
  • 3.预防进程死锁的银行家算法
  • 4.动态分区分配算法
  • 5.虚拟内存页面置换算法
  • 6.磁盘调度算法


6个实验相关的代码下载地址:http://download.csdn.net/detail/houchaoqun_xmu/9865648

-------------------------------

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


一、概念介绍和案例解析

  • 时间片轮转法 - 基本原理
  在早期的时间片轮转法中,系统将所有的就绪进程按先来先服务的原则排成一个队列,每次调度时,把CPU分配给队首进程,并令其执行一个时间片。时间片的大小从几ms到几百ms。当执行的时间片用完时,由一个计时器发出时钟中断请求,调度程序便据此信号来停止该进程的执行,并将它送往就绪队列的末尾;然后,再把处理机分配给就绪队列中新的队首进程,同时也让它执行一个时间片。这样就可以保证就绪队列中的所有进程在一给定的时间内均能获得一时间片的处理机执行时间。换言之,系统能在给定的时间内响应所有用户的请求。

  • 时间片轮转法 - 时间片大小的确定
  在时间片轮转算法中,时间片的大小对系统性能有很大的影响,如选择很小的时间片将有利于短作业,因为它能较快地完成,但会频繁地发生中断、进程上下文的切换,从而增加系统的开销;反之,如选择太长的时间片,使得每个进程都能在一个时间片内完成,时间片轮转算法便退化为FCFS算法,无法满足交互式用户的需求。一个较为可取的大小是,时间片略大于一次典型的交互所需要的时间。这样可使大多数进程在一个时间片内完成。

  • 案例解析:
【操作系统 - 2】时间片轮转RR进程调度算法_第1张图片
(如上gif图是由GifCam软件制作)
  

所下图所示为q=1和q=4时各进程的平均周转时间和带权平均周转时间,图中的RR(Round Robin)表示轮转调度算法。

【操作系统 - 2】时间片轮转RR进程调度算法_第2张图片



二、实验介绍

  • 问题描述:
  设计程序模拟进程的时间片轮转RR调度过程。假设有n个进程分别在T1, … ,Tn时刻到达系统,它们需要的服务时间分别为S1, … ,Sn。分别利用不同的时间片大小q,采用时间片轮转RR进程调度算法进行调度,计算每个进程的完成时间、周转时间和带权周转时间,并且统计n个进程的平均周转时间和平均带权周转时间。

  • 程序要求:

1)进程个数n;每个进程的到达时间T1,… ,Tn和服务时间S1,… ,Sn;输入时间片大小q。

2)要求时间片轮转法RR调度进程运行,计算每个进程的周转时间和带权周转时间,并且计算所有进程的平均周转时间和带权平均周转时间;

3)输出:要求模拟整个调度过程,输出每个时刻的进程运行状态,如“时刻3:进程B开始运行”等等;

4)输出:要求输出计算出来的每个进程的周转时间、带权周转时间、所有进程的平均周转时间以及带权平均周转时间。


三、程序设计:

  • 本程序采用文件流的输入方式,将进程的到达时间、服务时间进行赋值。
  • 本程序采用数据结构的形式,将进行定义为一个数据结构:
typedef struct  
{
	char name;
	int ArrivalTime;
	int ServiceTime;
	int FinishedTime;
	int WholeTime;
	double WeightWholeTime;
}RR;
  • 本程序采用while循环对队列进行相应的处理,采用嵌套的for循环对q>1的情况做处理,将满足进程的到达时间小于当前时间的进程都进入队列。
  • 队列思想:分两部分处理,当队首的服务时间小于或者等于0的时候,将队首元素出队列,反之,将队首元素插入到队尾(注意,要先将新到来的进程插入队尾后,再将队首元素插入队尾)。
  • 各个进程的结束时间的处理:本程序在队列过程处理中,将进程的执行时间情中,然后,在后续的处理过程中,利用while循环,按照一遇到重复的进程名就更新的原则进行处理,如下:
	for (int i=0;i "<



四、实验结果分析

  • 时间片q=1,输入数据如下:
进程个数 = 5
时间片 q = 1
进程名字 = A B C D E
到达时间 = 0 1 2 3 4
服务时间 = 4 3 5 2 4
【操作系统 - 2】时间片轮转RR进程调度算法_第3张图片
  • 时间片q=4,输入数据如下:
进程个数 = 5
时间片 q = 4
进程名字 = A B C D E
到达时间 = 0 1 2 3 4
服务时间 = 4 3 5 2 4
【操作系统 - 2】时间片轮转RR进程调度算法_第4张图片
  • 练习题 and 程序实现:本文提供一道习题,建议读者先手动算一遍,验证程序的准确性!
  
用时间片轮转法RR调度进程A、B、C、D和E,时间片q分别为2和4,完成下面的表格:

【操作系统 - 2】时间片轮转RR进程调度算法_第5张图片
  

程序实现结果如下:
  • q = 1:
【操作系统 - 2】时间片轮转RR进程调度算法_第6张图片
  • q = 4:
【操作系统 - 2】时间片轮转RR进程调度算法_第7张图片


五、实验源码

// 操作系统_实验二(RR调度算法).cpp : 定义控制台应用程序的入口点。
//
#include 
#include 
#include 
#include 
using namespace std;

typedef struct  
{
	char name;
	int ArrivalTime;
	int ServiceTime;
	int FinishedTime;
	int WholeTime;
	double WeightWholeTime;
}RR;

static queueRRqueue;  //声明一个队列
static double AverageWT =0,AverageWWT=0;
static int q;  //时间片
static int n;  //进程个数
static RR RRarray[100];  //进程结构

void Input()
{
	//文件读取模式
	ifstream inData;
	inData.open("./data4.txt");
	//data.txt表示q = 4的RR调度算法
	//data2.txt表示q = 1的RR调度算法
	inData>>n;
	inData>>q;

	for (int i=0;i>RRarray[i].name;
	}
	for (int i=0;i>RRarray[i].ArrivalTime;
	}
	for (int i=0;i>RRarray[i].ServiceTime;
	}


	//用户输入模式
	//cout<<"****************************************************************"<>RRarray[i].name;
	//}

	//cout<<"please input the ArrivalTime of process:"<>RRarray[i].ArrivalTime;
	//}

	//cout<<"please input the ServiceTime of process:"<>RRarray[i].ServiceTime;
	//}

	cout<<"****************************************************************"<=q)
	{
		CurrentTime = q;
	}
	else
	{
		CurrentTime = RRarray[0].ServiceTime;
	}

	while(!RRqueue.empty())
	{	
		for (int j=i;j= RRarray[j].ArrivalTime) 
			{
				RRqueue.push(RRarray[j]);
				i++;
			}
		}
		if (RRqueue.front().ServiceTime "< "<


(2018.01.08 使用 DEV C++ 的说明)

如果读者们使用的是DEV C++,细节步骤如下:

1)使用DEV C++创建一个source file
2)把代码复制过去
3)把#include "stdafx.h"注释掉
4)把数据文件.txt也复制到根目录下
5)按 F10 直接 run 这个代码即可。

[Warning] NULL used in arithmetic [-Wpointer-arith] 只是对NULL的警告而已,不影响运行程序。

(本人使用 DEV C++ 的运行情况如下所示)

【操作系统 - 2】时间片轮转RR进程调度算法_第8张图片



你可能感兴趣的:(【C++】,【操作系统】,C++,数据结构)