广州大学操作系统课程设计时间片轮转法实现处理机调度的程序

本文档详细介绍了如何使用C++实现一个基于时间片轮转法的处理机调度程序。程序通过模拟进程的随机生成、到达时间和运行时间,展示了就绪队列的管理,包括进程的入队、出队和状态更新。在每次时间片结束时,程序会检查是否有新进程到达,并处理当前运行进程。实验结果分析了调度过程,并讨论了程序设计和实现中的关键点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

进程的id,到达时间,运行时间都是随机生成的
需要注意的是:在时间片轮转法中,假设n时刻就绪队列为 头->:‘C’ ‘N’ <-尾,n时刻就绪队列首部的进程C运行一个时间片且C未运行完,下一时刻进程A到达就绪队列,则就绪队列的排序应该是:N A C。也就是说,当前时刻到达的进程应该排在上一时刻没有运行完重新回到就绪队列排队的进程的前面
没有使用标准模板库queue容器(老师不给),sum一开始设置为9,后面改成了5


一、课程设计题目及内容

设计一个按照时间片轮转法实现处理机调度的程序
时间片轮转法实现处理机调度的程序设计提示如下:
(1)假设系统有n个进程,每个进程用一个进程控制块(PCB)来代表。进程控制块的格式如下表所示,且参数意义也相同。

进程控制块格式
进程名
链接指针
到达时间
估计运行时间
进程状态

(2)按照进程到达的先后顺序排成一个循环队列,设一个队首指针指向第一个到达进程的首址。另外再设一个当前运行进程指针,指向当前正运行的进程。
(3)执行处理机调度时,首先选择队首的第一个进程运行。
(4)由于本题目是模拟实验,所以对被选中的进程并不实际启动运行,而只是执行如下操作:
1)估计运行时间减1;
2)输出当前运行进程的名字。
用这两个操作来模拟进程的一次运行。
(5)进程运行一次后,以后的调度则将当前指针依次下移一个位置,指向下一个进程,即调整当前运行指针指向该进程的链接指针所指进程,以指示应运行进程,同时还应判断该进程的剩余运行时间是否为0,若不为0,则等待下一轮的运行,若该进程的剩余运行时间为0,则将该进程的状态置为完成状态“C”,并退出循环队列。
(6)若就绪队列不为空,则重复上述的步骤(4)和(5)直到所有进程都运行完为止。
(7)在所设计的调度程序中,应包含显示或打印语句,以便显示或打印每次选中进程的名称及运行一次后队列的变化情况。

二、实验源代码

代码如下:

#include<iostream>
#include<time.h>
#include<iomanip>
using namespace std;
typedef struct PCB
{
   
	int name;//进程名(id)
	struct PCB* next;//指针
	int ta;//到达时间
	int tw;//工作时间
	int state;//完成状态(完成为1,未完成为0)
}PCB, * PCBptr;
typedef struct
{
   
	PCBptr front;
	PCBptr rear;
}LinkQueue;
void print(LinkQueue& Q)
{
   
	auto p = Q.front->next;
	cout << "name" << setw(6) << "ta" << setw(6) << "tw" << endl;
	while (p != NULL)
	{
   
		cout << p->name << setw(8) << p->ta << setw(8) << p->tw << endl;
		p = p->next;
	}
}
void InitQueue(LinkQueue& Q)
{
   
	Q.front = Q.rear = new PCB;
	Q.front->next = NULL;
}
int DeQueue(LinkQueue& Q)
{
   
	if (Q.front == Q.rear)return 0;
	auto p = Q.front->next;
	Q.front->next = p->next;
	if (Q.rear == p)Q.rear = Q.front;
	delete p;
	return 1;
}

void EnQueue(LinkQueue& Q, PCB e)
{
   
	PCBptr p;
	p = new PCB;
	p->name 
[提示] (1)假定系统有五个进程,每一个进程用一个进程控制块PCB来代表。进程控制块的格式为: 进程名 指针 要求运行时间 已运行时间 状态 其中,进程名----作为进程的标识,假设五个进程的进程名分别是Q1,Q2,Q3,Q4,Q5。 指针----进程按顺序排成循环队列,用指针指出下一个进程的进程控制块首地址,最后一个进程中的指针指出第一个进程的进程控制块首地址。 要求运行时间----假设进程需要运行的单位时间数。 已运行时间----假设进程已经运行的单位时间数,初始值为“0”。 状态----有两种状态,“就绪”状态和“结束”状态,初始状态都为“就绪”,用“R”表示,当一个进程运行结束后,它的状态变为“结束”,用“E”表示。 (2)每次运行你所设计的处理器调度程序之前,为每个进程任意确定它的“要求运行时间”。 把五个进程按顺序排成循环队列,用指针指出队列连接情况。另用一标志单元记录轮到运行的进程。 (3)处理器调度总是选择标志单元指示的进程运行。由于本实验是模拟处理器调度的功能,所以,对被选中的进程并不实际启动运行,而是执行: 已运行时间-1 来模拟进程的一次运行,表示进程已经运行过一个单位的时间。 请注意:在实际的系统中,当一个进程被选中运行时,必须置上该进程可以运行的时间片值,以及恢复进程的现场,让它占有处理器运行,直到出现等待事件或运行满一个时间片。在这里省去了这些工作,仅用“已运行时间+1”来表示进程已经运行满一个时间片。 (4)进程运行一次后,应把该进程的进程控制块中的指针值送到标志单元,以指示下一个轮到运行的进程。同时,应判断该进程的要求运行时间与已运行时间,若该进程要求运行时间≠已运行时间,则表示它尚未执行结束,应待到下一轮时再运行。若该进程的要求运行时间=已运行时间,则表示它已经执行结束,应把它的状态修改为“结束”(E)且退出队列。此时,应把该进程的进程控制块中的指针值送到前面一个进程的指针位置。 (5)若“就绪”状态的进程队列不为空,则重复上面(4)和(5)的步骤,直到所有进程都成为“结束”状态。 (6)在所设计的称序中应有显示或打印语句,能显示或打印每次被选中进程的进程名以及运行一次后进称对列的变化。 (7)为五个进程任意确定一组“要求运行时间”,启动所设计的处理器调度程序,显示或打印逐次被选中进程的进程名以及进程控制块的动态变化过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值