操作系統最短尋道時間優先(SSTF)和掃描(SCAN)算法

山東建築大學操作系統實驗三、磁盤調度算法的設計

實驗目的:

通過對磁盤調度算法的設計,深入理解提高磁盤訪問速度的原理。

實驗內容:

模擬實現磁盤調度算法:最短尋道時間優先(SSTF)和掃描(SCAN)算法。

實驗步驟:

理解各調度算法的工作原理

對給出的任意的磁盤請求序列、計算平均尋道長度;要求可定製磁盤請求序列長度、磁頭起始位置、磁頭移動方向。

測試:假設磁盤訪問序列:98,183,37,122,14,124,65,67;讀寫頭起始位置:53,方向:磁道增加的方向。輸入此類數據後,程序按照選定的算法,自動給出訪問序列,並且算出經過的磁道總數。

詳細代碼請看:https://download.csdn.net/download/qq_38971487/10887445

頭文件:



#ifndef SCAN_H_
#define SCAN_H_

#include<iostream>

#include <iterator>
#include <algorithm>

#include<sstream>
#include<string>
#include<math.h>


using namespace std;

struct Listnode{//結構項列表
	int data;
	Listnode *pre,*next;

	Listnode(){pre = NULL;next = NULL;} // @suppress("Class members should be properly initialized")
	Listnode(int data){
		this->data = data;
		pre = NULL;next = NULL;
	}
	Listnode(int data,Listnode *pre,Listnode *next){
		this->data = data;
		this->pre = pre;
		this->next = next;
	}
};

class TrackList{
public:
	TrackList(int initialCapacity=10);
	~TrackList();
	void insertList(int n);
	void sortList(int n);
	void putList();
	void SCANvisitList(int n,int data);
	void SSTFvisitList(int n,int data);

protected:
	Listnode *head;


};

void TrackList::sortList(int n){ // @suppress("Member declaration not found")
	int temp;
	Listnode *q,*p;
	p = head->next;
	while(p != head){
		q = p->next;
		while(q != head){
			if((p->data) > (q->data)){
				temp = p->data;
				p->data = q->data;
				q->data = temp;
			}
			q = q->next;
		}
		p = p->next;
	}
	cout<<"排序完成!"<<endl;
}

void TrackList::putList(){ // @suppress("Member declaration not found")
	Listnode* currentNode = head->next;
	cout<<"鏈表順序爲:"<<endl;
	while(currentNode != head){//循環輸出element
		cout<< currentNode->data<<" ";
		currentNode = currentNode->next;
	}
	cout<<endl;
}
//掃描(SCAN)算法
void TrackList::SCANvisitList(int n,int data){
	Listnode *p,*q;
	float distance = 0;
	float sum = 0;
	float ave = 0;
	p = head->next;
	while(p->data <= data){//找到data所在的範圍,p指向比data大的那一節點
		p = p->next;
		if(p == head)
			break;
	}
	if (p == head)
		p = head->pre;
	else if(p != head){
		int a = fabs(data - p->pre->data); //與前面節點的絕對值
		int b = fabs(data - p->data); //與後面節點的絕對值
		if (a < b)
			p = p->pre;
	}
	int i;
	cout<<"請輸入磁道移動方向(向外1,向內0)"<<endl;
	cin>>i;
	if (i == 1) {
		cout << "先向外後向內訪問:" << endl;
		cout << "將要被訪問的磁道號\t本次移動的距離\n";
		q = p->pre;
		while (p != head) {
			cout << p->data << "  ";
			distance = (float) fabs(data - (p->data));
			data = p->data;
			sum += distance;
			cout << distance << endl;
			p = p->next;
		}
		while (q != head) {
			cout << q->data << "  ";
			distance = (float) fabs((q->data) - data);
			data = q->data;
			sum += distance;
			cout << distance << endl;
			q = q->pre;
		}
		ave = sum / n;
		cout << "平均尋道長度爲:" << ave << endl;
	}
	if(i == 0){
		cout<<"先向內後向外訪問:"<<endl;
		cout<<"將要被訪問的磁道號\t本次移動的距離\n"<<endl;
		q = p;
		p = p->next;
		while(q != head){
			cout<<q->data<<"  ";
			distance = fabs((q->data) - data);
			cout<<distance<<endl;
			data = q->data;
			sum += distance;
			q = q->pre;
		}
		while(p != head){
			cout<<p->data<<"  ";
			distance = (float)fabs( data - (p->data) );
			cout<<distance<<endl;
			data = p->data;
			sum += distance;
			p = p->next;
		}
		ave = sum / n;
		cout << "平均尋道長度爲:" << ave << endl;
	}
}
//最短尋道時間優先(SSTF)
void TrackList::SSTFvisitList(int n,int data){
	Listnode *p;
	float distance = 0;
	float sum = 0;
	float ave = 0;
	int a,b,i;
	p = head->next;
	while (p->data <= data) { //找到data所在的範圍,p指向比data大的那一節點
		p = p->next;
		if(p == head)
			break;
	}
	if(p == head)
		p = p->pre;
	else {
		a = fabs(data - p->pre->data); //與前面節點的絕對值
		b = fabs(data - p->data); //與後面節點的絕對值
		if (a < b) //比較得到離磁頭最近的磁道號
			p = p->pre;
	}
	cout<<"將要被訪問的磁道號\t本次移動的距離"<<endl;
	for(i = 0;i < n;++i){
		cout<<p->data<<"  ";
		distance = fabs(data - p->data);
		cout<<distance<<endl;
		data = p->data;
		sum += distance;
		Listnode *q;
		q = p;
		//比較絕對值,判斷哪個是離當前磁頭最近的磁道
		if(fabs(data - p->pre->data) < fabs(data - p->next->data)){
			p = p->pre;
			p->next = q->next;
			q->next->pre = p;
		}
		else if(fabs(data - p->pre->data) >= fabs(data - p->next->data)){
			p = p->next;
			p->pre = q->pre;
			q->pre->next = p;
		}
		if (p == head) {
			p = head->next;
			while (p->data <= data) { //找到data所在的範圍,p指向比data大的那一節點
				p = p->next;
			}
			a = fabs(data - p->pre->data); //與前面節點的絕對值
			b = fabs(data - p->data); //與後面節點的絕對值
			if (a < b) //比較得到離磁頭最近的磁道號
				p = p->pre;
		}
		delete q;//刪除訪問過的節點
	}
	ave = sum/n;
	cout << "平均尋道長度爲:" << ave << endl;
}

#endif /* SCAN_H_ */

test.cpp:

/*
 * test.cpp
 *
 *  Created on: 2018年12月16日
 *      Author: 小夥
 */

#include "SCAN.h"

int main()
{
	int n;
	cout<<"請輸入進程要訪問的磁道總數:"<<endl;
	cin>>n;
	TrackList y(n);
	y.insertList(n);
	//y.putList();
	y.sortList(n);
	//y.putList();
	int m;
	cout<<"請輸入磁頭的起始位置:"<<endl;
	cin>>m;
	int choose;
	cout<<"請選擇磁盤調度算法(SSTF:0,SCAN:1)"<<endl;
	cin>>choose;
	if(choose == 0)
		y.SSTFvisitList(n,m);
	if(choose == 1)
		y.SCANvisitList(n,m);
	return 0;
}


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章