1. 程式人生 > >【專案】模擬實現磁碟排程演算法--掃描演算法

【專案】模擬實現磁碟排程演算法--掃描演算法

報告的內容、目的及原理

一、實驗內容

模擬電梯排程演算法,實現對磁碟的驅動排程。 

二、實驗目的

磁碟是一種高速、大量旋轉型、可直接存取的儲存裝置。它作為計算機系統的輔助儲存器,負擔著繁重的輸入輸出任務,在多道程式設計系統中,往往同時會有若干個要求訪問磁碟的輸入輸出請示等待處理。系統可採用一種策略,儘可能按最佳次序執行要求訪問磁碟的諸輸入輸出請求,這就叫驅動排程,使用的演算法稱驅動排程演算法。驅動排程能降低為若干個輸入輸出請求服務所須的總時間,從而提高系統效率。本實驗要求學生模擬設計一個驅動排程程式,觀察驅動排程程式的動態執行過程。

三、實驗原理

磁碟是要供多個程序共享的儲存裝置,但一個磁碟每個時刻只能為一個程序服務。

當有程序在訪問某個磁碟時,其他想訪問該磁碟的程序必須等待,直到磁碟一次工作結束。

當有多個程序提出輸入輸出請求處於等待狀態,可用電梯排程演算法從若干個等待訪問者中選擇一個程序,讓它訪問磁碟。當存取臂僅需移到一個方向最遠的所請求的柱面後,如果沒有訪問請求了,存取臂就改變方向。

具體題目要求

假設磁碟有200個磁軌,用C語言隨機函式隨機生成一個磁軌請求序列(不少於15個)放入模擬的磁碟請求佇列中,假定當前磁頭在100號磁軌上,並向磁軌號增加的方向上移動。請給出按電梯排程演算法進行磁碟排程時滿足請求的次序,並計算出它們的平均尋道長度。

思路

僅僅用到陣列,加上取隨機數就可以完成的

程式碼實現

//模擬實現掃描演算法 
#include<stdio.h> 
#include<stdlib.h>
#include<time.h> 
void time_random(int *t)//定義取時間隨機數 
{ 	
	int i,number=0;
	srand((unsigned) time(NULL)); //用時間做種,每次產生隨機數不一樣,但還是可能會相同 
	for (i=0; i<20; i++)//取三十個隨機數,放入陣列t中 
	{	
		number = rand() % 201;//對21取餘 
		while(number==0)//若餘數為0,則一直取到不為0為止 
			number = rand() % 21; //產生1-20的隨機數
		t[i]=number; //將隨機數賦給陣列 
	} 
} 
void Print(int *a)//列印陣列函式 
{
	for(int i=0;a[i]!='\0';i++)//列印每一次排序的結果 
		printf("%d ",a[i]);
	printf("\n");//輸個換行符
}
void Insert(int *a)//插入排序 
{	
	int j;int k;
	int temp = 0; 
	for(int i=1;a[i]!='\0';i++)//假設第一個元素已經是有序佇列 
	{
		for(j=0;j<i&&a[j]<a[i];)
			j++;
		if(i!=j)
		{	
			temp = a[i];
			for(k = i-1;k>=j;k--)
				a[k+1]=a[k];
			a[j] = temp; 
		}	 	
	} 
}
void change(int *a,int *b)
{	
	int i,j = 0;
	for(i =  1;j<15;i++)
	{
		if(a[i]!=a[i-1])
		{
			b[j]=a[i-1];
			j++;
		}	
	}
	b[15]='\0';
}
void run(int *x)
{	
	int	loc ;
	int avglength;
	for(loc = 0;loc<15&&x[loc]<100;loc++)
		;//空語句,只為 loc++ 
	avglength = x[14]*2-x[0]-100;
	avglength /=15;
	for(int j = loc;j<15;j++)
	{	
		printf("\n%3d訪問",x[j]);
		x[j] = '0';
	}
	for(int j = loc-1;j>=0;j--)
	{
		printf("\n%3d訪問",x[j]);
		x[j] = '0';	
	}
	printf("\n\n平均尋道長度:%d",avglength); 
}
int main()
{		
	int t[21]={0};
	int tx[16];
	time_random(t);
	Insert(t);
	printf("磁頭在100號磁軌上,並向磁軌號增加的方向上移動\n"); 
	printf("\n15個程序訪問磁碟:\n");
	change(t,tx);
	Print(tx); 
	//開始執行 
	run(tx);	
	return 0;
}

什麼是磁碟排程?具體請看連結

----------->>>>>>磁碟排程演算法