Python 磁盘调度算法实现

def loaddata(fileName):     # 读取数据
    f = open(fileName)
    start = f.readline()    # 读入data文件的第一行作为起始磁道
    data = f.readline()     # 依次读入数据作为下一个被访问的磁道号
    return start, data


def loadnext(now, next):    # 输出下一个被访问的磁道号和移动距离
    length = abs(int(now) - int(next))  # 移动距离
    str_length =str(length)
    if len(next) == 3:
        if len(str_length) == 1:
            print("|         ", end="")
            print(next, end="")
            print("         |   ", end="")
            print("    ", end="")
            print(length, end="")
            print("        |")
        elif len(str_length) == 2:
            print("|         ", end="")
            print(next, end="")
            print("         |   ", end="")
            print("    ", end="")
            print(length, end="")
            print("       |")
        else:
            print("|         ", end="")
            print(next, end="")
            print("         |   ", end="")
            print("    ", end="")
            print(length, end="")
            print("      |")
    elif len(next) == 2:
        if len(str_length) == 1:
            print("|          ", end="")
            print(next, end="")
            print("         |   ", end="")
            print("    ", end="")
            print(length, end="")
            print("        |")
        elif len(str_length) == 2:
            print("|          ", end="")
            print(next, end="")
            print("         |   ", end="")
            print("    ", end="")
            print(length, end="")
            print("       |")
        else:
            print("|          ", end="")
            print(next, end="")
            print("         |   ", end="")
            print("    ", end="")
            print(length, end="")
            print("      |")
    elif len(next) == 1:
        if len(str_length) == 1:
            print("|           ", end="")
            print(next, end="")
            print("         |   ", end="")
            print("    ", end="")
            print(length, end="")
            print("        |")
        elif len(str_length) == 2:
            print("|           ", end="")
            print(next, end="")
            print("         |   ", end="")
            print("    ", end="")
            print(length, end="")
            print("       |")
        else:
            print("|           ", end="")
            print(next, end="")
            print("         |   ", end="")
            print("    ", end="")
            print(length, end="")
            print("      |")
    return length


def FCFS():
    l = 0
    start, data = loaddata('data')
    print("|--------------------------------------|")
    print("|  被访问的下一个磁道号  |     移动距离     |")
    print("|--------------------------------------|")
    for d in data.split():
        l += loadnext(start, d)     # 循环输出下一个磁道号和移动距离,并将寻道距离累加
        start = d                   # 将刚访问的磁道作为下次访问的起始磁道
    n = len(data.split())
    print("|--------------------------------------|")
    print("| 先来先服务(FCFS)的平均寻道长度:%.1f      |" % (l / n))
    print("|--------------------------------------|")


def findnextindex(start, datas):    # SSTF算法
    length = []
    for data in datas:
        l = abs(int(start) - int(data))     # 计算磁道间要移动的距离
        length.append(l)                    # 计算的将每个距离放入距离数组
    minIndex = length.index(min(length))    # 在数组中选出最小的距离在数组中位置
    return minIndex


def SSTF():
    l = 0
    start, data = loaddata('data')
    data2 = data.split().copy()
    n = len(data2)
    print("|--------------------------------------|")
    print("|  被访问的下一个磁道号  |     移动距离     |")
    print("|--------------------------------------|")
    for d in data.split():
        nextIndex = findnextindex(start, data2)     # 获取每次的最小寻道距离
        l += loadnext(start, data2[nextIndex])
        start = data2[nextIndex]
        data2.remove(data2[nextIndex])

    print("|--------------------------------------|")
    print("|最短寻道时间优先(SSTF)的平均寻道长度:%.1f  |" % (l / n))
    print("|--------------------------------------|")


def findnext1(now, data):                   # SCAN
    biggerList = []
    smallerList = []
    for d in data:
        if int(d) > int(now):               # 判断初始磁道和下一磁道的大小关系
            biggerList.append(d)            # 如果下一磁道号更大则将其放入大数组中
    if (len(biggerList) == 0):              # 否则则开始寻找比初始磁道小的磁道号
        if len(data) != 0:
            for d2 in data:
                if int(d2) < int(now):
                    smallerList.append(d2)  # 将其加入小数组中
            return max(smallerList)
        else:
            return None
    return min(biggerList)


def SCAN():
    l = 0
    start, data = loaddata('data')
    data2 = data.split().copy()
    print("|--------------------------------------|")
    print("|  被访问的下一个磁道号  |     移动距离     |")
    print("|--------------------------------------|")
    n = len(data2)
    for d in data:
        next = findnext1(start, data2)         #
        if next == None:
            break
        l += loadnext(start, next)
        start = next
        data2.remove(next)
    print("|--------------------------------------|")
    print("|电梯调度算法(SCAN)平均寻道长度:%.1f       |" % (l / n))
    print("|--------------------------------------|")


def findnext2(now, data):               # CSCAN
    biggerList = []
    smallerList = []
    for d in data:
        if int(d) > int(now):
            biggerList.append(d)
    if (len(biggerList) == 0):
        if len(data) != 0:
            now = 0
            return (findnext2(now, data))
        else:
            return None
    return min(biggerList)


def CSCAN():
    l = 0
    start, data = loaddata('data')
    data2 = data.split().copy()
    n = len(data2)
    print("|--------------------------------------|")
    print("|  被访问的下一个磁道号  |     移动距离     |")
    print("|--------------------------------------|")
    for d in data:
        next = findnext2(start, data2)
        if next == None:
            break
        l += loadnext(start, next)
        start = next
        data2.remove(next)
    print("|--------------------------------------|")
    print("|循环扫描算法(CSCAN)平均寻道长度:%.1f      |" % (l / n))
    print("|--------------------------------------|")


def main():
    num4 = int(input("恢复原磁道(1、是;0、否):"))
    if num4 == 1:
        filename = 'data'
        with open(filename, 'w') as f:
            first = "100"
            second = "55 58 39 18 90 160 150 38 184"
            f.write(first)
            f.write("\n")
            f.write(second)
    else:
        print("")
    start, data = loaddata('data')
    print("|------------磁盘调度算法程序-------------|")
    print("|------1、先来先服务      (FCFS )算法-----|")
    print("|------2、最短寻道时间优先 (SSTF )算法-----|")
    print("|------3、电梯调度        (SCAN )算法-----|")
    print("|------4、循环扫描算法     (CSCAN)算法-----|")
    print("|---------------------------------------|")
    print("初始磁道为:" + start + data)
    num = int(input("请选择要使用的调度算法(1~4):"))
    if num == 1:
        FCFS()
    elif num == 2:
        SSTF()
    elif num == 3:
        SCAN()
    elif num == 4:
        CSCAN()
    else:
        num1 = int(input("您没有做出选择,是否需要指定访问的磁道?(1:是 0:否)"))
        if num1 == 1:
            # 100
            # 55 58 39 18 90 160 150 38 184
            print("原磁道顺序为:100 \n"+"55 58 39 18 90 160 150 38 184")
            filename = 'data'
            with open(filename, 'w') as f:
                first = int(input("请输入初始访问磁道:"))
                second = input("请输入被访问的下一个磁道号序列(用空格分开):")
                f.write(str(first))
                f.write("\n")
                f.write(str(second))

        else:
            num3 = int(input("是否选择关闭程序?(1:是 0:否)"))
            if num3 == 1 :
                print("程序结束!谢谢使用。")
                exit()
            elif num3 == 0:
                main()
            else:
                print("选择错误!")
                main()
    num2 = int(input("是否继续选择?(1:是 0:否,关闭程序)"))
    if num2 == 1:
        main()
    elif num2 == 0:
        print("程序结束!谢谢使用。")
        exit()
    else:
        print("选择错误!")
        main()


if __name__ == "__main__":
    main()

你可能感兴趣的:(Python 磁盘调度算法实现)