用Python简单实现scan(电梯)算法和最短寻道优先算法

1.SCAN(电梯)算法

打个比方:如果请求调度的磁道为98, 183, 37, 122, 14, 124, 65, 67,磁头从53号磁道开始移动,磁头就会按照65, 67, 98, 122, 124, 183, 37,14 的顺序依次查找,并将数据输入内存。

A.提出问题:假设磁头当前停留在第55道,正在向磁道号增加的方向移动。每移动一个磁道需要花费1ms,现有一个磁道访问的请求序列,100,185,39,124,16,126,67,69,忽略磁盘启动和减速时间,且不计旋转延时,则采用SCAN(电梯)调度算法需要花费的磁道访问总时间是?

B.实现代码如下:

n = int(input())
count = 0
list_1 = [100, 185, 39, 124, 16, 126, 67, 69]
list_1.sort()
for i in list_1:
    if n <= i:
        pn = list_1.index(i)
        break
for j in range(pn, len(list_1)):
    count += abs(n - list_1[j])
    n = list_1[j]
while pn > 0:
    pn -= 1
    count += n - list_1[pn]
    n = list_1[pn]
print(count)

2.最短寻道优先算法(SSTF)

算法简介:SSTF即最短寻道时间优先(ShortestSeekTimeFirst),该算法选择这样的进程,其要求访问的磁道与当前磁头所在的磁道距离最近,以使每次的寻道时间最短,但这种调度算法却不能保证平均寻道时间最短。

A.提出问题:假设磁头当前停留在第55道,正在向磁道号增加的方向移动。每移动一个磁道需要花费1ms,现有一个磁道访问的请求序列,100,185,39,124,16,126,67,69,忽略磁盘启动和减速时间,且不计旋转延时,则采用最短寻道优先(SSTF)调度算法需要花费的磁道访问总时间是?

B.实现代码如下:

n = int(input())
count = 0
list_1 = [100, 185, 39, 124, 16, 126, 67, 69]
list_2 = []
while len(list_1) != 0:
    for i in list_1:
        list_2.append(abs(n - i))
    tidy = min(list_2)
    count += tidy
    pn = list_2.index(tidy)
    n = list_1[pn]
    list_1.pop(pn)
    list_2.clear()
print(count)

写在最后:这是本人第一篇文章,代码是自己在刷计算机四级题目时懒得算,突发奇想写下来的。比较粗糙,难免有不少纰漏,仅供自身学习记录,大家可以简单参考一二,谢谢!

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,我可以为您介绍一下这几种磁盘调度算法实现。 1. 先来先服务算法(FCFS) FCFS 算法是一种最简单的磁盘调度算法,它按照请求的先后顺序进行处理。当一个请求被处理完毕后,下一个请求就会被依次处理。如果请求队列中有多个请求,算法会依次处理它们,直到队列为空。 2. 最寻道时间算法(SSTF) SSTF 算法会选择最接近磁头的请求进行处理。它计算出距离当前磁头位置最近的请求,并把它作为下一个要处理的请求。这种算法能够提高磁盘的访问效率,因为它可以减少寻道时间。 3. 电梯调度算法(SCAN) SCAN 算法也被称为电梯算法,它类似于电梯在楼层中上下移动的过程。SCAN 算法将磁盘的请求队列看做是一个电梯的楼层,磁头的移动方向就像电梯上下移动一样。SCAN 算法会按照一个方向处理请求,直到到达最边缘的请求,然后改变方向继续处理请求。 下面是一份简单Python 代码实现,可以让您更加直观地理解这些算法: ``` # 先来先服务算法(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 # 测试代码 if __name__ == '__main__': # 输入磁盘请求序列 requests = [] while True: request = input('请输入磁盘请求序列(输入0结束):') if request == '0': break requests.append(int(request)) # 输入起始位置 start = int(input('请输入磁头的起始位置:')) # 计算 FCFS 算法的移动距离 fcfs_distance = fcfs(requests, start) print('FCFS 算法的移动距离为:', fcfs_distance) # 计算 SSTF 算法的移动距离 sstf_distance = sstf(requests, start) print('SSTF 算法的移动距离为:', sstf_distance) # 计算 SCAN 算法的移动距离 direction = input('请输入磁头的初始移动方向(left 或 right):') scan_distance = scan(requests, start, direction) print('SCAN 算法的移动距离为:', scan_distance) ``` 希望这份代码能够帮助您更好地理解这些磁盘调度算法实现
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

New_Teen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值