114k views
1 vote
Write a program that implements the following disk-scheduling algorithms: (Pick three)

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 50 requests and service them according to each of the algorithms you chose. 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 for each algorithm.

User ZenoArrow
by
5.5k points

1 Answer

2 votes

Answer:

Step-by-step explanation:

#include <stdio.h>

#include <stdlib.h>

#define CYLINDERS 5000

#define REQUESTS 1000

int initialHead = 0;

int disk[REQUESTS];

int* sortDisk()

{

int temp = 0, m = 0, n = 0;

//sort the disk using sorting algorithm

for (m = 0; m < REQUESTS; ++m)

{

for (n = m + 1; n < REQUESTS; ++n)

{

if (disk[m] > disk[n])

{

temp = disk[m];

disk[m] = disk[n];

disk[n] = temp;

}

}

}

return disk;

}

int discSchedAlgFCFS(int *ran_array)

{

int i = 0, headMovement = 0;

int this_start = disk[initialHead];

for (i = initialHead; i < REQUESTS; i++)

//add absolute difference disk[i]

//and this_start to head movement

headMovement += abs(disk[i] - this_start);

for (i = 0; i < initialHead; i++)

headMovement += abs(this_start - ran_array[i]);

//return head movments of fcfs

return headMovement;

}

int discSchedAlgSSTF(int * disk)

{

//befor start SSTF algorithm, first sort the disk

disk = sortDisk();

//Decalre the variables

int s = initialHead - 1, l = initialHead + 1;

int smallDiff = 0, largeDiff = 0;

int headMovement = 0, n = REQUESTS - 2;

int new_head = initialHead, head_value = disk[initialHead];

//loop until the total number of request n to reach 0

while (n >= 0)

{

//absolute difference disk[new_head]

//and disk[s] into smallDiff

smallDiff = abs(disk[new_head] - disk[s]);

//absolute difference disk[new_head]

//and disk[l] into largeDiff

largeDiff = abs(disk[l] - disk[new_head]);

//check if smallDiff is lessthan largeDiff

if (smallDiff < largeDiff)

{//then add smallDiff to headMovement

headMovement += smallDiff;

new_head = s;

s--;//Decrement s

}

else

{//else add largeDiff to headMovement

headMovement += largeDiff;

new_head = l;

l++;//increament l

}

n--;

}

//return head movments of SSTF

return headMovement;

}

int discSchedAlgSCAN(int * ranArray) {

int i = 0, currentValue = 0;

int savedValue = disk[initialHead], difference = 0;

int headMovement = 0, curr_i = 0;

for (i = initialHead - 1; i >= 0; --i)

{

currentValue = disk[i];

//absolute difference value saved and current values

difference = abs(savedValue - currentValue);

//add difference to the head movment

headMovement += difference;

//save the current value as saved value

savedValue = currentValue;

}

/* used to subtract value from zero, or just add same value */

headMovement += savedValue;

savedValue = 0;

for (i = initialHead + 1; i < REQUESTS; i++)

{

currentValue = disk[i];

//absolute difference value saved and current values

difference = abs(currentValue - savedValue);

//add difference to the head movment

headMovement += difference;

//save the current value as saved value

savedValue = currentValue;

}

//return head movments of SCAN

return headMovement;

}

int discSchedAlgCSCAN(int *disk) {

int i = 0, currentValue = 0;

int savedValue = disk[initialHead], diff = 0;

int headMovement = 0, lastIndex = 4999;

for (i = initialHead + 1; i < REQUESTS; i++)

{

currentValue = disk[i];

//absolute difference value saved and current values

diff = abs(savedValue - currentValue);

//add difference to the head movment

headMovement += diff;

//save the current value as saved value

savedValue = currentValue;

}

//add last val - upper bound, go to and

//add zero bounday (4999)

headMovement += lastIndex - savedValue;

savedValue = 0;

headMovement += 4999;

for (i = 0; i < initialHead; i++)

{

currentValue = disk[i];

//absolute difference value saved and current values

diff = abs(currentValue - savedValue);

//add difference to the head movment

headMovement += diff;

savedValue = currentValue;

}

return headMovement;

}

int discSchedAlgLOOK(int* ranArray)

{

int i = 0, currentValue = 0;

int savedValue = disk[initialHead], diff = 0;

int headMovement = 0, curr_i = 0;

for (i = initialHead + 1; i < REQUESTS; i++)

{

currentValue = disk[i];

//absolute difference value saved and current values

diff = abs(savedValue - currentValue);

headMovement += diff;

savedValue = currentValue;

}

for (i = initialHead - 1; i >= 0; --i)

{

currentValue = disk[i];

//absolute difference value saved and current values

diff = abs(currentValue - savedValue);

//add difference to the head movment

headMovement += diff;

savedValue = currentValue;

}

//return head movments of LOOK

return headMovement;

}

int discSchedAlgCLOOK(int* ranArray)

{

int i = 0, currentValue = 0;

int savedValue = disk[initialHead];

int diff = 0;

int headMovement = 0;

for (i = initialHead + 1; i < REQUESTS; i++)

{

currentValue = disk[i];

//absolute difference value saved and current values

diff = abs(savedValue - currentValue);

//add difference to the head movment

headMovement += diff;

//save the current value as saved value

savedValue = currentValue;

}

for (i = 0; i < initialHead; i++)

{

currentValue = disk[i];

//absolute difference value saved and current values

diff = abs(currentValue - savedValue);

//add difference to the head movment

User Fullybaked
by
5.5k points