• 〔OS〕磁盘调度算法


    C++ 实现的 FCFS、SSTF、SCAN 和 CSCAN 四种磁盘调度算法。

    /**磁盘调度算法**/
    /**by Darius**/
    #include <iostream>
    #include <algorithm>
    #include <cstdio>
    
    #define MAX 1000
    using namespace std;
    
    //求平均寻道长度
    double average(int *length, int n){
    	double sum=0;
    	int i;
    	for(i=0;i<n;i++)
    		sum+=length[i];
    	return sum/n;
    }
    
    //先来先服务寻道算法
    void First_come_first_server(int *a, int n, int now) {
        int i, k=0;
        int t = n;
        int next[MAX], length[MAX];
        int visit[MAX] = {0};
        while(t--)
        {
            for(i = 0;i < n;i++) {
                if(visit[i])
                    continue;
                else {
                    length[k] = abs(a[i] - now);
                    next[k++] = a[i];
                    visit[i] = 1;
                    now = a[i];
                }
            }
        }
        cout << endl << "下一个磁道  " << "移动距离" << endl;
        for (i = 0; i < n; i++)
            cout << next[i] << "           " << length[i] << endl;
        cout << "平均寻道长度:";
        printf("%.2f
    
    ", average(length, n));
    }
    //最短寻道时间优先算法
    void Shortest_seek_time_first(int *a, int n, int now) {
        int i, min, k = 0;
        int flag;//最短路径的下标
        int t = n;
        int next[MAX], length[MAX];
        int visit[MAX] = {0};//访问数组,已经访问过的为1
        //寻道n次
        while (t--) {
            min = 999999;
            //找没有访问过的中最近的
            for (i = 0; i < n; i++) {
                if (visit[i])
                    continue;
                if (abs(a[i] - now) < min) {
                    flag = i;
                    min = abs(a[i] - now);
                }
            }
            length[k] = min;//移动的距离
            next[k++] = a[flag];//下一个被访问的磁道号
            visit[flag] = 1;//访问过的置1
            now = a[flag];//磁道移动到当前位置
        }
        cout << endl << "下一个磁道  " << "移动距离" << endl;
        for (i = 0; i < n; i++)
            cout << next[i] << "           " << length[i] << endl;
        cout << "平均寻道长度:";
        printf("%.2f
    
    ", average(length, n));
    }
    
    //扫描算法
    void Scan(int *a, int n, int now){
    	int i,flag=0,k=0;
    	int next[MAX],length[MAX];
    	sort(a,a+n);//从小到大排序
    	//寻找开始磁道
    	for(i=0;i<n;i++){
    		if(a[i]>=now){
    			flag=i;
    			break;
    		}
    	}
    
    	//往递增方向访问
    	for(i=flag;i<n;i++){
    		next[k]=a[i];
    		length[k++]=abs(a[i]-now);
    		now=a[i];
    	}
    
    	//回来往递减方向访问
    	for(i=flag-1;i>=0;i--){
    		next[k]=a[i];
    		length[k++]=abs(a[i]-now);
    		now=a[i];
    	}
    
    	cout<<endl<<"下一个磁道  "<<"移动距离"<<endl;
    	for(i=0;i<n;i++)
    		cout<<next[i]<<"           "<<length[i]<<endl;
    	cout<<"平均寻道长度:";
    	printf("%.2f
    
    ", average(length, n));
    }
    
    void Circle_scan(int *a, int n, int now){
    	int i,flag=0,k=0;
    	int next[MAX],length[MAX];
    	sort(a,a+n);//从小到大排序
    	for(i=0;i<n;i++){
    		if(a[i]>=now){
    			flag=i;
    			break;
    		}
    	}
    
    	//往递增方向访问
    	for(i=flag;i<n;i++){
    		next[k]=a[i];
    		length[k++]=abs(a[i]-now);
    		now=a[i];
    	}
    
    	//循环往递增方向访问
    	for(i=0;i<flag;i++){
    		next[k]=a[i];
    		length[k++]=abs(a[i]-now);
    		now=a[i];
    	}
    
    	cout<<endl<<"下一个磁道  "<<"移动距离"<<endl;
    	for(i=0;i<n;i++)
    		cout<<next[i]<<"           "<<length[i]<<endl;
    	cout<<"平均寻道长度:";
    	printf("%.2f
    
    ", average(length, n));
    }
    
    int main(){
    	int a[MAX];//存放要用到的磁道号
    	int start;//开始的磁道
    	int n,i,flag=1;
    	cout<<"一共要用到的磁道数:"<<endl;
    	cin>>n;
    	cout<<"随机的磁道:"<<endl;
            srand((int)time(0));
    	for(i=0;i<n;i++) {
            a[i] = rand()%100;
            cout<<a[i]<<"    ";
    	}
    	cout<<endl<<"开始的磁道:"<<endl;
    	cin>>start;
    
    	//磁盘调度目录
    	while(flag){
    		cout<<"请选一种磁盘调度算法:"<<endl;;
    		cout<<"1.先来先服务寻道算法"<<endl;
    		cout<<"2.最短寻道时间优先"<<endl;
    		cout<<"3.扫描算法"<<endl;
    		cout<<"4.循环扫描算法"<<endl;
    		cout<<"0.退出"<<endl;
    		cin>>flag;
    		switch(flag){
    		    case 1:
    		        First_come_first_server(a,n,start);
    		        break;
    		    case 2:
    		        Shortest_seek_time_first(a, n, start);break;
                        case 3:
                            Scan(a, n, start);break;
                        case 4:
                            Circle_scan(a, n, start);break;
                        case 0:
    			break;
    		}
    	}
    	return 0;
    }
    
  • 相关阅读:
    探讨e.target与e.currentTarget
    JavaScript事件模型
    博客
    angular创建自定义指令的四种方式
    jqueryMobile模块整理—图标(icons)
    jqueryMobile模块整理—按钮(buttons)
    Visio 2010,如何打开多个窗口
    Ajax.ActionLink浏览器中代码解析问题
    响应式布局
    jquery的each
  • 原文地址:https://www.cnblogs.com/DariusOrz/p/13091707.html
Copyright © 2020-2023  润新知