Simulation and implementation of disk scheduling algorithm

Disk scheduling algorithm: The purpose of disk scheduling is to reduce the disk seek time as much as possible to improve the performance of the disk I/O system.

First-in, first-out algorithm: Scheduling is performed in the order in which access requests arrive.

Shortest Service Time First Algorithm: Disk I/O requests that require the least movement of the head arm from its current position are prioritized for scheduling.

SCAN (elevator algorithm): requires the head arm to move in one direction first and satisfy all outstanding requests on the way until it reaches the last track in this direction, or there are no other requests in this direction, the latter Improvements are sometimes called LOOK strategies. Then reverse the service direction and scan in the opposite direction, completing all requests in the same order.

C-SCAN (circular scan) algorithm: During disk scheduling, scanning is limited to one direction. When the last track is accessed in a certain direction, the head arm returns to the other end of the disk and starts scanning again.

Experimental code


#include <stdio.h>
#include <math.h>
#include <limits.h>
#define TRACKS 200

int bwdistance(int track1, int track2)
{
	return abs(track1 - track2);
}
int fifo(int request[], int num, int start_track)
{
	int total = 0;
	int current = start_track;

	for (int i = 0; i < num; i++)
	{
		total += bwdistance(current, request[i]);
		current = request[i];
	}
	return total;
}

int sstf(int request[], int num, int start_track)
{

	int visited[num];
	for (int i = 0; i < num; i++)
	{
		visited[i] = 0;
	}
	int total=0;
	for (int i = 0; i < num; i++)         //外层循环  num
	{
        //INT_MAX在C语言中定义的常量,它表示整数类型 int 的最大值。在头文件limits.h下
	    int min = INT_MAX;                                       
	    int index=-1;
		for (int j = 0; j < num; j++)            //内层循环
		{
			if (visited[j] == 0)                 //找出没有被访问过且距当前磁道距离最短的磁道
			{
			    int dis=bwdistance(start_track,request[j]);
				if(dis<min)
                {
                    index=j;
                    min=dis;
                }
			}
		}
		visited[index]=1;                    //标记为访问过
		total+=min;
		start_track=request[index];        //
	}
	return total;

}

//也可以往另一个方向设计
int scan(int request[], int num, int start_track)
{
    int temp,i,j,k,total=0,index=-1;
    for(i=0;i<num-1;i++)                //选择排序
    {
        k=i;
        for(j=i+1;j<num;j++)
        {
            if(request[k]<request[j])
            {
                k=j;
            }
        }
        temp=request[i];
        request[i]=request[k];
        request[k]=temp;
    }
    for(i=0;i<num;i++)                        //找到第一个小于开始磁道的下标,根据自己的方法
    {
        if(request[i]<start_track)
        {
            index=i;
            break;
        }
    }
    for(i=index-1;i>=0;i--)                //往指定的方向扫描
    {
        k=i;
        total+=bwdistance(start_track,request[i]);
        start_track=request[k];

    }
    for(i=index;i<num;i++)                 //往另一个方向扫描
    {
        k=i;
        total+=bwdistance(start_track,request[i]);
        start_track=request[k];

    }
    return total;
}

int c_scan(int request[], int num, int start_track)
{
    int temp,i,j,k,total=0,index=-1;
    for(i=0;i<num-1;i++)
    {
        k=i;
        for(j=i+1;j<num;j++)
        {
            if(request[k]<request[j])
            {
                k=j;
            }
        }
        temp=request[i];
        request[i]=request[k];
        request[k]=temp;
    }
    for(i=0;i<num;i++)
    {
        if(request[i]<start_track)
        {
            index=i;
            break;
        }
    }
    for(i=index-1;i>=0;i--)
    {
        k=i;
        total+=bwdistance(start_track,request[i]);
        start_track=request[k];

    }        
    for(i=num-1;i>=index;i--)                       //与上一个算法不同的是继续沿一个方向扫描
    {
        k=i;
        total+=bwdistance(start_track,request[i]);
        start_track=request[k];
    }
    return total;
}

double SeekTime(int distance, int num)
{
	return (double)distance / num;

}
int main()
{
	int request[] = { 55,58,39,18,90,160,150,38,184 };
	int num = sizeof(request) / sizeof(request[0]);
	int start_track = 100;
	int fifo_dis = fifo(request, num, start_track);
	int sstf_dis = sstf(request, num, start_track);
	int scan_dis = scan(request, num, start_track);
	int c_scan_dis = c_scan(request, num, start_track);

	double fifo_time = SeekTime(fifo_dis, num);
	double sstf_time = SeekTime(sstf_dis, num);
	double scan_time = SeekTime(scan_dis, num);
	double c_scan_time = SeekTime(c_scan_dis, num);

	printf("FIFO距离:%d\n", fifo_dis);
	printf("FIFO平均寻道长度:%.2lf\n\n", fifo_time);

    printf("SSTF距离:%d\n", sstf_dis);
	printf("SSTF平均寻道长度:%.2lf\n\n", sstf_time);

    printf("SCAN距离:%d\n", scan_dis);
	printf("SCAN平均寻道长度:%.2lf\n\n", scan_time);

    printf("C_SCAN距离:%d\n", c_scan_dis);
	printf("C_SCAN平均寻道长度:%.2lf\n\n", c_scan_time);
}

operation result

Follow the data and scanning direction in the book

Guess you like

Origin blog.csdn.net/m0_70732442/article/details/131153898