磁盘寻道算法 Python实现

操作系统模拟之磁盘寻道算法。
文件共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

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值