编写完整的磁盘调度算法,以输入0结束
时间: 2024-03-09 16:49:40 浏览: 17
好的,这里提供一个实现了多种磁盘调度算法的完整 Python 代码,包括先来先服务算法(FCFS)、最短寻道时间算法(SSTF)、电梯调度算法(SCAN)、C-SCAN 算法和 LOOK 算法。您可以按照提示输入磁盘请求序列和起始位置,然后选择要使用的算法进行计算。
```
# 磁盘调度算法
import sys
# 先来先服务算法(FCFS)
def fcfs(requests, start):
total = 0
for i in range(len(requests)):
total += abs(requests[i] - start)
start = requests[i]
return total
# 最短寻道时间算法(SSTF)
def sstf(requests, start):
total = 0
while len(requests) > 0:
nearest = min(requests, key=lambda x: abs(x - start))
total += abs(nearest - start)
start = nearest
requests.remove(nearest)
return total
# 电梯调度算法(SCAN)
def scan(requests, start, direction):
total = 0
requests = sorted(requests)
while len(requests) > 0:
if direction == 'right':
next_request = min([r for r in requests if r >= start] + [max(requests)])
else:
next_request = max([r for r in requests if r <= start] + [min(requests)])
total += abs(next_request - start)
start = next_request
requests.remove(next_request)
return total
# 循环扫描算法(C-SCAN)
def cscan(requests, start):
total = 0
requests = sorted(requests)
idx = requests.index(start)
while len(requests) > 0:
total += abs(requests[idx] - start)
start = requests[idx]
requests.pop(idx)
if len(requests) == 0:
break
elif idx == len(requests):
idx = 0
if requests[idx] < start:
total += abs(requests[idx] - start)
start = requests[idx]
idx += 1
elif requests[idx] > start:
total += abs(requests[idx] - start)
start = requests[idx]
idx = 0
return total
# LOOK 算法
def look(requests, start, direction):
total = 0
requests = sorted(requests)
while len(requests) > 0:
if direction == 'right':
next_request = min([r for r in requests if r >= start] + [max(requests)])
else:
next_request = max([r for r in requests if r <= start] + [min(requests)])
total += abs(next_request - start)
start = next_request
requests.remove(next_request)
if len(requests) == 0:
break
elif direction == 'right' and max(requests) < start:
direction = 'left'
elif direction == 'left' and min(requests) > start:
direction = 'right'
return total
# 主函数
if __name__ == '__main__':
# 输入磁盘请求序列
requests = []
while True:
request = input('请输入磁盘请求序列(输入0结束):')
if request == '0':
break
requests.append(int(request))
# 输入起始位置
start = int(input('请输入磁头的起始位置:'))
# 选择算法
while True:
print('请选择要使用的算法(输入算法名称或编号):')
print('1. 先来先服务算法(FCFS)')
print('2. 最短寻道时间算法(SSTF)')
print('3. 电梯调度算法(SCAN)')
print('4. 循环扫描算法(C-SCAN)')
print('5. LOOK 算法')
print('0. 退出')
choice = input()
if choice == '1' or choice == 'FCFS':
distance = fcfs(requests, start)
print('FCFS 算法的移动距离为:', distance)
elif choice == '2' or choice == 'SSTF':
distance = sstf(requests, start)
print('SSTF 算法的移动距离为:', distance)
elif choice == '3' or choice == 'SCAN':
direction = input('请输入磁头的初始移动方向(left 或 right):')
distance = scan(requests, start, direction)
print('SCAN 算法的移动距离为:', distance)
elif choice == '4' or choice == 'C-SCAN':
distance = cscan(requests, start)
print('C-SCAN 算法的移动距离为:', distance)
elif choice == '5' or choice == 'LOOK':
direction = input('请输入磁头的初始移动方向(left 或 right):')
distance = look(requests, start, direction)
print('LOOK 算法的移动距离为:', distance)
elif choice == '0':
sys.exit()
else:
print('输入有误,请重新输入。')
```
希望这份代码能够满足您的需求。