[Python]磁盘调度算法FCFS,SSTF,SCAN,CSCAN

来源:互联网 发布:淘宝客设置通用计划 编辑:程序博客网 时间:2024/06/06 04:29

1、先来先服务(FCFS)

FCFS算法根据进程请求访问磁盘的先后顺序进行调度,这是一种最简单的调度算法。

此算法的优点是公平、简单,每个进程的请求都能依此得到处理,但缺点是磁头移动的距离和平均移动距离会很大。


2、最短寻道时间优先(SSTF)

 SSTF算法选择调度处理的磁道是与当前磁头所在磁道距离最近的磁道,以使每次的寻找时间最短。

当然,总是选择最小寻找时间并不能保证平均寻找时间最小,但是能提供比FCFS算法更好的性能。


3、扫描算法(SCAN)

SCAN算法在磁头当前移动方向上选择与当前磁头所在磁道距离最近的请求作为下一次服务的对象。


4、循环扫描算法(CSCAN)

在扫描算法的基础上规定磁头单向移动来提供服务,回返时直接快速移动至起始端而不服务任何请求。




data:

10055 58 39 18 90 160 150 38 184



FCFS:

def loaddata(fileName):    f = open(fileName)    start = f.readline()    data = f.readline()    return start, datadef loadNext(now, next):    length = abs(int(now) - int(next))    print(next, length)    return lengthl = 0start, data = loaddata('data')for d in data.split():    l += loadNext(start, d)    start = dn = len(data.split())print("FIFO:平均寻道长度:%.1f" %(l/n))


SSTF:

def loaddata(fileName):    f = open(fileName)    start = f.readline()    data = f.readline()    return start, datadef findNextIndex(start,datas):    length = []    for data in datas:        l = abs(int(start) - int(data))        length.append(l)    minIndex = length.index(min(length))    return minIndexdef loadNext(now, next):    length = abs(int(now) - int(next))    print(next, length)    return lengthl = 0start,data = loaddata('data')data2 = data.split().copy()n = len(data2)for d in data.split():    nextIndex = findNextIndex(start,data2)    l += loadNext(start,data2[nextIndex])    start = data2[nextIndex]    data2.remove(data2[nextIndex])print("FIFO:平均寻道长度:%.1f" %(l/n))


SCAN:

def loaddata(fileName):    f = open(fileName)    start = f.readline()    data = f.readline()    return start, datadef loadNext(now, next):    length = abs(int(now) - int(next))    print(next, length)    return lengthdef findNext(now,data):    biggerList = []    smallerList = []    for d in data:        if int(d) > int(now):            biggerList.append(d)    if (len(biggerList)==0):        if len(data)!=0:            for d2 in data:                if int(d2)<int(now):                    smallerList.append(d2)            return max(smallerList)        else:            return None    return min(biggerList)l = 0start,data = loaddata('data')data2 = data.split().copy()n = len(data2)for d in data :    next = findNext(start,data2)    if next == None:        break    l += loadNext(start,next)    start = next    data2.remove(next)print("FIFO:平均寻道长度:%.1f" %(l/n))


CSCAN:

def loaddata(fileName):    f = open(fileName)    start = f.readline()    data = f.readline()    return start, datadef loadNext(now, next):    length = abs(int(now) - int(next))    print(next, length)    return lengthdef findNext(now,data):    biggerList = []    smallerList = []    for d in data:        if int(d) > int(now):            biggerList.append(d)    if (len(biggerList)==0):        if len(data) != 0:            now = 0            return(findNext(now,data))        else:            return None    return min(biggerList)l = 0start,data = loaddata('data')data2 = data.split().copy()n = len(data2)for d in data :    next = findNext(start,data2)    if next == None:        break    l += loadNext(start,next)    start = next    data2.remove(next)print("FIFO:平均寻道长度:%.1f" %(l/n))


原创粉丝点击