磁盤調度算法

參考博客:http://blog.csdn.net/jaster_wisdom/article/details/52468743
常用磁盤調度算法:FCFS、SSTF、SCAN、CSCAN(共四種)
/* FCFS(先來先服務)*/
#include <iostream>
#include <vector>
#include <cstdlib>
#include <ctime>
#include <cmath>
#include <algorithm>
#include <fstream>
using namespace std;

int pos = 0;
int dis = 0;
double ave_dis = 0;

void request(vector<int> &vec)
{
    cout<<"隨機生成磁盤序列: "<<endl;
    int n = 0;
    srand(time(NULL));
    n = rand() % 20 + 1;
    int temp = 0;
    for(int i = 0; i < n; i++)
    {
        temp = rand() % 100;
        vec.push_back(temp);
        cout<<temp<<" ";
    }
    cout<<endl;
    pos = rand() % 100;
    cout<<"當前磁道: "<<pos<<endl;
}

void compute_dis(vector<int>vec,int &dis,double &ave_dis)
{
    ave_dis = (double)dis / (double)vec.size();
}

void print()
{
    cout<<endl;
    cout<<"計算得,磁頭移動的總距離爲: "<<dis<<endl;
    cout<<"磁頭移動平均距離爲: "<<ave_dis<<endl;
}

// 先來先服務算法
void FCFS(vector<int>vec,int pos)
{
    dis = 0;
    ave_dis = 0;
    cout<<pos;
    for(vector<int>::iterator it=vec.begin();it!=vec.end();it++)
    {
        dis += abs(pos - *it);
        cout<<"->"<<*it;
        pos = *it;
    }
    compute_dis(vec,dis,ave_dis);
}

int main()
{
    while(1)
    {
        vector<int> vec;
        while(!vec.empty())
            vec.pop_back();
        request(vec);
        FCFS(vec,pos);
        print();
        break;
    }
    return 0;
}

/* SSTF(最短尋道時間優先)*/
#include <iostream>
#include <vector>
#include <cstdlib>
#include <ctime>
#include <cmath>
#include <algorithm>
#include <fstream>
using namespace std;

int pos = 0;
int dis = 0;
double ave_dis = 0;

void request(vector<int> &vec)
{
    cout<<"隨機生成磁盤序列: "<<endl;
    int n = 0;
    srand(time(NULL));
    n = rand() % 20 + 1;
    int temp = 0;
    for(int i = 0; i < n; i++)
    {
        temp = rand() % 100;
        vec.push_back(temp);
        cout<<temp<<" ";
    }
    cout<<endl;
    pos = rand() % 100;
    cout<<"當前磁道: "<<pos<<endl;
}

void compute_dis(vector<int>vec,int &dis,double &ave_dis)
{
    ave_dis = (double)dis / (double)vec.size();
}

void print()
{
    cout<<endl;
    cout<<"計算得,磁頭移動的總距離爲: "<<dis<<endl;
    cout<<"磁頭移動平均距離爲: "<<ave_dis<<endl;
}

// 最短尋道時間算法
void SSTF(vector<int>vec,int pos)
{
    dis = 0;
    ave_dis = 0;
    sort(vec.begin(),vec.end());
    int i = 0;
    for(vector<int>::iterator it=vec.begin();it!=vec.end();it++)
    {
        if(pos >= *it)
            i++;
    }
    int count = 0;
    int left  = i-1;
    int right = i;
    while(count < vec.size())
    {
        if((left >= 0 && abs(vec[right]-pos) > abs(vec[left]-pos)) ||
        right >= vec.size())
        {
            dis += abs(vec[left] - pos);
            cout<<"->"<<vec[left];
            pos = vec[left];
            left--;
        }
        else
        {
            dis += abs(vec[right] - pos);
            cout<<"->"<<vec[right];
            pos = vec[right];
            right++;
        }
        count++;
    }
    compute_dis(vec,dis,ave_dis);
}

int main()
{
    while(1)
    {
        vector<int> vec;
        while(!vec.empty())
            vec.pop_back();
        request(vec);
        cout<<pos;
        SSTF(vec,pos);
        print();
        break;
    }
    return 0;
}

/* SCAN(掃描算法,雙向)*/
#include <iostream>
#include <vector>
#include <cstdlib>
#include <ctime>
#include <cmath>
#include <algorithm>
#include <fstream>
using namespace std;

int pos = 0;
int dis = 0;
double ave_dis = 0;

void request(vector<int> &vec)
{
    cout<<"隨機生成磁盤序列: "<<endl;
    int n = 0;
    srand(time(NULL));
    n = rand() % 20 + 1;
    int temp = 0;
    for(int i = 0; i < n; i++)
    {
        temp = rand() % 100;
        vec.push_back(temp);
        cout<<temp<<" ";
    }
    cout<<endl;
    pos = rand() % 100;
    cout<<"當前磁道: "<<pos<<endl;
}

void compute_dis(vector<int>vec,int &dis,double &ave_dis)
{
    ave_dis = (double)dis / (double)vec.size();
}

void print()
{
    cout<<endl;
    cout<<"計算得,磁頭移動的總距離爲: "<<dis<<endl;
    cout<<"磁頭移動平均距離爲: "<<ave_dis<<endl;
}

// 掃描算法
void SCAN(vector<int>vec,int pos)
{
    dis = 0;
    ave_dis = 0;
    sort(vec.begin(),vec.end());
    int i = 0;
    for(vector<int>::iterator it=vec.begin();it!=vec.end();it++)
    {
        if(pos >= *it)
            i++;
    }
    int left  = i-1;
    int right = i;
    while(left >= 0)
    {
        dis += abs(pos - vec[left]);
        cout<<"->"<<vec[left];
        pos = vec[left];
        left--;
    }
    while(right < vec.size())
    {
        dis += abs(pos - vec[right]);
        cout<<"->"<<vec[right];
        pos = vec[right];
        right++;
    }
    compute_dis(vec,dis,ave_dis);
}

int main()
{
    while(1)
    {
        vector<int> vec;
        while(!vec.empty())
            vec.pop_back();
        request(vec);

        cout<<pos;
        SCAN(vec,pos);
        print();
        break;
    }
    return 0;
}

/* CSCAN(循環掃描算法,單向)*/
#include <iostream>
#include <vector>
#include <cstdlib>
#include <ctime>
#include <cmath>
#include <algorithm>
#include <fstream>
using namespace std;

int pos = 0;
int dis = 0;
double ave_dis = 0;

void request(vector<int> &vec)
{
    cout<<"隨機生成磁盤序列: "<<endl;
    int n = 0;
    srand(time(NULL));
    n = rand() % 20 + 1;
    int temp = 0;
    for(int i = 0; i < n; i++)
    {
        temp = rand() % 100;
        vec.push_back(temp);
        cout<<temp<<" ";
    }
    cout<<endl;
    pos = rand() % 100;
    cout<<"當前磁道: "<<pos<<endl;
}

void compute_dis(vector<int>vec,int &dis,double &ave_dis)
{
    ave_dis = (double)dis / (double)vec.size();
}

void print()
{
    cout<<endl;
    cout<<"計算得,磁頭移動的總距離爲: "<<dis<<endl;
    cout<<"磁頭移動平均距離爲: "<<ave_dis<<endl;
}

// 循環掃描算法
void CSCAN(vector<int>vec,int pos)
{
    dis = 0;
    ave_dis = 0;
    sort(vec.begin(),vec.end());
    int i = 0;
    for(vector<int>::iterator it=vec.begin();it!=vec.end();it++)
    {
        if(pos >= *it)
            i++;
    }
    int left  = i-1;
    int right = i;
    while(left >= 0)
    {
        dis += abs(pos - vec[left]);
        cout<<"->"<<vec[left];
        pos = vec[left];
        left--;
    }
    pos = 100;
    int len = vec.size()-1;
    while(len >= right)
    {
        dis += abs(pos - vec[len]);
        cout<<"->"<<vec[len];
        pos = vec[len];
        len--;
    }
    compute_dis(vec,dis,ave_dis);
}

int main()
{
    while(1)
    {
        vector<int> vec;
        while(!vec.empty())
            vec.pop_back();
        request(vec);

        cout<<pos;
        CSCAN(vec,pos);
        print();
        break;
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章