操作系统模拟之磁盘寻道算法。
文件共1份,代码如下:
import math
import random
import copydef alo_fcfs():print("您选择了FCFS算法,执行结果如下:")print("当前磁道号 下一磁道号 绝对差")print('{:6d}{:10d}{:8d}'.format(start_numer, disk_queue[0], abs(start_numer - disk_queue[0])))sum_distance = abs(start_numer - disk_queue[0])for i in range(disk_queue_length - 1):sum_distance = sum_distance + abs(disk_queue[i] - disk_queue[i + 1])print('{:6d}{:10d}{:8d}'.format(disk_queue[i], disk_queue[i + 1], abs(disk_queue[i] - disk_queue[i + 1])))print('{:6d} {} {}'.format(disk_queue[i], "None", "None"))print('寻道序列总长{:d},FCFS算法的平均寻道长度为{:.2f}'.format(sum_distance, sum_distance / (disk_queue_length + 1)))def alo_sstf():print("您选择了SSTF算法,执行结果如下:")print("当前磁道号 下一磁道号 绝对差")sum_distance = 0last_number = start_numertemp_queue = copy.deepcopy(disk_queue)while len(temp_queue) > 0:index = 0min_diff = 0x3f3f3f3ffor i in range(len(temp_queue)):if abs(temp_queue[i] - last_number) < min_diff:index = imin_diff = abs(temp_queue[i] - last_number)print('{:6d}{:10d}{:8d}'.format(last_number, temp_queue[index], min_diff))last_number = temp_queue[index]sum_distance = sum_distance + min_difftemp_queue.pop(index)print('{:6d} {} {}'.format(last_number, "None", "None"))print('寻道序列总长{:d},SSTF算法的平均寻道长度为{:.2f}'.format(sum_distance, sum_distance / (disk_queue_length + 1)))def cal(temp_queue, start_number, index, left1, left2, right1, right2, step1, step2):last_number = start_numberprint('{:6d}{:10d}{:8d}'.format(last_number, temp_queue[index], abs(last_number - temp_queue[index])))sum_distance = abs(last_number - temp_queue[index])last_number = temp_queue[index]for j in range(left1, right1, step1):print('{:6d}{:10d}{:8d}'.format(last_number, temp_queue[j], abs(last_number - temp_queue[j])))sum_distance = sum_distance + abs(last_number - temp_queue[j])last_number = temp_queue[j]for j in range(left2, right2, step2):print('{:6d}{:10d}{:8d}'.format(last_number, temp_queue[j], abs(last_number - temp_queue[j])))sum_distance = sum_distance + abs(last_number - temp_queue[j])last_number = temp_queue[j]print('{:6d} {} {}'.format(last_number, "None", "None"))print('寻道序列总长{:d},FCFS算法的平均寻道长度为{:.2f}'.format(sum_distance, sum_distance / (disk_queue_length + 1)))def alo_scan():print("您选择了SCAN算法,执行结果如下:")print("请继续选择当前磁头运动方向")print("由低到高请输入1")print("由高到低请输入2")last_number = start_numerdirection_choice = int(input())temp_queue = copy.deepcopy(disk_queue)temp_queue.sort()print()print("当前磁道号 下一磁道号 绝对差")if direction_choice == 1:for j in temp_queue:if j > start_numer:index = temp_queue.index(j)breakcal(temp_queue, start_numer, index, index + 1, index - 1, disk_queue_length, -1, 1, -1)elif direction_choice == 2:for j in range(disk_queue_length - 1, -1, -1):if temp_queue[j] < start_numer:index = jbreakcal(temp_queue, start_numer, index, index - 1, index + 1, -1, disk_queue_length, -1, 1)def alo_cscan():print("您选择了CSCAN算法,执行结果如下:")print("请继续选择当前磁头运动方向")print("由低到高请输入1")print("由高到低请输入2")last_number = start_numerdirection_choice = int(input())temp_queue = copy.deepcopy(disk_queue)temp_queue.sort()print()print("当前磁道号 下一磁道号 绝对差")if direction_choice == 1:for j in temp_queue:if j > start_numer:index = temp_queue.index(j)breakcal(temp_queue, start_numer, index, index + 1, 0, disk_queue_length, index, 1, 1)elif direction_choice == 2:for j in range(disk_queue_length - 1, -1, -1):if temp_queue[j] < start_numer:index = jbreakcal(temp_queue, start_numer, index, index - 1, disk_queue_length - 1, -1, index, -1, -1)if __name__ == "__main__":print("欢迎进入操作系统演示之磁盘寻道算法")print("现在开始数据初始化")print("请输入磁盘寻道序列长度(10-20,含端点):")disk_queue_length = int(input())if 10 <= disk_queue_length <= 20:print("输入成功!")else:print("您输入的磁盘寻道序列长度超出给定范围,请重新输入10-20(含端点)的数字:")print("请输入磁盘寻道序列长度(10-20,含端点):")disk_queue_length = int(input())disk_queue = []for k in range(disk_queue_length):disk_queue.append(random.randint(0, 200))start_numer = random.randint(0, 200)print()print('生成的磁盘寻道序列为:{}'.format(disk_queue))while True:print()print("请选择要执行的磁盘寻道算法:")print("选择FCFS请输入1")print("选择SSTF请输入2")print("选择SCAN请输入3")print("选择CSCAN请输入4")menu_choice = int(input())if menu_choice == 1:alo_fcfs()elif menu_choice == 2:alo_sstf()elif menu_choice == 3:alo_scan()elif menu_choice == 4:alo_cscan()else:print("您选择的不在范围内,请重新输入")print()continueprint()print("继续尝试其他算法请输入1")print("更新数据请输入2")print("结束程序请输入3")end_choice = int(input())if end_choice == 1:continueelif end_choice == 2:print("现在开始更新数据")print("请输入更新的磁盘寻道序列长度(10-20,含端点):")disk_queue_length = int(input())if 10 <= disk_queue_length <= 20:print("更新成功!")else:print("您输入的磁盘寻道序列长度超出给定范围,请重新输入10-20(含端点)的数字:")print("请输入磁盘寻道序列长度(10-20,含端点):")disk_queue_length = int(input())disk_queue = []for k in range(disk_queue_length):disk_queue.append(random.randint(0, 200))print()print('更新的磁盘寻道序列为:{}'.format(disk_queue))start_numer = random.randint(0, 200)else:print("程序退出成功!")break