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

实验六:磁盘调度算法:

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

(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))




  • 9
    点赞
  • 60
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值