本文共 3484 字,大约阅读时间需要 11 分钟。
本实验旨在模拟单处理机环境下的进程调度问题,加深对操作系统核心算法的理解,特别是优先权法和轮转法。
算法描述
简化假设
ready
(就绪)、running
(运行)、finish
(完成)。流程图展示了实验中的主要模块:
以下是基于Python实现的实验代码,用于模拟优先权法和轮转法的调度算法:
import operatorimport randomimport queueclass PCB: def __init__(self, id, status, weight, needTime, rotelTimes): self.id = id self.status = status self.weight = weight self.needTime = needTime self.rotelTimes = rotelTimesdef emptyQueue(Q): while not Q.empty(): Q.get()def priority(): global Q, arr_pcb emptyQueue(Q) arr_pcb.sort(key=operator.attrgetter('weight'), reverse=True) for index, item in enumerate(arr_pcb): if item.needTime > 0: Q.put(item) if index > 0: if item.status != 'finish': item.status = 'ready' if not Q.empty(): node = Q.get() node.needTime -= 1 node.weight -= 3 if node.needTime > 0: node.status = 'running' elif node.needTime == 0: node.status = 'finish'def rotel(): global arr_pcb for a, item in enumerate(arr_pcb): if item.needTime > 0: for b, item2 in enumerate(arr_pcb): if a != b: if item2.status == 'running': item2.status = 'ready' item.status = 'running' for j in range(item.rotelTimes): if item.needTime > 0: item.needTime -= 1 if item.needTime == 0: item.status = 'finish' else: breakN = int(input('请输入需要创建的进程数目(4-8个):'))arr_pcb = []for i in range(N): status = random.randint(1, 10) needTime = random.randint(1, 4) rotelTimes = random.randint(1, 3) arr_pcb.append(PCB(i, 'ready', status, needTime, rotelTimes))key = input('是否采用优先权?Y/N')if key == 'Y': print('进程初始化完毕。') for i in arr_pcb: print(f'进程 {i.id}:{i.status},优先权重 {i.weight},需要时间片 {i.needTime}') priority() while not Q.empty(): priority()elif key == 'N': print('进程初始化完毕。') for i in arr_pcb: print(f'进程 {i.id}:{i.status},轮转次数 {i.rotelTimes},需要时间片 {i.needTime}') flag = 0 for item in arr_pcb: if item.needTime > 0: flag = 1 while flag: rotel()
本实验通过对两种调度算法的深入研究,不仅加深了理论理解,还通过实际编码和调试提升了实践能力,为后续操作系统学习打下了坚实基础。
转载地址:http://rszaz.baihongyu.com/