操作系统实验-使用动态优先权的进程调度算法的模拟-设计型

1.实验目的

通过动态优先权算法的模拟加深进程概念和进程调度过程的理解,并学习撰写规范的科学研究报告。

2.实验内容和要求

1.对N个进程采用动态优先权算法的进程调度;
2.每个用来标识进程的进程控制块PCB用结构描述,包括以下字段:进程标识数ID,进程优先数PRIORITY,进程以占用的CPU时间CPUTIME,进程还需占用的CPU时间ALLTIME,进程状态STATE等。
3.优先数改变的原则:进程在就绪队列中呆一个时间片,优先数增加1,进程每运行一个时间片优先数减3。
4.设置调度前的初始状态。
5.将每个时间片内的进程情况显示出来。

3.流程图

在这里插入图片描述

4.源程序

5.实验步骤与调试

1.定义Process结构体

struct Process{
	int id;
	int priority;
	int cputime;//程序已经占用的cpu时间
	int alltime;//程序还需要占用的cpu时间
	int startblock;//程序运行超过startblock时间片后进入阻塞状态
	int blocktime;//程序再等待blocktime时间片后从block状态进入ready状态
	State state;//定义枚举数组,enum State{ready,block,done};
};

2.定义print()函数
print()函数要输出的有:当前时间片内的ready进程队列、block进程队列、每个进程的PCB字段。

void print(){
	cout<<"ready queue:";
	for(int i=0;i<3;i++){
		if(ready==process[i].state)
		{
			cout<<"->"<<process[i].id;	
		}
	}
	
	cout<<endl;
	cout<<"blocked queue:"<<endl;
	for(int i=0;i<3;i++)
	{
		if(block==process[i].state)
		{
			cout<<"->"<<process[i].id;
		}
	}
	cout<<endl;
	cout<<"id |\t priority |\t cputime |\t alltime |\t startblock |\t blocktime |\t state"<<endl;
	for(int i=0;i<3;i++)
	{
		cout<<process[i].id<<"|"<<"\t\t"<<process[i].priority<<"|"<<"\t\t"<<process[i].cputime<<"|"<<"\t\t"<<process[i].alltime<<"|"<<"\t\t"<<process[i].startblock<<"|"<<"\t\t"<<process[i].blocktime<<"|"<<"\t\t"<<process[i].state<<endl;
	}
}

3.定义main()函数
main()函数中,首先给出三个进程的PCB字段信息,即定义process0、1、2。
初始时间片slicetime设置为0,当有进程的process.alltime不为0,即还有进程需要占用CPU,则执行while循环。用array[]数组来保存各个进程的优先级,用max_element(array,array+3)来返回最大优先级对应的process地址。每次循环找优先级最高的进程,执行后该进程优先级-3,其余ready状态进程优先级+1。其他PCB信息也随之改变。print()函数输出此时间片的各进程信息,进入下一个时间片。程序执行到所有进程的alltime为0结束。

4.初始状态三个进程的PCB信息
在这里插入图片描述

程序运行过程中遇到的问题
刚开始运行程序的时候,发现每一个时间片都输出了3次,然后每一次只改变了1个进程的PCB信息,但是理想输出应该是每个时间片输出1次,每次输出3个进程的PCB改变信息,后面调试发现,print()函数在循环中的位置放错了,改正后程序运行的时间片数slicetimes 为6,而3个进程的alltime总和也为6,符合预期。

运行结果
在这里插入图片描述

  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值