一、实验过程
1.优先级(抢占式)调度算法
(1)流程图

(2)步骤
①运行当前选择的进程
②修改代表状态的时间值
③获得新的就绪队列
2.轮转法
(1)流程图

(2)步骤
①处理预就绪队列,获得就绪队列
②运行当前选择的进程
③修改代表状态的时间值
④获得新的预就绪队列
二、实验分析与实现
1.优先级(抢占式)调度算法中,均将进程状态分为未到达、就绪中、运行中和已结束四种,分别以0(初始值)、1、2、3四个state值进行标记。


代码:
#优先级(抢占)调度算法-各进程当前状态
def priority_stateshow(processes,current_time,readyrow):
for Process in processes:
if current_time >= Process.arrival_time:
if Process.remaining_time ==0:
Process.state=3
elif Process in readyrow:
if Process is readyrow[0]:
Process.state=2
else:
Process.state=1
priority_stateshow(processes, current_time, readyrow)
print_state(processes, current_time)rotation_stateshow(processes, current_time, readyrow)
print_state(processes, current_time)
不同状态效果展示:

2.在最后一时刻,所有进程应全部结束。调度结果的打印使用同一个函数,只需获取在相应调度结束时的各进程属性。
代码:
printresult(processes)


3.使用random.randian()函数,达到随机生成进程相关属性的目的。其中,为模拟进程号以到达先后为顺序由小到大标注,arrival_time的生成采用random.sample()函数,随进程号i一起被标记为对应进程属性。
代码:
def init_Process():
number = int(input("请输入需要随机生成的进程的个数4~8:"))
processes = []
#arrival_time随机生成,但由小到大,通过此与进程号形成关联
sorted_numbers = sorted(random.sample(range(8), number))
for i in range(number):
processes.append(Process(i, sorted_numbers[i], random.randint(1, 10), random.randint(1, number)))
print("当前生成的进程集processes1为:")
return processes

4.为使两种调度算法使用同一生成的进程集以对比效果,采用了Python的`multiprocessing`模块来创建和管理多个并发执行进程,在此,将优先级调度算法与轮转法看作两个并发的进程。
代码:
manager1 = multiprocessing.Manager()
shared_data1 = manager1.list() # 创建一个共享的列表,用于存储数据
processes1 = init_Process()
init_print(processes1)
p1 = multiprocessing.Process(target=prompt_priority_scheduling, args=(processes1, shared_data1))
p2 = multiprocessing.Process(target=rotation_scheduling, args=(processes1, shared_data1))
p1.start()
p2.start()
p1.join()
p2.join()
实现效果见图6、图7(上)中生成属性的对比。
5.为保证代码的准确性和通用性,采用processes0作为验证进程集,效果如下:



