【SCAU操作系统】实验四实现FCFS、SSTF、电梯LOOK和C-SCAN四种磁盘调度算法python源代码及实验报告参考

需求分析

设计一个程序将模拟实现FCFS(先来先服务)、SSTF(最短寻道时间优先)、电梯LOOK和C-SCAN(循环扫描)四种磁盘调度算法,并通过图形可视化界面动态展示每种算法的调度过程。

程序所能达到的功能;

实现FCFS、SSTF、电梯LOOK、C-SCAN四种磁盘调度算法。

计算并比较四种算法下磁头移动的总道数。

通过图形界面动态展示算法调度过程。

主程序流程

初始化磁头位置(start)。

调用 generate_requests() 函数生成磁道号序列。

分别调用 fcfs(),sstf(),look(),cscan() 来计算每种算法下的磁头移动道数,并获取移动路径。

比较并输出每种算法下的磁头移动道数。

使用图形库绘制可视化界面,展示每种算法的调度过程。

调用关系:

5b4b0fc45f7e41a09c365656704331b5.png

算法时间复杂性分析:

  1. FCFS:时间复杂度为O(n),因为只需遍历请求列表一次。
  2. SSTF:时间复杂性较高,因为每次选择下一个请求时都需要遍历整个请求列表。在最坏情况下,如果请求列表是按升序排列的,每次选择下一个请求时都需要遍历整个列表,时间复杂度为O(n^2)。
  3. LOOK:LOOK算法是SSTF的变种,它在同一方向移动时不会改变方向。其时间复杂性与SSTF类似,但通常性能会更好,因为它减少了不必要的方向切换。
  4. C-SCAN:C-SCAN算法按照一个方向扫描磁道,直到到达最远端,然后改变方向继续扫描。时间复杂性为O(n),因为磁头只需要遍历整个磁道范围两次(最坏情况下)。

运行结果:

FCFS algorithm movements: 63387

SSTF algorithm movements: 1677

LOOK algorithm movements: 2803

C-SCAN algorithm movements: 2966

b4afbc99c96545fe98f9475306f4f385.png

f76460d6ec0d4c21920e67b2660e9c4e.png

3e0a0e0e11884a149ad2772dd742e9f3.png

174af98acf5b42a3b617a9fde6bc5b8e.png

源代码:

import random
import matplotlib.pyplot as plt

# 生成磁道号序列
def generate_requests():
    requests = []
    for i in range(200):
        requests.append(random.randint(0, 499))
    for i in range(100):
        requests.append(random.randint(500, 999))
    for i in range(100):
        requests.append(random.randint(1000, 1499))
    return requests

# FCFS 算法
def fcfs(requests, start):
    movements = 0
    current = start
    movements_list = [current]
    for request in requests:
        movements += abs(request - current)
        current = request
        movements_list.append(current)
    return movements, movements_list

# SSTF 算法
def sstf(requests, start):
    movements = 0
    current = start
    movements_list = [current]
    while requests:
        next_request = min(requests, key=lambda x: abs(x - current))
        movements += abs(next_request - current)
        current = next_request
        movements_list.append(current)
        requests.remove(next_request)
    return movements, movements_list

# 电梯 LOOK 算法
def look(requests, start):
    if not requests:
        return 0, []  # 如果请求列表为空,则返回0移动数和空列表
    movements = 0
    current = start
    movements_list = [current]
    direction = 1  # 1表示向外,-1表示向内
    while requests:
        if direction == 1:
            next_request = min((x for x in requests if x >= current), default=None)
            if next_request is None:
                direction = -1
                continue
        else:
            next_request = max((x for x in requests if x <= current), default=None)
            if next_request is None:
                direction = 1
                continue
        movements += abs(next_request - current)
        current = next_request
        movements_list.append(current)
        requests.remove(next_request)
    return movements, movements_list

# C-SCAN 算法
def cscan(requests, start):
    if not requests:
        return 0, []
    sorted_requests = sorted([start] + requests)
    current = start
    movements = 0
    movements_list = [start]
    served = set([start])# 标记已服务的请求
    for request in sorted_requests[1:]:
        if request in served:
            continue
        movements += abs(request - current)
        current = request
        served.add(request)
        movements_list.append(current)
    if current != start:
        movements += abs(start - current)
        movements_list.append(start)
    return movements, movements_list

#FCFS
# 生成磁道号序列
requests = generate_requests()
# 设置磁头初始位置
start = random.randint(0, 1499)
fcfs_movements, fcfs_movements_list = fcfs(requests, start)
print("FCFS algorithm movements:", fcfs_movements)
# 可视化界面
plt.figure(figsize=(10, 6))
plt.plot(range(len(fcfs_movements_list)), fcfs_movements_list, label='FCFS', marker='o', linestyle='-')
plt.title("Disk Scheduling Algorithms")
plt.xlabel("Time")
plt.ylabel("Disk Track")
plt.legend()
plt.show()
#SSTF
# 生成磁道号序列
requests = generate_requests()
# 设置磁头初始位置
start = random.randint(0, 1499)
sstf_movements, sstf_movements_list = sstf(requests, start)
print("SSTF algorithm movements:", sstf_movements)
# 可视化界面
plt.figure(figsize=(10, 6))
plt.plot(range(len(sstf_movements_list)), sstf_movements_list, label='SSTF', marker='x', linestyle='--')
plt.title("Disk Scheduling Algorithms")
plt.xlabel("Time")
plt.ylabel("Disk Track")
plt.legend()
plt.show()

#LOOK
# 生成磁道号序列
requests = generate_requests()
# 设置磁头初始位置
start = random.randint(0, 1499)
look_movements, look_movements_list = look(requests, start)
print("LOOK algorithm movements:", look_movements)
# 可视化界面
plt.figure(figsize=(10, 6))
plt.plot(range(len(look_movements_list)), look_movements_list, label='LOOK', marker='s', linestyle='-')
plt.title("Disk Scheduling Algorithms")
plt.xlabel("Time")
plt.ylabel("Disk Track")
plt.legend()
plt.show()

#cscan
# 生成磁道号序列
requests = generate_requests()
# 设置磁头初始位置
start = random.randint(0, 1499)
cscan_movements, cscan_movements_list = cscan(requests, start)
print("C-SCAN algorithm movements:", cscan_movements)
# 可视化界面
plt.figure(figsize=(10, 6))
plt.plot(range(len(cscan_movements_list)), cscan_movements_list, label='C-SCAN', marker='d', linestyle='-.')
plt.title("Disk Scheduling Algorithms")
plt.xlabel("Time")
plt.ylabel("Disk Track")
plt.legend()
plt.show()

  • 13
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
scau汇编综合性实验是一个非常有趣的项目,其中有一个实现在屏幕上移动的“蛇”的任务。我们可以使用汇编语言的指令来控制屏幕的输出和键盘输入。 首先,我们需要定义一个表示“蛇”的数据结构。可以使用一个数组来储存蛇的位置信息,每个元素表示一个身体部位的坐标。我们还需要定义一个变量来表示蛇的长度。 接下来,我们需要在屏幕上绘制“蛇”。我们可以使用汇编语言的命令来控制屏幕的像素,实现绘制功能。首先,我们需要清空屏幕上的内容,然后将“蛇”的每个身体部位的坐标对应的像素点设为特定颜色。 在屏幕上移动“蛇”的思路是,通过监听键盘输入来控制“蛇”的移动方向。当用户按下箭头键的时候,我们通过改变蛇头的坐标来实现移动。之后,我们还需要更新蛇身体的坐标信息,最后再次绘制“蛇”。 同时,要确保蛇的移动过程中不会碰到屏幕边界或者自身身体的其他部位。如果蛇头碰到屏幕边界或者自身身体的其他部位,游戏结束。 在游戏进行过程中,还可以加入一些额外的功能,比如蛇吃到食物后身体加长,每移动一步更新分数等。 这个“蛇”的移动实验可以让我们深入理解汇编语言的编程思想,锻炼我们的逻辑思维和创造力。同时,通过这个实验,我们可以将计算机相关知识与生活中的游戏联系起来,更加直观地感受到计算机的奇妙之处。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值