时间片轮转进程调度算法
- 实验目的和要求
- 实验内容
- 实验过程
- 数据结构:
- 部分代码:
- 实验结果:
- 分析和讨论
- 完整代码
实验目的和要求
(1) 掌握时间片轮转进程调度的概念和算法
(2) 加深对处理机分配的理解
实验内容
在集成开发环境下使用C++语言利用相应的函数,编写程序实现时间片轮转进程调度算法,学会运行程序和调试程序。具体内容包括:
(1) 初始化各进程相关数据,包括各进程已运行时间、要求运行时间、进程状态(等待、就绪、执行);建立进程链表(要有首、尾指针);
(2) 用类似于表格的形式进行显示,需要打印表头,各个进程之间有表格线分割;
(3) 改变时间片的大小,观察时间片大小对进程调度的影响;
实验过程
程序需要支持如下任务:
- 它必须允许用户指明进程数,时间片长度,进程标识符,进程要求运行的时间。
- 按表格输出进程数据
- 当进程执行完毕后请求用户重新输入时间片长度,并再次要求用户输入进程数据
数据结构:
- 创建链表存储进程数据。
每一个结点存储一个PCB,当输出、修改进程数据时通过指针的移动获取PCB内数据 - 通过creatList()创建建链表并返回链表的头指针
- 通过print()打印所有进程数据,并修改进程状态和运行时间
- 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;
}
实验结果:
分析和讨论
程序要求用户输入数据,并以输入顺序为进程到达顺序,未考虑进程到达时间,可以考虑设计一个整型变量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;
}