优先级抢占式调度算法是一种简单的调度算法,规则如下:
1)将进程分为m个优先级,设置m个等待队列,分别对应每一级优先级。
2)每个进程具有三个要素:到达时间,运行所需时长,优先级数(数越大优先级越高)
3)相同优先级的进程,按照先到先服务的原则依次执行。
4)同一时刻中,先将到达的进程都加入队列,再按照优先级进行分配
5)只有当k级队列为空的时候,才会为k-1级队列队首的进程分配时间。
6)进程Pi运行时,如果有优先级更高的进程Pj到达,则立即发生抢占,先执行Pj,并将进程Pi剩余未执行完的部分,重新加入Pi优先级对应的队列末尾,等待继续执行。
编写程序模拟CPU分配计算资源的过程,已知按照到达时间升序排序的进程数据(包含到达时间、运行时长、优先级),计算并输出每个进程最终处理完成的时间。(时间单位均为毫秒)
请回答下列问题:
(1)有4个进程A、B、C、D如表1所示。
进程 | 到达时间 | 运行时长 | 优先级 |
A | 0 | 7 | 1 |
B | 2 | 4 | 2 |
C | 4 | 1 | 3 |
D | 5 | 4 | 2 |
表1
由优先级抢占式调度算法的规则可知,0毫秒时进程A到达并执行;2毫秒时进程B到达,B的优先级高于A,发生抢占,A剩余的5毫秒回到队列1,B开始执行;4毫秒时进程C到达,C的优先级高于B,发生抢占,B剩余的2毫秒回到队列2,C开始执行;则进程D执行完的时刻为
(2)模拟实现优先级抢占式调度算法Python程序如下,请在划线处填入合适的代码。
def insert(p, remain):
data[p][2]=remain #更新进程剩余的运行时间
lvl=data[p][3] #获取p进程的优先级
if queinfo[lvl][0]=-1:
queinfo[lvl][0]=p
if queinfo[lvl][1]!=-1:
data[queinfo[lvl][1]][-1]=p
queinfo[lvl][1]=p
m=int(input('设置优先级的数量m:'))
# 输入列表data存储进程,data中的节点包含信息有[名称,到达时间,运行时长,优先级],
代码略
# 进程已经按到达时间升序排序
#例如:data=[['A',0,7,1],['B',2,4,2],['C',4,1,3],['D',5,4,2]]
for i in range(len(data)):
data[i].append(-1)
queinfo=[[-1, -1] for i in range(m+1)]
insert(0, data[0][2]) #将第1个进程加入队列
time=data[0][1] 0
cnt=1 #所有队列内等待的进程总数
idx=1
lvl=m
while cnt>0:
if queinfo[lvl][0]!=-1:
cur=queinfo[lvl][0]
queinfo[lvl][0]=data[queinfo[lvl][0]][-1]
cnt-=1
while idx < len(data) and time+data[cur][2]>=data[idx][1]:
if lvl >= data[idx][3] or time+data[cur][2]==data[idx][1]:
insert(idx, data[idx][2])
cnt+=1
idx +=1
elif time+data[cur][2]> data[idx][1]:
insert(idx, data[idx][2]) #抢占的进程也先入队
cnt +=1
inset(cur,
cnt +=1
time=data[idx][1]
lvl =data[idx][3]
idx+=1
flag =True
break
if flag==False:
time = time+data[cur][2]
print("时刻", time, ":进程", data[cur][0], "完成")
lvl = m
if
insert (idx, data[idx][2])
cnt +=1
time=data[idx][1]
idx += 1
else:
lvl-=1
if lvl==0:
lvl=m
(3)若将以上程序中insert函数内的加框处代码删除,会导致某些情况下无法得到符合程序功能的结果,下列4组数据中能测试出这一问题的是
同类型试题
y = sin x, x∈R, y∈[–1,1],周期为2π,函数图像以 x = (π/2) + kπ 为对称轴
y = arcsin x, x∈[–1,1], y∈[–π/2,π/2]
sin x = 0 ←→ arcsin x = 0
sin x = 1/2 ←→ arcsin x = π/6
sin x = √2/2 ←→ arcsin x = π/4
sin x = 1 ←→ arcsin x = π/2
y = sin x, x∈R, y∈[–1,1],周期为2π,函数图像以 x = (π/2) + kπ 为对称轴
y = arcsin x, x∈[–1,1], y∈[–π/2,π/2]
sin x = 0 ←→ arcsin x = 0
sin x = 1/2 ←→ arcsin x = π/6
sin x = √2/2 ←→ arcsin x = π/4
sin x = 1 ←→ arcsin x = π/2