一、 设计一个有N个进程其行的进程调度算法。
进程调度算法:采用最高优先数的调度算法(即把处理机分配给优先数最高的进程)。
每个进程有一个进程控制块(PCB)表示。进程控制块可以包含如下信息:进程名、优先数、到达时间、需要运行时间、已用CPU时间、进程状态等等。
进程的优先数及需要的运行时间可以事先人为的指定(也可以由随机数产生)。进程的到达时间为进程的输入的时间。
进程的运行时间以时间片为单位进行计算。
每个进程的状态可以是就绪W(Wait)、运行R(Run)、或完成F(Finish)三种状态之一。
就绪进程获得CPU后都只能运行一个时间片。用已占用CPU时间加1表示。
如果运行一个时间片后,进程的已占用CPU时间已达到所需要的运行时间,则撤销该进程,如果运行一个时间片后,进程的已占用CPU时间还未达到所需要的运行时间,也就是进程还需要继续运行,此时应该将进程的优先数减1(即降低一级),然后把它插入就绪队列等待CPU。
每进行一次调度程序都打印一次运行进程、就绪队列、以及各个进程的PCB,以便进行检查。
重复以上过程,直到所要的进程都完成为止。
分析:
使用固定队列与静动态优先级结合每个优先级为0~0xFF,并且以小的数字为高优先级,大的数字为低优先级,
每次皆使用循环得到最高优先级的进程并执行,然后将其动态优先级设置为最低,并将其他进程动态优先级提高,
以使得每个进程都有机会运行。进程的优先级与运行时间由随机数产生
'''
进程调度模拟代码
'''
import random
# 定义状态变量
WAIT= 1
RUN = 2
FINISH = 3
# 定义进程数目
process_number = 5
# 进程类PCB
class PCB:
def __init__(self):
#进程的名字 创建问题,不可以重复
self.progress_id = random.randint(1000, 9999)
#进程的静态优先级
self.static_priority =random.randint(0,4)
#进程的动态优先级
self.dynamic_priority = 255
#进程的到达时间
self.come_time = 0
#进程需要的运行的时间
self.need_time = random.randint(1,10)
#已用CPU时间
self.hold_time = 0
#进程的状态 W Wait R Run F Finish
self.status = WAIT
#打印PCB信息
def __str__(self):
return str(self.progress_id) + "\t"+str(self.status) + "\t\t\t" + \
str(self.hold_time) + "\t\t" + str(self.need_time) + "\t\t\t"+ \
str(self.come_time)+"\t\t\t"+str(self.static_priority)+"\t\t"+ \
str(self.dynamic_priority)
class process:
def __init__(self):
# 未完成的进程队列
self.queue = []
# 已完成的进程列表
self.finish_queue =[]
# 初始化
self.init_process()
# 进行模拟
self.run_process()
# python list sort 函数自定义比较属性 选择静动态优先级结合的方法来确定优先级
def compare_attribute(self,a):
return a.static_priority + a.dynamic_priority
# 初始化进程队列
def init_process(self):
print("初始化队列进程信息:")
for i in range(0,process_number):
# 将构建的每个进程加进队列之中
self.queue.append(PCB())
# 对队列进行排序,排序准则为静动态优先级结合的方法来确定优先级
self.queue.sort(key = self.compare_attribute)
#打印各个进程的信息
self.print_process()
# 静动态优先级结合进程调度算法
def run_process(self):
time = 1
flag = True
# 之前对队列进行了排序,队列最前面就是优先级最高的进程
while flag:
for i in range(0,len(self.queue)):
# 优先级最高的进程
if i == 0:
# 修改进程状态
self.queue[0].status = RUN
# 进程需要运行的时间减一
self.queue[0].need_time -= 1
# 进程以运行的时间加一
self.queue[0].hold_time += 1
else:
# 其他进程的动态优先级减一
self.queue[i].dynamic_priority -= 1
# 输出当前时间片
print("时间为"+str(time)+"时的状态为:")
time += 1
#打印进程信息
self.print_process()
# 判断进程是否执行完毕
if self.queue[0].need_time != 0:
# 没执行完,重置进程状态为 WAIT
self.queue[0].status = WAIT
else:
# 执行完的进程,将进程状态置为 FINISH ,并从未完成的队列中移除
self.queue[0].status = FINISH
# 将已完成的进程加入完成队列之中
self.finish_queue.append(self.queue.pop(0))
# 重新对未完成的进程队列进行排序
self.queue.sort(key = self.compare_attribute)
# 如果未完成的队列为空,则所有队列已完成调度,退出调度
if len(self.queue) ==0:
flag =False
# 输出所有进程最后的状态
print("最终状态为:")
self.print_process()
# 打印进程信息
def print_process(self):
print("进程号\t状态\t已用时间\t需要时间\t开始时间\t静优先级\t动优先级")
# 打印未完成队列进程
for i in range(0,len(self.queue)):
print(self.queue[i])
# 打印已完成调度的队列进程
for j in range(0,len(self.finish_queue)):
print(self.finish_queue[j])
print("==================================================================")
if __name__ == "__main__":
test = process()