磁盘调度算法(OS实验)

有以下四种算法

 FCFS

SSTF

SCAN

CSCAN

四种算法

def read_requests(file_path):
    """从文件中读取磁盘请求序列和当前磁头位置"""
    with open(file_path, 'r') as file:
        lines = file.readlines()
        requests = list(map(int, lines[0].strip().split(',')))
        current_head = int(lines[1].strip())
    return requests, current_head


def fcfs(requests, current_head):
    """先来先服务 (FCFS)"""
    total_seek_time = 0
    print("磁盘请求序列:", requests)
    print("当前磁头位置:", current_head)

    for req in requests:
        total_seek_time += abs(current_head - req)
        current_head = req

    average_seek_time = total_seek_time / len(requests)
    print("磁盘扫描序列:", requests)
    print("总寻道时间:", total_seek_time)
    print("平均寻道时间:", average_seek_time)


def sstf(requests, current_head):
    """最短寻道时间优先 (SSTF)"""
    total_seek_time = 0
    sequence = []
    remaining = requests[:]

    print("磁盘请求序列:", requests)
    print("当前磁头位置:", current_head)

    while remaining:
        closest = min(remaining, key=lambda x: abs(x - current_head))
        total_seek_time += abs(current_head - closest)
        current_head = closest
        sequence.append(closest)
        remaining.remove(closest)

    average_seek_time = total_seek_time / len(requests)
    print("磁盘扫描序列:", sequence)
    print("总寻道时间:", total_seek_time)
    print("平均寻道时间:", average_seek_time)


def scan(requests, current_head, direction):
    """扫描调度 (SCAN)"""
    requests.sort()
    total_seek_time = 0
    sequence = []

    print("磁盘请求序列:", requests)
    print("当前磁头位置:", current_head)
    print("扫描方向:", "向外" if direction == 1 else "向内")

    if direction == 1:  # 向外扫描
        right = [req for req in requests if req >= current_head]
        left = [req for req in requests if req < current_head]
        sequence = right + left[::-1]
    else:  # 向内扫描
        left = [req for req in requests if req <= current_head]
        right = [req for req in requests if req > current_head]
        sequence = left[::-1] + right

    total_seek_time = sum(abs(sequence[i] - sequence[i - 1]) for i in range(1, len(sequence)))
    total_seek_time += abs(sequence[0] - current_head)
    average_seek_time = total_seek_time / len(requests)

    print("磁盘扫描序列:", sequence)
    print("总寻道时间:", total_seek_time)
    print("平均寻道时间:", average_seek_time)


def cscan(requests, current_head):
    """循环扫描调度 (CSCAN)"""
    requests.sort()
    total_seek_time = 0
    sequence = []

    print("磁盘请求序列:", requests)
    print("当前磁头位置:", current_head)

    right = [req for req in requests if req >= current_head]
    left = [req for req in requests if req < current_head]
    sequence = right + left

    total_seek_time = sum(abs(sequence[i] - sequence[i - 1]) for i in range(1, len(sequence)))
    total_seek_time += abs(sequence[0] - current_head)
    average_seek_time = total_seek_time / len(requests)

    print("磁盘扫描序列:", sequence)
    print("总寻道时间:", total_seek_time)
    print("平均寻道时间:", average_seek_time)


if __name__ == "__main__":
    file_path = "input.txt"  # 假设输入文件名为 input.txt
    requests, current_head = read_requests(file_path)

    while True:
        print("\n请选择调度算法:")
        print("1. 先来先服务 (FCFS)")
        print("2. 最短寻道时间优先 (SSTF)")
        print("3. 扫描调度 (SCAN)")
        print("4. 循环扫描 (CSCAN)")
        print("5. 退出")

        choice = int(input("输入你的选择 (1-5): "))
        if choice == 1:
            fcfs(requests, current_head)
        elif choice == 2:
            sstf(requests, current_head)
        elif choice == 3:
            direction = int(input("请输入扫描方向 (0 表示向外,1 表示向内): "))
            scan(requests, current_head, direction)
        elif choice == 4:
            cscan(requests, current_head)
        elif choice == 5:
            print("退出程序。")
            break
        else:
            print("无效选择,请重新输入!")

 input格式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值