操作系统模拟之磁盘寻道算法。
文件共1份,代码如下:
import math
import random
import copy
def 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 = 0
last_number = start_numer
temp_queue = copy.deepcopy(disk_queue)
while len(temp_queue) > 0:
index = 0
min_diff = 0x3f3f3f3f
for i in range(len(temp_queue)):
if abs(temp_queue[i] - last_number) < min_diff:
index = i
min_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_diff
temp_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_number
print('{: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_numer
direction_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)
break
cal(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 = j
break
cal(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_numer
direction_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)
break
cal(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 = j
break
cal(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()
continue
print()
print("继续尝试其他算法请输入1")
print("更新数据请输入2")
print("结束程序请输入3")
end_choice = int(input())
if end_choice == 1:
continue
elif 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