时间片轮转进程调度算法

  • 实验目的和要求
  • 实验内容
  • 实验过程
  • 数据结构:
  • 部分代码:
  • 实验结果:
  • 分析和讨论
  • 完整代码


实验目的和要求

(1) 掌握时间片轮转进程调度的概念和算法
(2) 加深对处理机分配的理解

实验内容

在集成开发环境下使用C++语言利用相应的函数,编写程序实现时间片轮转进程调度算法,学会运行程序和调试程序。具体内容包括:
(1) 初始化各进程相关数据,包括各进程已运行时间、要求运行时间、进程状态(等待、就绪、执行);建立进程链表(要有首、尾指针);
(2) 用类似于表格的形式进行显示,需要打印表头,各个进程之间有表格线分割;
(3) 改变时间片的大小,观察时间片大小对进程调度的影响;

实验过程

程序需要支持如下任务:

  1. 它必须允许用户指明进程数,时间片长度,进程标识符,进程要求运行的时间。
  2. 按表格输出进程数据
  3. 当进程执行完毕后请求用户重新输入时间片长度,并再次要求用户输入进程数据

数据结构:

  1. 创建链表存储进程数据。

    每一个结点存储一个PCB,当输出、修改进程数据时通过指针的移动获取PCB内数据
  2. 通过creatList()创建建链表并返回链表的头指针
  3. 通过print()打印所有进程数据,并修改进程状态和运行时间
  4. text()检测进程是否执行完毕,执行完则跳至下一个进程,若全部执行完则打印“进程执行完毕”

部分代码:

struct PCB {
	int pid;  //进程标识符
	int rr;		//已运行时间
	int time;	//进程要求运行时间
	char sta;	//进程状态 
	struct PCB* next; //链接指针 
};
int main() {
	PCB* front, * rear;
	PCB* head = new PCB();
	front = rear = head;
	cout << "请输入时间片长度" << endl;
	while(cin>>qq){
		//创建链表并初始化数据
		creatList(head);
		//打印链表数据
		print(head);
		cout << "请再次输入时间片长度" << endl;
	}
	
	return 0;
}

实验结果:

时间片轮转调度java实现 时间片轮转调度程序_算法

分析和讨论

程序要求用户输入数据,并以输入顺序为进程到达顺序,未考虑进程到达时间,可以考虑设计一个整型变量t检测时间片的运行,当到达时间=t时将进程插入当前进程的前一个进程,并将链表长度加1;
通过自己动手实现RR(时间片轮转,q=时间片),加深了对时间片轮转进程调度的概念和算法,也加深了对CPU分配的理解,通过自己实现代码,加深了对c++的理解,参数传递的关系。

完整代码

/*
操作系统实验(2)时间片轮转算法

*/

#include <iostream>
#include <string>
#include <Windows.h>
using namespace std;

int count1, qq;

struct PCB {
	int pid;  //进程标识符
	int rr;		//已运行时间
	int time;	//进程要求运行时间
	char sta;	//进程状态 
	struct PCB* next; //链接指针 
};

//检测进程是否全部执行完毕
//q指向正在执行的进程(PCB) qq为时间片 flag=0;
int test(PCB*& q, int qq,int flag) {
	if (flag == count1)
		return flag;
	else {
		if (q->rr == q->time) {
			//跳过已经结束的进程
			q = q->next;
			//再次检测进程是否结束
			return test(q, qq, ++flag);
		}
		else {
			q->rr += qq;
			q->rr = q->rr > q->time ? q->time : q->rr;
			q->sta = 'r';
			return flag;
		}
	}	
}

PCB* creatList(PCB* head) {
	PCB* front, * rear;
	front = rear = head;

	cout << "请输入进程数" << endl;
	cin >> count1;
	cout << "请输入pid 和 进程要求运行时间" << endl;
	for (int i = 0; i < count1; i++) {
		PCB* p = new PCB;
		p->rr = 0;
		p->sta = 'w';
		cin >> p->pid >> p->time;
		rear->next = p;
		rear = p;
	}
	rear->next = front->next;

	return head;

}

void print(PCB* front) {

	PCB* q = front->next;
	while (1) {
		int flag = 0;

		//检测进程是否全部执行完毕
		if (test(q, qq,flag) == count1) {
			cout << "进程执行完毕" << endl;
			break;
		}
		
		cout << "+------------|---------|---------|----------+" << endl;
		cout << "|pid\t|\ttrr\t|\time\t|\tSTA\t|" << endl;
		cout << "+------------|---------|---------|----------+" << endl;

		//通过指针迭代输出所有数据
		for (int i = 0; i < count1; i++) {
			front = front->next;
			cout << "|" << front->pid 
			<< "\t|\t" << front->rr
			<< "\t|\t" << front->time 
			<< "\t|\t" << front->sta
			<< "\t|" << endl;
		}
		q->sta = 'w';
		//指针指向下一个进程,执行下一个时间片
		q = q->next;
		system("pause");
	}

	return;
}

int main() {
	PCB* front, * rear;
	PCB* head = new PCB();
	front = rear = head;
	cout << "请输入时间片长度" << endl;
	while(cin>>qq){
		//创建链表并初始化数据
		creatList(head);
		//打印链表数据
		print(head);
		cout << "请再次输入时间片长度" << endl;
	}
	
	return 0;
}