• (七)磁盘调度


    要求:
    1。实现三种算法:
    1。先来先服务
    2。最短寻道优先(老师会给当前磁头的位置)
    3。电梯算法
    2。磁道服务顺序从指定的文本文件(TXT文件)中取出
    3。输出:
    第一行:磁道的服务顺序
    第二行:显示移动总道数
    本程序包括:FIFO,最短寻道优先调度算法,电梯算法

    磁盘调度
    #include<stdio.h>
    #include
    <iostream.h>
    #include
    <string.h>
    #include
    <math.h>

    const int MAXQUEUE=200; //定义队列最大数

    //结构体定义
    typedef struct node{
    int go;
    int visited;
    }qu;

    qu queue[MAXQUEUE];
    int quantity;

    int start; //定义开始时磁头所在位置

    //初始化函数
    void initial()
    {
    int i;

    for(i=0;i<MAXQUEUE;i++){
    queue[i].go
    =-1;
    queue[i].visited
    =0;
    }

    start
    =53;//磁头的初始位置
    }

    //读入磁道号流
    void readData()
    {
    FILE
    *fp;
    char fname[20];
    int temp,i;

    cout
    <<"请输入磁道号流文件名:";
    strcpy(fname,
    "7hard.txt");
    cin
    >>fname;

    if((fp=fopen(fname,"r"))==NULL){
    cout
    <<"错误,文件打不开,请检查文件名:)"<<endl;
    }
    else{
    while(!feof(fp)){
    fscanf(fp,
    "%d ",&temp);
    queue[quantity].go
    =temp;
    quantity
    ++;
    }
    cout
    <<endl<<"---------------------------------------------"<<endl;
    cout
    <<"所读入的磁道号流:";
    for(i=0;i<quantity;i++){
    cout
    <<queue[i].go<<" ";
    }
    cout
    <<endl<<"请求数为:"<<quantity<<endl;
    }
    }

    //FIFO算法
    void FIFO()
    {
    int i;
    int total=0;
    int current;

    cout
    <<endl<<"---------------------------------------------"<<endl;
    cout
    <<"FIFO算法的访问磁道号顺序流:";

    current
    =start;
    for(i=0;i<quantity;i++){
    cout
    <<queue[i].go<<" ";
    total
    +=abs(queue[i].go-current);
    current
    =queue[i].go;
    }
    cout
    <<endl<<"磁头移过的柱面数:"<<total;
    }

    //最短寻道优先调度算法
    void shortest()
    {
    int i,j,p;
    int total=0;
    int current;

    cout
    <<endl<<"---------------------------------------------"<<endl;
    cout
    <<"最短寻道优先调度算法的访问磁道号顺序流:";

    current
    =start;
    for(i=0;i<quantity;i++){
    p
    =0;
    while(queue[p].visited!=0){
    p
    ++;
    }
    for(j=p;j<quantity;j++){
    if((queue[j].visited==0)&&(abs(current-queue[p].go)>abs(current-queue[j].go))){
    p
    =j;
    }
    }
    cout
    <<queue[p].go<<" ";
    total
    +=abs(queue[p].go-current);
    queue[p].visited
    =1;
    current
    =queue[p].go;
    }
    cout
    <<endl<<"磁头移过的柱面数:"<<total;
    }

    //电梯算法
    void elevator()
    {
    int i,j,p,flag;
    int total=0;
    int current;

    cout
    <<endl<<"---------------------------------------------"<<endl;
    cout
    <<"电梯调度算法"<<endl;

    //磁头初始向里
    cout<<"磁头初始向里的访问磁道号顺序流:";

    current
    =start;
    for(i=0;i<quantity;i++){
    flag
    =1000;
    p
    =-1;
    for(j=0;j<quantity;j++){
    if((queue[j].visited==0)&&(queue[j].go>=current)){
    if(abs(queue[j].go-current)<flag){
    p
    =j;
    flag
    =abs(queue[j].go-current);
    }
    }
    }
    if(p!=-1){
    cout
    <<queue[p].go<<" ";
    total
    +=abs(queue[p].go-current);
    current
    =queue[p].go;
    queue[p].visited
    =1;
    }
    else{
    for(j=0;j<quantity;j++){
    if((queue[j].visited==0)&&(queue[j].go<current)){
    if(abs(queue[j].go-current)<flag){
    p
    =j;
    flag
    =abs(queue[j].go-current);
    }
    }
    }
    cout
    <<queue[p].go<<" ";
    total
    +=abs(queue[p].go-current);
    current
    =queue[p].go;
    queue[p].visited
    =1;
    }
    }
    cout
    <<endl<<"磁头移过的柱面数:"<<total<<endl;

    //磁头初始向外
    for(i=0;i<quantity;i++){
    queue[i].visited
    =0;
    }
    total
    =0;

    cout
    <<"磁头初始向外的访问磁道号顺序流:";

    current
    =start;
    for(i=0;i<quantity;i++){
    flag
    =1000;
    p
    =-1;
    for(j=0;j<quantity;j++){
    if((queue[j].visited==0)&&(queue[j].go<=current)){
    if(abs(queue[j].go-current)<flag){
    p
    =j;
    flag
    =abs(queue[j].go-current);
    }
    }
    }
    if(p!=-1){
    cout
    <<queue[p].go<<" ";
    total
    +=abs(queue[p].go-current);
    current
    =queue[p].go;
    queue[p].visited
    =1;
    }
    else{
    for(j=0;j<quantity;j++){
    if((queue[j].visited==0)&&(queue[j].go>current)){
    if(abs(queue[j].go-current)<flag){
    p
    =j;
    flag
    =abs(queue[j].go-current);
    }
    }
    }
    cout
    <<queue[p].go<<" ";
    total
    +=abs(queue[p].go-current);
    current
    =queue[p].go;
    queue[p].visited
    =1;
    }
    }
    cout
    <<endl<<"磁头移过的柱面数:"<<total;

    }

    //显示版权信息函数
    void version()
    {
    cout
    <<endl<<endl;

    cout
    <<" ┏━━━━━━━━━━━━━━━━━━━━━━━┓"<<endl;
    cout
    <<" ┃     磁盘调度算法系统        ┃"<<endl;
    cout
    <<" ┠───────────────────────┨"<<endl;
    cout
    <<" ┃   (c)All Right Reserved Neo       ┃"<<endl;
    cout
    <<" ┃      sony006@163.com          ┃"<<endl;
    cout
    <<" ┃     version 2004 build 1122      ┃"<<endl;
    cout
    <<" ┗━━━━━━━━━━━━━━━━━━━━━━━┛"<<endl;

    cout
    <<endl<<endl;
    }


    void main()
    {
    int i;

    version();
    initial();

    readData();

    FIFO();

    shortest();

    for(i=0;i<quantity;i++){
    queue[i].visited
    =0;
    }

    elevator();
    }
  • 相关阅读:
    ORACLE 如何产生一个随机数
    Oracle数据库一些操作信息
    EXP-00091和IMP-00010报错
    ORACLE数据库 memory_target SGA 大小
    linux如何查看端口被哪个进程占用的方法
    命令信息
    Linux负载均衡软件LVS
    oracle 字段信息
    oracle数据库的启动与关闭
    idea解除版本控制
  • 原文地址:https://www.cnblogs.com/FCWORLD/p/1896361.html
Copyright © 2020-2023  润新知