模拟最短寻道时间优先SSTF算法

来源:互联网 发布:ip正则表达式js 编辑:程序博客网 时间:2024/06/08 04:31

选择这样的进程,其要求访问的磁道与当前磁头所在的磁道距离最近,以使每次的寻道时间最短

#include <malloc.h> #include<stdio.h> #include<math.h> #include <limits.h> typedef struct track{     int column;     struct track *next; }node; int location;       /*当前磁头位置*/ int sum_move;      /*磁头移动总磁道数*/ float ave_move;    /*磁头移动平均磁道数*/ int direction;     /*磁头移动的方向:direction=1 表示从里向外移动,direction=-1 表示从 外向里移动*/ int found_node(node *head)    /*找到离当前磁头最近且与direction 同方向的磁道*/ {    node *p,*t;    int panduan,truecol=0,jiange=10000;    p=head;    t=head;    while(p&&t){    if(direction==1){        while(p){            if(p->column>=location)            {                panduan=p->column-location;                if(panduan<jiange)                {                    truecol=p->column;                    jiange=panduan;                }            }            p=p->next;        }        if(truecol==0){            direction=-1;        }    }    if(direction==-1){        while(t){            if(t->column<location)            {                panduan=location-t->column;                if(panduan<jiange)                {                    truecol=t->column;                    jiange=panduan;                }            }            t=t->next;        }        if(truecol==0){            direction=1;        }    }}    sum_move+=jiange;    location=truecol;    printf("%d   ",truecol);    return truecol;}                  node *SCAN(node *head)    /*调用found_node 找到满足条件的磁道,并从head 链表中删除该结点*/ {    node *pre,*p;    int a;    a=found_node(head);    pre=NULL;    p=head;    while(p&&(p->column!=a)){        pre=p;        p=p->next;    }    if(p){        if(!pre) {head=head->next;}        else pre->next=p->next;    }    return head;} void main() {    int i,num,disk_length;     node *head,*p1,*p2;     head=NULL;    printf("输入磁盘柱面总数:\n");     scanf("%d",&disk_length);     printf("输入磁盘读写请求总数:\n");     scanf("%d",&num);     printf("输入磁盘读写请求柱面号序列:\n");     for(i=1;i<=num;i++)     {        p1=(node *)malloc(sizeof(node));        scanf("%d",&p1->column);        if(head==NULL){            head=p1;            p2=p1;        }        else{            p2->next=p1;            p2=p1;        }        p2->next=NULL;    }     printf("输入磁盘当前位置为:\n");    scanf("%d",&location);    printf("输入磁盘移动方向(1 表示从里向外移动,-1 表示从外向里移动):\n");     scanf("%d",&direction);     printf("\n依次访问的柱面号为:\n");    sum_move=0;    for(i=1;i<=num;i++)    {        SCAN(head);    }    ave_move=(float)sum_move/num;    printf("\n总的移动柱面次数为:%d\n",sum_move);    printf("\n平均移动次数为:%.2f\n",ave_move);}
阅读全文
0 0
原创粉丝点击