1、首先假设磁盘磁道数为1500,磁头初始位置可任意设置。 2、用随机数生成函数产生“磁道号”序列(即磁盘请求的位置),共产生400个。其中50%位 于0~499,25%分布在500~999,25%分布在1000~1499。具体的产生方法可参考“题目一 页面 置换算法的模拟实现及命中率对比”。 3、计算及比较每种磁盘调度算法下的磁头移动道数。
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
#include <cstdlib>
#include <ctime>
using namespace std;
// 磁盘调度算法枚举
enum DiskSchedulingAlgorithm {
FCFS,
SSTF,
SCAN,
CSCAN
};
// 定义磁盘请求结构体
struct DiskRequest {
int trackNumber; // 磁道号
bool visited; // 是否被访问过
DiskRequest(int track) : trackNumber(track), visited(false) {}
};
// 计算磁道间的距离
int distance(int track1, int track2) {
return abs(track1 - track2);
}
// 先来先服务 (FCFS) 算法
int FCFSf(const vector<DiskRequest>& requests, int initialPosition) {
int totalMovement = 0;
int currentTrack = initialPosition;
if(requests[0].trackNumber!=currentTrack){
cout << currentTrack << "->";
}
for (const auto& request : requests) {
cout << request.trackNumber << "->";
totalMovement += distance(currentTrack, request.trackNumber);
currentTrack = request.trackNumber;
}
cout << "end" << endl;
cout << endl;
cout << endl;
cout << endl;
return totalMovement;
}
// 最短寻道时间优先 (SSTF) 算法
int SSTFf(vector<DiskRequest> requests, int initialPosition) {
int totalMovement = 0;
int currentTrack = initialPosition;
int sum=0;
vector<DiskRequest> sortedRequests;
while(sum<400){
int min=1500;
int ps=0;
for(int i=0 ; i<400 ;++i){
if(min>abs(requests[i].trackNumber-initialPosition)&&requests[i].visited==0){
min=abs(requests[i].trackNumber-initialPosition);
ps=i;
}
}
++sum;
requests[ps].visited=1;
initialPosition = requests[ps].trackNumber;
sortedRequests.push_back(requests[ps]);
}
if(sortedRequests[0].trackNumber!=currentTrack){
cout << currentTrack << "->";
}
for (const auto& request : sortedRequests) {
cout << request.trackNumber << "->";
totalMovement += distance(currentTrack, request.trackNumber);
currentTrack = request.trackNumber;
}
cout << "end" << endl;
cout << endl;
cout << endl;
cout << endl;
return totalMovement;
}
// 扫描 (SCAN) 算法
int SCANf(const vector<DiskRequest>& requests, int initialPosition, int maxTrack) {
int totalMovement = 0;
int currentTrack = initialPosition;
int ps=0;
vector<DiskRequest> requestsCopy = requests;
sort(requestsCopy.begin(), requestsCopy.end(), [](const DiskRequest& a, const DiskRequest& b) {
return a.trackNumber < b.trackNumber;
});
for(int i=0; i<400 ;++i){
if(requestsCopy[i].trackNumber>=initialPosition){
ps=i;
break;
}
}
if(requestsCopy[0].trackNumber!=currentTrack){
cout << currentTrack << "->";
}
for (int i=ps ; i<400 ;++i) {
totalMovement += distance(currentTrack, requestsCopy[i].trackNumber);
cout << requestsCopy[i].trackNumber << "->";
currentTrack = requestsCopy[i].trackNumber;
}
for (int i=ps-1 ; i>0 ;--i) {
totalMovement += distance(currentTrack, requestsCopy[i].trackNumber);
cout << requestsCopy[i].trackNumber << "->";
currentTrack = requestsCopy[i].trackNumber;
}
cout << "end" << endl;
cout << endl;
cout << endl;
cout << endl;
return totalMovement;
}
// 循环扫描 (C-SCAN) 算法
int CSCANf(const vector<DiskRequest>& requests, int initialPosition, int maxTrack) {
int totalMovement = 0;
int currentTrack = initialPosition;
int ps=0;
vector<DiskRequest> requestsCopy = requests;
sort(requestsCopy.begin(), requestsCopy.end(), [](const DiskRequest& a, const DiskRequest& b) {
return a.trackNumber < b.trackNumber;
});
for(int i=0; i<400 ;++i){
if(requestsCopy[i].trackNumber>=initialPosition){
ps=i;
break;
}
}
if(requestsCopy[0].trackNumber!=currentTrack){
cout << currentTrack << "->";
}
for (int i=ps ; i<400 ;++i) {
totalMovement += distance(currentTrack, requestsCopy[i].trackNumber);
cout << requestsCopy[i].trackNumber << "->";
currentTrack = requestsCopy[i].trackNumber;
}
totalMovement += distance(currentTrack, 0);
cout << currentTrack << "->0->";
currentTrack = 0;
for (int i=0 ; i<ps ;++i) {
totalMovement += distance(currentTrack, requestsCopy[i].trackNumber);
cout << requestsCopy[i].trackNumber << "->";
currentTrack = requestsCopy[i].trackNumber;
}
cout << "end" << endl;
cout << endl;
cout << endl;
cout << endl;
return totalMovement;
}
// 执行磁盘调度算法并返回总移动距离
int executeDiskSchedulingAlgorithm(const vector<DiskRequest>& requests, int initialPosition, DiskSchedulingAlgorithm algorithm, int maxTrack) {
switch (algorithm) {
case FCFS:
return FCFSf(requests, initialPosition);
case SSTF:
return SSTFf(requests, initialPosition);
case SCAN:
return SCANf(requests, initialPosition, maxTrack);
case CSCAN:
return CSCANf(requests, initialPosition, maxTrack);
default:
cerr << "Unknown disk scheduling algorithm!" << endl;
return -1;
}
}
//随机生成磁道请求
void getrandomDiskrequest(vector<DiskRequest> &requests){
srand(time(nullptr));//设置随机数种子为当前时间
int num = 400;
cout << " 随机生成400个磁道请求,其中50%位于0~499,25%分布在500~999,25%分布在1000~1499。 磁道请求序列为:" << endl;
for( int i = 0; i < num/2; ++i){
int diskrequest = rand()%500;
cout << diskrequest << " ";
requests.push_back(diskrequest);
}
for(int i= 0; i < num/4; ++i){
int diskrequest = rand()%500+500;
cout << diskrequest << " ";
requests.push_back(diskrequest);
}
for(int i= 0; i < num/4; ++i){
int diskrequest = rand()%1000+500;
cout << diskrequest << " ";
requests.push_back(diskrequest);
}
cout << endl;
cout << endl;
}
int main() {
vector<DiskRequest> requests;
getrandomDiskrequest(requests);
int initialPosition = 500;
int maxTrack = 1500;
cout << "FCFS:" << endl;
int fcfs=executeDiskSchedulingAlgorithm(requests, initialPosition, FCFS, maxTrack);
cout << "SSTF:" << endl;
int sstf=executeDiskSchedulingAlgorithm(requests, initialPosition, SSTF, maxTrack);
cout << "SCAN:" << endl;
int scan=executeDiskSchedulingAlgorithm(requests, initialPosition, SCAN, maxTrack);
cout << "CSCAN:" << endl;
int cscan=executeDiskSchedulingAlgorithm(requests, initialPosition, CSCAN, maxTrack);
cout << "FCFS 算法磁头移动道数: " << fcfs << " 平均磁头移动道数: " << (double)fcfs/400 <<endl;
cout << "SSTF 算法磁头移动道数: " << sstf << " 平均磁头移动道数: " << (double)sstf/400 <<endl;
cout << "SCAN 算法磁头移动道数: " << scan << " 平均磁头移动道数: " << (double)scan/400 <<endl;
cout << "C-SCAN 算法磁头移动道数: " << cscan << " 平均磁头移动道数: " << (double)cscan/400 <<endl;
system("pause");
return 0;
}