Register Now

Login

Lost Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Login

Register Now

Welcome to All Test Answers

Python program that implements the following disk-scheduling algorithms FCFS – SSTF – SCAN – C-SCAN – LOOK – C-LOOK

Write a Python program that implements the following disk-scheduling algorithms:
a. FCFS
b. SSTF
c. SCAN
d. C-SCAN
e. LOOK
f. C-LOOK
Your program will service a disk with 5,000 cylinders numbered 0 to
4,999. The program will generate a random series of 1,000 cylinder
requests and service them according to each of the algorithms listed
above. The program will be passed the initial position of the disk head
(as a parameter on the command line) and report the total amount of
head movement required by each algorithm.

Answer:


'''
These are implementations of different disk scheduling algorithms
in python. They were written using a more algorithmic approach
rather than using the various list functions that are available
in python. 

Usage: python DiskScheduler.py <initial cylinder position>

i.e.
python DiskScheduler.py 2150
'''
import sys

import pdb

LEFT = "LEFT"
RIGHT = "RIGHT"

LOWER_CYLINDER = 0
UPPER_CYLINDER = 4999

'''
SSTF algorithm
'''
def SSTF(requests, initialPosition):
    localRequests = list(requests)
    
    position = initialPosition
    movement = 0
    
    while localRequests:
        #find the closest request to the current cylinder
        closest = abs(position - localRequests[0])
        closestIndex = 0
        for x in range(1, len(localRequests)):
            if abs(position - localRequests[x]) < closest: 
                closest = abs(position - localRequests[x]) 
                closestIndex = x 
        movement += abs(position - localRequests[closestIndex]) 
        position = localRequests[closestIndex]
        print "Servicing " + str(position) 
        localRequests.remove(position) 
    return movement 
'''
 FCFS algorithm 
''' 
def FCFS(requests, initialPosition): 
    position = initialPosition 
    movement = 0 

    for x in range(len(requests)): 
        movement += abs(position - requests[x]) 
        position = requests[x] 
        print "Servicing " + str(position) 
    return movement 
''' 
SCAN algorithm 
''' 
def SCAN(requests, initialPosition): 
    direction = RIGHT 
    localRequests = list(requests) 
    position = initialPosition 
    movement = 0 
    while localRequests: 
        #pdb.set_trace() 
        if position in localRequests: 
            print "Servicing " + str(position) 
            localRequests.remove(position) 

            if not localRequests: 
                break 
        if direction == LEFT and position > LOWER_CYLINDER:
            position -= 1
        if direction == RIGHT and position < UPPER_CYLINDER:
            position += 1

        movement += 1

        if position == 0:
            direction = RIGHT
        if position == UPPER_CYLINDER:
            direction = LEFT

    return movement


'''
C-SCAN algorithm
'''
def C_SCAN(requests, initialPosition):
    localRequests = list(requests)
    position = initialPosition
    movement = 0

    while localRequests:
        if position in localRequests:
            print "Servicing " + str(position)
            localRequests.remove(position)

            if not localRequests:
                break
    
        movement += 1
        position += 1
        if position == UPPER_CYLINDER:
            position = 0
            movement += UPPER_CYLINDER

    return movement

'''
LOOK algorithm
'''
def LOOK(requests, initialPosition):
    direction = RIGHT
    localRequests = list(requests)
    localRequests.sort()
    position = initialPosition
    movement = 0

    while localRequests:
        if position <= localRequests[0]: direction = RIGHT if position >= localRequests[-1]:
            direction = LEFT

        if position in localRequests:
            print "Servicing " + str(position)
            localRequests.remove(position)

            if not localRequests:
                break

        if direction == LEFT and position > LOWER_CYLINDER:
            position -= 1
        if direction == RIGHT and position < UPPER_CYLINDER: position += 1 movement += 1 return movement ''' C-LOOK algorithm ''' def C_LOOK(requests, initialPosition): localRequests = list(requests) localRequests.sort() position = initialPosition movement = 0 while localRequests: if position in localRequests: print "Servicing " + str(position) localRequests.remove(position) if not localRequests: break if position > localRequests[-1]:
            movement += abs(position - localRequests[0])
            position = localRequests[0]
        else:
            movement += 1
            position += 1
           

    return movement


#main function
if __name__ == '__main__':
    #requests = [2069, 1212, 2296, 2800, 544, 1618, 356, 1523, 4965, 3681]
    #requests = [98, 183, 37, 122, 14, 124, 65, 67]
    requests = [2069, 1212, 2296, 2800, 544, 1618, 356, 1523, 4965, 3681]
	
    initialPosition = int(sys.argv[1])
    
    print "\tFCFS = " + str(FCFS(requests, initialPosition))
    
    print "\tSSTF = " + str(SSTF(requests, initialPosition))
    
    print "\tSCAN = " + str(SCAN(requests, initialPosition))
    
    print "\tC-SCAN = " + str(C_SCAN(requests, initialPosition))
    
    print "\tLOOK = " + str(LOOK(requests, initialPosition))
    
    print "\tC-LOOK = " + str(C_LOOK(requests, initialPosition))


About

Leave a reply

Captcha Click on image to update the captcha .

error: Content is protected !!