山東建築大學操作系統實驗三、磁盤調度算法的設計
實驗目的:
通過對磁盤調度算法的設計,深入理解提高磁盤訪問速度的原理。
實驗內容:
模擬實現磁盤調度算法:最短尋道時間優先(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;
}