【操作系统实验】磁盘调度算法(python)

本文介绍了一种模拟操作系统的磁盘寻道过程的方法,通过不同的磁盘调度算法(包括FCFS、SSTF、SCAN、CSCAN和NStepSCAN)对比分析了其效率。文中详细解释了每种算法的工作原理,并通过随机生成的磁道访问序列来展示各种算法的表现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实验六:磁盘调度算法:

本实验是模拟操作系统的磁盘寻道方式,运用磁盘访问顺序的不同来设计磁盘的调度算法。

(1)    实现的磁盘调度算法有FCFSSSTFSCANCSCAN NStepSCAN算法。

(2)    设定开始磁道号寻道范围,依据起始扫描磁道号和最大磁道号数,随机产生要进行寻道的磁道号序列。

(3)   选择磁盘调度算法,显示该算法的磁道访问顺序,计算出移动的磁道总数和平均寻道总数。

(4)   按算法的寻道效率进行排序,并对各算法的性能进行分析比较。

import random
import copy
TRACK_MAX_COUNT = 100                 #磁道的总数
TRACK_REQUEST_COUNT = 10              #请求访问的磁道数量
TRACK_START = 50
SCAN_DIRECTION = 1                    # 1表示向磁道号增加的方向扫描,0表示向磁道号减小的方向
N_STEPSCAN = 4                        # 表示请求队列被划分为长度为 N 的子队列

#*********************先来先服务调度算法**************************/
def FCFS(track_request):
    queue_FCFS = track_request.copy()
    queue_FCFS.insert(0,TRACK_START)
    return queue_FCFS



#**********************最短寻道时间优先调度算法********************
def findNearest(current,track_request,visited):
    minDis = TRACK_MAX_COUNT
    minIndex = -1
    for i in range(len(track_request)):
        if visited[i] == False:
            dis = abs( current - track_request[i])
            if dis < minDis:
                minDis = dis
                minIndex = i
    visited[minIndex] = True
    return minIndex, minDis

def SSTF(track_request):
    visited = [False] * TRACK_REQUEST_COUNT
    queue_FCFS = []
    current = TRACK_START                               #起始的磁道
    for i in range(len(track_request)+1):
        index, dis = findNearest(current, track_request, visited)
        queue_FCFS.append(current)
        current = track_request[index]
    return queue_FCFS



    queue_SCAN.append(TRACK_START)
    current = TRACK_START#**********************扫描调度算法********************
def SCAN(track_request):
    global SCAN_DIRECTION
    queue_SCAN = []

    track_request_copy = copy.deepcopy(track_request)
    track_request_copy.sort()
    while track_request_copy.__len__() != 0:
        if SCAN_DIRECTION == 1:
            for track in track_request_copy.copy():
                if TRACK_START <= track:
                    queue_SCAN.append(track)
                    track_request_copy.remove(track)
            SCAN_DIRECTION = 0

        if SCAN_DIRECTION == 0:
            track_request_copy.reverse()
            for track in track_request_copy.copy():
                if TRACK_START >= track:
                    queue_SCAN.append(track)
                    current = track
                    track_request_copy.remove(track)
            SCAN_DIRECTION = 1
    return queue_SCAN



#**********************循环扫描调度算法********************
def CSCAN(track_request):
    global SCAN_DIRECTION
    queue_CSCAN = []
    queue_CSCAN.append(TRACK_START)
    track_request_copy = copy.deepcopy(track_request)
    track_request_copy.sort()
    i = 0
    is_find = False

    if SCAN_DIRECTION ==1:
        while i < track_request_copy.__len__():
            if (TRACK_START <= track_request_copy[i] ) & (is_find == False):
                index = i
                i = 0
                is_find = True
            if is_find == True:
                queue_CSCAN.append(track_request_copy[index % TRACK_REQUEST_COUNT])
                index += 1
            i +=1

    if SCAN_DIRECTION ==0:
        track_request_copy.reverse()
        while i < track_request_copy.__len__():
            if (TRACK_START >= track_request_copy[i] ) & (is_find == False):
                index = i
                i = 0
                is_find = True
            if is_find == True:
                queue_CSCAN.append(track_request_copy[index % TRACK_REQUEST_COUNT])
                index += 1
                current = track_request_copy[index % TRACK_REQUEST_COUNT]
            i +=1

    return queue_CSCAN

#****************** NStepSCAN算法 ************************
def NStepSCAN(track_request):
    queue_NStepSCAN = []
    queue_NStepSCAN.append(TRACK_START)
    swap_track_request = []
    Count = 0
    for i in range(TRACK_REQUEST_COUNT ):         #将队列进行划分成长度为N_STEPSCAN的队列
        #print(track_request[i])
        if i == TRACK_REQUEST_COUNT -1:
            swap_track_request.append(track_request[i])
            sub_queue_NstepQueue = SCAN(swap_track_request)
            sub_queue_NstepQueue.remove(TRACK_START)
            print('子序列为')
            print(sub_queue_NstepQueue)
            queue_NStepSCAN += sub_queue_NstepQueue
            break
        if Count < N_STEPSCAN:
            #print(track_request)
            swap_track_request.append(track_request[i])
            #print(swap_track_request)
        else:
            sub_queue_NstepQueue= SCAN(swap_track_request)
            sub_queue_NstepQueue.remove(TRACK_START)
            print('子序列为')
            print(sub_queue_NstepQueue)
            queue_NStepSCAN += sub_queue_NstepQueue
            swap_track_request.clear()
            swap_track_request.append(track_request[i])
            Count = 0
        Count += 1
    return queue_NStepSCAN

def caculate(queue):
    print('访问的磁道序列为: ',end = '')
    print(queue)
    sum_gap = sum([(abs(queue[i] - queue[i - 1])) for i in range(1, len(queue))])
    print('移动的磁道数为:%d' % sum_gap)
    print('平均移动的磁道数为:%.2f' % (sum_gap/TRACK_REQUEST_COUNT))
    print("")

if __name__ == '__main__':
    track_request = [None] * TRACK_REQUEST_COUNT
    for i in range(TRACK_REQUEST_COUNT):
        track_request[i] = random.randint(0, TRACK_MAX_COUNT)

    print('每次生成的磁道序列是随机的,对于不同的序列算法的算法的性能是不一样的,'
          '通过多次比较观察结果,SSTF是算法中移动的磁道数最少的')

    print("TRACK SEQUECE:    ")
    print(track_request)
    print('')

    print("FCFS:    ")
    caculate(FCFS(track_request))

    print("SSTF:    ")
    caculate(SSTF(track_request))

    print("SCAN:    ")
    caculate(SCAN(track_request))

    print("CSCAN:   ")
    caculate(CSCAN(track_request))

    print("NStepSCAN:   ")
    caculate(NStepSCAN(track_request))




好的,我可以为您演示一下磁盘调度算法Python实现磁盘调度算法操作系统中的一种重要的调度算法,它用于决定磁盘访问请求的顺序,以提高磁盘的读写效率。 在Python中,我们可以使用列表来模拟磁盘请求队列,并使用不同的算法来对其进行调度。下面我将演示三种常见的磁盘调度算法:FCFS、SSTF和SCAN。 首先,我们先定义一个磁盘请求队列: ```python requests = [98, 183, 37, 122, 14, 124, 65, 67] ``` 这个队列中包含了 8 个请求,它们的磁道号分别为 98、183、37、122、14、124、65 和 67。 接下来,我们分别来实现 FCFS、SSTF 和 SCAN 算法Python代码。 ### 1. FCFS算法 FCFS(First-Come, First-Served)算法是最简单的磁盘调度算法,它按照磁盘请求的先后顺序进行调度。具体实现如下: ```python def fcfs(requests, head): total = 0 for r in requests: total += abs(head - r) head = r return total ``` 在这个函数中,我们首先定义了一个变量 `total`,用于存储磁盘移动的距离总和。然后,我们遍历整个请求队列,计算出每个请求与当前磁头位置之间的距离,将其累加到 `total` 中,并将磁头位置更新为当前请求的位置。最后返回 `total` 即可。 ### 2. SSTF算法 SSTF(Shortest Seek Time First)算法是一种比较常用的磁盘调度算法,它每次选择与当前磁头位置最近的请求进行调度。具体实现如下: ```python def sstf(requests, head): total = 0 while requests: shortest = min(requests, key=lambda x: abs(x - head)) total += abs(head - shortest) head = shortest requests.remove(shortest) return total ``` 在这个函数中,我们首先定义了一个变量 `total`,用于存储磁盘移动的距离总和。然后,我们进入一个循环,每次找出与当前磁头位置最近的请求,并将其从队列中移除。然后,将磁头位置更新为当前请求的位置,并将磁头移动距离累加到 `total` 中。直到队列为空为止,最后返回 `total`。 ### 3. SCAN算法 SCAN(Elevator)算法是一种比较实用的磁盘调度算法,它按照一个方向移动磁头,直到到达磁盘的边界,然后改变方向继续移动。具体实现如下: ```python def scan(requests, head): total = 0 direction = 1 while requests: if head in requests: requests.remove(head) total += 1 head += direction if head == 199: direction = -1 elif head == 0: direction = 1 return total ``` 在这个函数中,我们首先定义了一个变量 `total`,用于存储磁盘移动的距离总和。然后,我们定义了一个变量 `direction`,表示磁头移动的方向,初始值为 1,表示向右移动。 接着,我们进入一个循环,每次判断磁头当前位置是否有请求,如果有,则将其从队列中移除,并将 `total` 加 1。然后,将磁头位置更新为下一个位置,并根据是否到达磁盘边界来改变磁头移动的方向。直到队列为空为止,最后返回 `total`。 好的,以上就是三种常见的磁盘调度算法Python实现。希望对您有所帮助!
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值