操作系统实验-基于优先数的时间片轮转调度算法调度处理器

#include "pch.h"
#include <iostream>
#include "stdio.h"
#include "string.h" 
#define num 3//假定系统中进程个数为5
using namespace std;
struct PCB
{
	char ID;//进程名
	int runtime;//要求运行时间
	int pri;//优先数
	char state; //状态,R-就绪,F-结束
};
struct PCB  pcblist[num];//定义进程控制块数组
int max_pri_process(int key)//确定最大优先级进程子程序
{
	int min = pcblist[key].pri;
	int i = 0, j = 0;
	int key1 = 0;
	if (pcblist[key].runtime<=0)
	{
		min = 999999;
		for (int i = 0; i < num; i++)
		{
			if (pcblist[i].pri <= min && pcblist[i].state == 'R') {
				key1 = i;
				min = pcblist[i].pri;
			}
			if (pcblist[i].state == 'F') {
				j = j + 1;
			}
		}
	}
	else
	{
		for (i = 0; i < num; i++) {
			if (pcblist[i].pri <= min && pcblist[i].state == 'R') {
				key1 = i;
				min = pcblist[i].pri;
			}
			if (pcblist[i].state == 'F') {
				j = j + 1;
			}
		}
	}
	if (j >= num) {
		return -1;
	}
	else {
		pcblist[key1].pri++;
		pcblist[key1].runtime--;
		return key1;
	}
}
void show()//显示子程序

{
	int i;
	printf("\n 进程名 优先数 要求运行时间 状态 \n");
	printf("-------------------------------------------------\n");
	for (i = 0; i < num; i++)//依次显示每个进程的名、优先数、要求运行时间和状态
	{
		printf("%6s%8d%8d%8s\n", &pcblist[i].ID, pcblist[i].pri, pcblist[i].runtime, &pcblist[i].state);
	}
	printf(" pressany key to continue...\n");

}
void update(int key) {
	for (int i = 0; i < num; i++)
	{
		if (pcblist[i].runtime <= 0)
		{
			pcblist[i].state = 'F';
		}
		else
		{
			pcblist[i].state = 'R';
		}
	}
	show();
	int addr = max_pri_process(key);
	if (addr == -1)
	{
		return;
	}
	else
	{
		update(addr);
	}
}
void  init()//PCB初始化子程序
{
	int i;
	for (i = 0; i < num; i++)

	{
		printf("PCB[%d]:进程名 优先数 要求运行时间 \n", i + 1);//为每个进程任意指定pri和runtime
		cin >> pcblist[i].ID;
		cin >> pcblist[i].pri;
		cin >> pcblist[i].runtime;
		pcblist[i].state = 'R';//进程初始状态均为就绪
		getchar();//接收回车符
	}

	int key = max_pri_process(0);
	update(key);
	getchar();
}
int main()//按动态优先数调度主程序
{
	init();
}


1、设计一个程序实现基于优先时间片轮转调度算法调度处理器。 2、假定系统有5个进程,每个进程用一个进程控制块PCB开代表,进程控制块的结构 /*例如一组进程如下表: 进程名 A B C D E F G H J K L M 到达时间 0 1 2 3 6 8 12 12 12 18 25 25 服务时间 6 4 10 5 1 2 5 10 4 3 15 8 */ PCB:进程名 指针 到达时间 要求运行时间 已运行时间 优先 进程状态 其中: 进程名:作为进程的标识。 指针:进程按顺序排成循环链表,用指针指出下一个进程的进程控制块首地址,最后一个进程中的指针指出第一个进程的进程控制块首地址。 要求运行时间:假设进程需要运行的单位时间。 已运行时间:假设进程已经运行的单位时间,初值为0。 状态:可假设有两种状态,就绪状态和结束状态。进程的初始状态都为就绪状态。 3、每次运行所设计的处理器调度程序调度进程之前,为每个进程任意确定它的要求运行时间。 4、此程序是模拟处理器调度,因此,被选中的进程并不实际启动运行,而是执行 已运行时间+1 来模拟进程的一次运行,表示进程已经运行过一个单位时间。 .5、在所设计的程序中应有显示或打印语句,能显示或打印每次被选中的进程名以及运行一次后进程队列的变化。 6、为进程任意确定要求运行时间,运行所设计的处理器调度程序,显示或打印逐次被选中进程的进程名以及进程控制块的动态变化过程。 7、设有一个就绪队列,就绪进程按优先优先范围0-100)由小到大排列(优先越小,级别越高)。当某一进程运行完一个时间片后,其优先级应下调(如优先加2或3)。
第二题[提示] (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、付费专栏及课程。

余额充值