进程调度之动态优先权算法

首先,我们要了解动态优先权算法。

举一个例子:

进程名 到达时间 运行时间 优先数
A 0 4 5
B 2 2 3
C 3 5 4
D 5 2 6

其中优先数越大优先权越高,每运行一个时间片优先数减3。

既然要模拟动态优先权算法,每个进程的到达时间,运行时间和优先数都应该是随机的,并且满足一些条件:

  1. 到达时间大于等于0
  2. 运行时间大于等于1
  3. 优先数之间的差值与优先数动态调整的数值之间要适当
  • 若优先数动态调整的数值远大于优先数之间的差值,则动态优先权算法变成时间片轮转算法
  • 若优先数之间的差值远大于优先数动态调整的数值,则动态优先权算法变成先来先服务算法

按理来说应该是先随机出各进程的优先数,再根据优先数之间的差值决定优先数动态调整的数值。
但是为了模拟方便,我们可以先决定优先数动态调整的数值,将其作为参数,再由这个参数随机出各进程的优先数。此段内容对应:

pcs[i].setPriorityValue(dynamicLevel);// 保证动态调整的值合理
运行结果是怎样的

我想创建一个int数组,其中每个元素对应一个时间片,表示该时间片是哪个进程正在运行。
得到这样一个数组之后,其它信息都可以由它推出。

int数组的长度是总时间,总时间为进程需求时间的累加。
对吗?

在整个过程中,总会出现某个时间片内没有进程运行的情况,比如进程最早到达时间是3,那么前3个时间片(如有疑义见显示的统一化)就是没有进程运行的。
所以在程序里需要计算“真正的”总时间。

由于“真正的”总时间需要遍历得到,得到总时间之后才可以创建数组再次遍历计算,所以这一部分相当于遍历了两次。

第一次:

for (int nowTime = 0; nowTime < allTime; nowTime++) {
   
			boolean isPosZero = true;
			for (int i = 0; i < n; i++) {
   
				if (pcs[i].timeCost > 0 && nowTime >= pcs[i].arriveTime) {
   
					isPosZero = false;
				}
			}
			if (isPosZero) {
   
				allTime++;
			}
		}

第二次:

for (int nowTime = 0; nowTime < allTime; nowTime++) {
   
			int pos = -1;
			int compare = -dynamicLevel * (nowTime);// 假设初始优先权为正,优先权可以减至负数,该式保证compare的值始终最小
			for (int i = 0; i < n; i++) {
   
				if (pcs[i].timeCost > 0 && nowTime >= pcs[i].arriveTime) {
   
					if (compare < pcs[i].priorityValue) {
   
			
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qlanBy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值