详细代码实现
时间: 2023-12-17 17:11:50 浏览: 63
好的,以下是详细的 C++ 代码实现:
```
#include <iostream>
#include <algorithm>
#include <vector>
#include <cstdlib>
#include <ctime>
using namespace std;
const int CYLINDERS = 5000;
const int REQUESTS = 1000;
//FCFS磁盘调度算法
int fcfs(int initialPosition, const vector<int>& requests) {
int totalMovement = 0;
int currentPosition = initialPosition;
for (int i = 0; i < REQUESTS; ++i) {
totalMovement += abs(requests[i] - currentPosition);
currentPosition = requests[i];
}
return totalMovement;
}
//SSTF磁盘调度算法
int sstf(int initialPosition, const vector<int>& requests) {
int totalMovement = 0;
int currentPosition = initialPosition;
vector<int> remainingRequests(requests.begin(), requests.end());
for (int i = 0; i < REQUESTS; ++i) {
//找到距离当前位置最近的请求
int nextRequest = *min_element(remainingRequests.begin(), remainingRequests.end(),
[=](int a, int b) { return abs(a - currentPosition) < abs(b - currentPosition); });
totalMovement += abs(nextRequest - currentPosition);
currentPosition = nextRequest;
//从剩余请求中移除当前请求
remainingRequests.erase(find(remainingRequests.begin(), remainingRequests.end(), nextRequest));
}
return totalMovement;
}
//SCAN磁盘调度算法
int scan(int initialPosition, const vector<int>& requests) {
int totalMovement = 0;
int currentPosition = initialPosition;
vector<int> remainingRequests(requests.begin(), requests.end());
//按请求顺序排序
sort(remainingRequests.begin(), remainingRequests.end());
//找到初始位置的索引
auto initialPositionIterator = find(remainingRequests.begin(), remainingRequests.end(), initialPosition);
int initialPositionIndex = distance(remainingRequests.begin(), initialPositionIterator);
//处理初始位置两边的请求
vector<int> leftRequests(remainingRequests.begin(), initialPositionIterator);
vector<int> rightRequests(initialPositionIterator + 1, remainingRequests.end());
//先处理往右扫描的请求
for (int i = initialPositionIndex; i < REQUESTS; ++i) {
totalMovement += abs(remainingRequests[i] - currentPosition);
currentPosition = remainingRequests[i];
}
//再处理往左扫描的请求
for (int i = initialPositionIndex - 1; i >= 0; --i) {
totalMovement += abs(remainingRequests[i] - currentPosition);
currentPosition = remainingRequests[i];
}
return totalMovement;
}
//C-SCAN磁盘调度算法
int cscan(int initialPosition, const vector<int>& requests) {
int totalMovement = 0;
int currentPosition = initialPosition;
vector<int> remainingRequests(requests.begin(), requests.end());
//按请求顺序排序
sort(remainingRequests.begin(), remainingRequests.end());
//找到初始位置的索引
auto initialPositionIterator = find(remainingRequests.begin(), remainingRequests.end(), initialPosition);
int initialPositionIndex = distance(remainingRequests.begin(), initialPositionIterator);
//处理初始位置两边的请求
vector<int> leftRequests(remainingRequests.begin(), initialPositionIterator);
vector<int> rightRequests(initialPositionIterator + 1, remainingRequests.end());
//先处理往右扫描的请求
for (int i = initialPositionIndex; i < REQUESTS; ++i) {
totalMovement += abs(remainingRequests[i] - currentPosition);
currentPosition = remainingRequests[i];
}
//处理最右侧的请求
totalMovement += (CYLINDERS - 1 - currentPosition);
//再处理往左扫描的请求
currentPosition = 0;
for (int i = 0; i < initialPositionIndex; ++i) {
totalMovement += abs(remainingRequests[i] - currentPosition);
currentPosition = remainingRequests[i];
}
return totalMovement;
}
//LOOK磁盘调度算法
int look(int initialPosition, const vector<int>& requests) {
int totalMovement = 0;
int currentPosition = initialPosition;
vector<int> remainingRequests(requests.begin(), requests.end());
//按请求顺序排序
sort(remainingRequests.begin(), remainingRequests.end());
//找到初始位置的索引
auto initialPositionIterator = find(remainingRequests.begin(), remainingRequests.end(), initialPosition);
int initialPositionIndex = distance(remainingRequests.begin(), initialPositionIterator);
//处理初始位置两边的请求
vector<int> leftRequests(remainingRequests.begin(), initialPositionIterator);
vector<int> rightRequests(initialPositionIterator + 1, remainingRequests.end());
//先处理往右扫描的请求
for (int i = initialPositionIndex; i < REQUESTS; ++i) {
totalMovement += abs(remainingRequests[i] - currentPosition);
currentPosition = remainingRequests[i];
//如果已经处理完所有请求,或者当前请求是最后一个请求,就跳出循环
if ((i == REQUESTS - 1) || (remainingRequests[i + 1] > currentPosition)) {
break;
}
}
//再处理往左扫描的请求
for (int i = initialPositionIndex - 1; i >= 0; --i) {
totalMovement += abs(remainingRequests[i] - currentPosition);
currentPosition = remainingRequests[i];
//如果已经处理完所有请求,或者当前请求是第一个请求,就跳出循环
if ((i == 0) || (remainingRequests[i - 1] < currentPosition)) {
break;
}
}
return totalMovement;
}
//C-LOOK磁盘调度算法
int clook(int initialPosition, const vector<int>& requests) {
int totalMovement = 0;
int currentPosition = initialPosition;
vector<int> remainingRequests(requests.begin(), requests.end());
//按请求顺序排序
sort(remainingRequests.begin(), remainingRequests.end());
//找到初始位置的索引
auto initialPositionIterator = find(remainingRequests.begin(), remainingRequests.end(), initialPosition);
int initialPositionIndex = distance(remainingRequests.begin(), initialPositionIterator);
//处理初始位置两边的请求
vector<int> leftRequests(remainingRequests.begin(), initialPositionIterator);
vector<int> rightRequests(initialPositionIterator + 1, remainingRequests.end());
//先处理往右扫描的请求
for (int i = initialPositionIndex; i < REQUESTS; ++i) {
totalMovement += abs(remainingRequests[i] - currentPosition);
currentPosition = remainingRequests[i];
//如果已经处理完所有请求,或者当前请求是最后一个请求,就跳出循环
if ((i == REQUESTS - 1) || (remainingRequests[i + 1] > currentPosition)) {
break;
}
}
//再处理往左扫描的请求
for (int i = 0; i < initialPositionIndex; ++i) {
totalMovement += abs(remainingRequests[i] - currentPosition);
currentPosition = remainingRequests[i];
//如果已经处理完所有请求,或者当前请求是最后一个请求,就跳出循环
if ((i == initialPositionIndex - 1) || (remainingRequests[i + 1] > currentPosition)) {
break;
}
}
return totalMovement;
}
int main(int argc, char** argv) {
if (argc != 2) {
cout << "Usage: " << argv[0] << " initialPosition\n";
return 1;
}
//解析命令行参数
int initialPosition = atoi(argv[1]);
//生成随机请求序列
srand(time(nullptr));
vector<int> requests(REQUESTS);
for (int i = 0; i < REQUESTS; ++i) {
requests[i] = rand() % CYLINDERS;
}
cout << "FCFS: " << fcfs(initialPosition, requests) << "\n";
cout << "SSTF: " << sstf(initialPosition, requests) << "\n";
cout << "SCAN: " << scan(initialPosition, requests) << "\n";
cout << "C-SCAN: " << cscan(initialPosition, requests) << "\n";
cout << "LOOK: " << look(initialPosition, requests) << "\n";
cout << "C-LOOK: " << clook(initialPosition, requests) << "\n";
return 0;
}
```
代码中实现了六种磁盘调度算法:FCFS、SSTF、SCAN、C-SCAN、LOOK 和 C-LOOK。程序首先解析了命令行参数,然后生成了一个随机的请求序列。接着,程序依次调用每个算法,并输出每个算法需要移动的磁头总距离。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)