flag=0;}}/" />
最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 正文

操作系统磁盘调度算法

来源:动视网 责编:小OO 时间:2025-09-25 21:32:31
文档

操作系统磁盘调度算法

#include#include#include#defineN20typedefstruct{intnum;//磁道intflag;//1个标记量}V,*v;//*********************************************************************voidInitial(v*a,intn){//初始化磁道请求printf("请输入请求顺序(磁道范围是0-199):\\n");for(inti=1;inum);a[i]->flag=0;}}/
推荐度:
导读#include#include#include#defineN20typedefstruct{intnum;//磁道intflag;//1个标记量}V,*v;//*********************************************************************voidInitial(v*a,intn){//初始化磁道请求printf("请输入请求顺序(磁道范围是0-199):\\n");for(inti=1;inum);a[i]->flag=0;}}/
#include

#include

#include

#define N 20

typedef struct

{

    int num;//磁道

    int flag;//1个标记量

}V,*v;

//*********************************************************************

void Initial(v *a,int n)

{//初始化磁道请求

    printf("请输入请求顺序(磁道范围是0 - 199):\\n");

for(int i = 1;i <= n;i++)

    {

        a[i] = (v)malloc(sizeof(V));

            if(!a[i]) exit(-1);

     scanf("%d",&a[i]->num);

     a[i]->flag = 0;

    }

}

//***********************************************************************

void FCFS(v *a,int start,int n)

{//先到先服务算法

    int temp = start;

    float s = 0;

    printf("---------------------------FCFS调度算法----------------------------\\n");

for(int i = 1;i <= n; i++)

    {

     temp = abs(a[i]->num - temp);

        s += temp;

     a[i]->flag = i;

     temp = a[i]->num;

    }

    int temp2;

for(i = n;i >= 1;i--)

    {//冒泡排序,按照磁道访问的先后顺序重新排列数组a,用于输出调度顺序

     for(int j = 1;j < i;j ++)

        {

         if(a[j]->flag> a[j+1]->flag)

            {

             temp = a[j]->flag;

             temp2 = a[j]->num;

             a[j]->flag = a[j+1]->flag;

             a[j]->num = a[j+1]->num;

             a[j+1]->flag = temp;

             a[j+1]->num = temp2;

            }

        }

    }

    printf("调度序列为:\\n");

printf("%d—>",start);

for(i = 1;i <= n; i++)

    {

     printf("%d —> ",a[i]->num);

    }

    printf("\\n");

    printf("寻道长度是%f",s);printf("\\n");

    printf("平均寻道长度是%f",s/n);

    printf("\\n");

    printf("---------------------------FCFS调度算法----------------------------\\n");

}

//************************************************************************

int Find(v *a,int n,int start)

{//找到离开始磁道最近的一项,返回下标

    int p;

for(int i = 1;i < n;i++)

    {

     if((a[i]->num <= start) && (start <=a[i+1]->num ))

        {

         if(abs(a[i]->num - start) < abs(a[i+1]->num - start))

            {

                p = i;

            }

            else

            {

                p= i+1;

            }

        }

    }

    return p;

}

void SSTF(v *a,int start,int n)

{//最短寻道时间调度算法

    int temp;

    int pr,pl;//分别标记离磁头最近的那个磁道在数组中的下标的前一个和后一个

    float s = 0;    //用来计算寻道长度

    temp =  start;

    printf("---------------------------SSTF调度算法----------------------------\\n");

for(int i = n;i >= 1;i--)

    {//冒泡排序,把磁道按由小到大的顺序排列

     for(int j = 1;j < i;j ++)

        {

         if(a[j]->num > a[j+1]->num)

            {

             temp = a[j]->num;

             a[j]->num = a[j+1]->num;

             a[j+1]->num = temp;

            }

        }

    }

    printf("排序后\\n");

for(int j=1;j<=n;j++)

printf("%d ",a[j]->num);

    printf("\\n");

    int p,x;

    p = Find(a,n,start);

    x = p;

    pr = p + 1;

    pl = p - 1;

if(start <= a[1]->num)

    {//磁头在最左边

     s =(float)(a[1]->num-start);

        printf("调度序列为:\\n");

     printf("%d—>",start);

     for(i = 1;i <= n; i++)

        {

            if(i!=1)

            {

             s+=a[i]->num-a[i-1]->num;

            }

         printf("%d —> ",a[i]->num);

        }

        printf("\\n");

        printf("寻道长度为%f",s);

        printf("\\n");

        printf("平均寻道长度是%f",s/n);

        printf("\\n");

    }

else if(start >= a[n]->num)

    {//磁头在最右边

     s =(float)(start-a[n]->num);

        printf("调度序列为:\\n");

     printf("%d—>",start);

     for(i = n; i >= 1; i--)

        {

            if(i!=1)

            {

             s += a[i]->num-a[i-1]->num;

            }

         printf("%d —> ",a[i]->num);

        }

        printf("\\n");

        printf("寻道长度为%f",s);

        printf("平均寻道长度是%f",s/n);

        printf("\\n");

    }

    

    else

    {//磁头在中间

        printf("调度序列为:\\n");

     printf("%d—>",start);

     printf("%d —> ",a[p]->num);

     s = (float)(a[p]->num - start);

        while(1)

        {

         if(abs(a[pl]->num - a[p]->num) <= abs(a[p]->num - a[pr]->num))

            {

             s += a[p]->num-a[pl]->num;

                p = pl;

             printf("%d —> ",a[p]->num);

                pl--;

                if(pl==0)

                {

                 s += a[pr]->num-a[1]->num;

                 s += a[n]->num-a[pr]->num;

                 for(int i=pr;i<=n;i++)

                    {

                     printf(" %d—>",a[i]->num);

                    }

                    break;

                }

            }

            else

            {

             s += a[pr]->num-a[p]->num;

                p = pr;

             printf("%d —> ",a[p]->num);

                pr++;

                if(pr==n+1)

                {

                 s += a[n]->num-a[pl]->num;

                 s += a[pl]->num-a[1]->num;

                 for(int i=pl;i>=1;i--)

                    {

                     printf("%d —> ",a[i]->num);

                    }

                break;

                }

            }

        }

        printf("\\n");

        printf("寻道长度为%f",s);

        printf("\\n");

        printf("平均寻道长度是%f",s/n);

        printf("\\n");

    }    

    printf("---------------------------SSTF调度算法----------------------------\\n");

}

//**********************************************************************

void SCAN(v *a,int start,int n)

{//电梯算法

    int l = 0 ;//用于设置访问磁道的flag

    int temp,temp2;

for(int i = n;i >= 1;i--)

    {//冒泡排序,把磁道按由小到大的顺序排列

     for(int j = 1;j < i;j ++)

        {

         if(a[j]->num > a[j+1]->num)

            {

             temp = a[j]->num;

             a[j]->num = a[j+1]->num;

             a[j+1]->num = temp;

            }

        }

    }

    int p,x;

    p =  Find(a,n,start);

    x = p;

    float s = 0;

    int toleft,toright;

    printf("---------------------------SCAN调度算法----------------------------\\n");

if(abs(start - a[1]->num) < abs(a[n]->num - start))

        toleft = 1;//磁头离最左端的磁道近

    else

        toright = 1;//磁头离最右端的磁道近

    temp = start;

    if(toleft == 1)

    {//先向0磁道方向访问

        while(p != 0)

        {

         temp = abs(a[p]->num - temp);

            s += temp;

            l += 1;

         temp = a[p]->num;

         a[p]->flag = l;

            p--;

        }

     s += a[1]->num - 0;

        temp = 0;

        x = x + 1;

        while(x != n)

        {

         temp = abs(a[x]->num - temp);

            s += temp;

            l += 1;

         temp = a[x]->num;

         a[x]->flag =l;

            x++;

        }

     for(i = n;i >= 1;i--)

        {//冒泡排序,按照访问的顺序将数组重新排列

         for(int j = 1;j < i;j ++)

            {

             if(a[j]->flag> a[j+1]->flag)

                {

                 temp = a[j]->flag;

                 temp2 = a[j]->num;

                 a[j]->flag = a[j+1]->flag;

                 a[j]->num = a[j+1]->num;

                 a[j+1]->flag = temp;

                 a[j+1]->num = temp2;

                }

            }

        }

        printf("调度序列为:\\n");

     printf("%d—>",start);

     for(i = 1;i <= n; i++)

        {

         printf("%d —> ",a[i]->num);

        }

        printf("\\n");

        printf("寻道长度是%f",s);printf("\\n");

        printf("平均寻道长度是%f",s/n);

        printf("\\n");

    }

    if(toright == 1)

    {//先向199磁道方向访问

        while(p != n+1)

        {

         temp = abs(a[p]->num - temp);

            s += temp;l += 1;

         temp = a[p]->num;

         a[p]->flag = l;

            p++;

        }

     s += abs(199 - a[n]->num);

        temp = 199;

        x = x - 1;

        while(x != 0)

        {

         temp = abs(a[x]->num - temp);

            s += temp;

            l += 1;

         temp = a[x]->num;

         a[x]->flag =l;

            x--;

        }    

     for(i = n;i >= 1;i--)

        {//冒泡排序,按照访问的顺序将数组重新排列

         for(int j = 1;j < i;j ++)

            {

             if(a[j]->flag> a[j+1]->flag)

                {

                 temp = a[j]->flag;

                 temp2 = a[j]->num;

                 a[j]->flag = a[j+1]->flag;

                 a[j]->num = a[j+1]->num;

                 a[j+1]->flag = temp;

                 a[j+1]->num = temp;

                }

            }

        }

        printf("调度序列为:\\n");

     printf("%d—>",start);

     for(i = 1;i <= n; i++)

        {

         printf("%d —> ",a[i]->num);

        }

        printf("\\n");

        printf("寻道长度是%f",s);printf("\\n");

        printf("平均寻道长度是%f",s/n);

        printf("\\n");

    }

    printf("---------------------------SCAN调度算法----------------------------\\n");

}

//*************************************************************************

void CSCAN(v *a,int start,int n)

{//

    int temp,temp2;

    int l = 0;

for(int i = n;i >= 1;i--)

    {//冒泡排序

     for(int j = 1;j < i;j ++)

        {

         if(a[j]->num > a[j+1]->num)

            {

             temp = a[j]->num;

             a[j]->num = a[j+1]->num;

             a[j+1]->num = temp;

            }

        }

    }

    int p,x;

    p =  Find(a,n,start);

    x = p;

    float s = 0;

    temp = start;

    printf("---------------------------CSCAN调度算法----------------------------\\n");

if((n - p) >= p )

    {//右边的磁道数比左边的磁道数多

        while(p != n+1)

        {

         temp = abs(a[p]->num - temp);

            s += temp;l += 1;

         temp = a[p]->num;a[p]->flag = l;

            p++;

        }

     s += abs(199 - a[n]->num);

        temp = 0;

        x = x + 1;

        i = 1;

        while(i != x)

        {

         temp = abs(a[i]->num - temp);

            s += temp;l += 1;

         temp = a[i]->num;

         a[i]->flag = l;

            i++;

        }

     for(i = n;i >= 1;i--)

        {//冒泡排序,按照访问的顺序将数组重新排列

         for(int j = 1;j < i;j ++)

            {

             if(a[j]->flag> a[j+1]->flag)

                {

                 temp = a[j]->flag;

                 temp2 = a[j]->num;

                 a[j]->flag = a[j+1]->flag;

                 a[j]->num = a[j+1]->num;

                 a[j+1]->flag = temp;

                 a[j+1]->num = temp2;

                }

            }

        }

        printf("调度序列为:\\n");

     printf("%d—>",start);

     for(i = 1;i <= n; i++)

        {

         printf("%d —> ",a[i]->num);

        }

        printf("\\n");

        printf("寻道长度是%f",s);printf("\\n");

        printf("平均寻道长度是%f",s/n);

        printf("\\n");

    }

    else

    {//左边的磁道数比右边的磁道数多

        while(p != 0)

        {

         temp = abs(a[p]->num - temp);

            s += temp;l += 1;

         temp = a[p]->num;

         a[p]->flag = l;

            p--;

        }

     s += a[1]->num - 0;

        temp = 199;

        i = n;

        while(i != x)

        {

         temp = abs(a[i]->num - temp);

            s += temp;

         temp = a[i]->num;l += 1;

         a[i]->flag =l;

            i--;

        }

     for(i = n;i >= 1;i--)

        {//冒泡排序,按照访问的顺序将数组重新排列

         for(int j = 1;j < i;j ++)

            {

             if(a[j]->flag> a[j+1]->flag)

                {

                 temp = a[j]->flag;

                 temp2 = a[j]->num;

                 a[j]->flag = a[j+1]->flag;

                 a[j]->num = a[j+1]->num;

                 a[j+1]->flag = temp;

                 a[j+1]->num = temp2;

                }

            }

        }

        printf("调度序列为:\\n");

     printf("%d—>",start);

     for(i = 1;i <= n; i++)

        {

         printf("%d —> ",a[i]->num);

        }

        printf("\\n");

        printf("寻道长度是%f",s);printf("\\n");

        printf("平均寻道长度是%f",s/n);

        printf("\\n");

    }

    printf("---------------------------CSCAN调度算法----------------------------\\n");

}

//**************************************************************************

void main()

{

    int n;//

    v a[N];

    int start;//磁头开始的位置

    int choice;//用于标记操作的序号

    printf("******************************磁盘调度算法****************************\\n");

    printf("    ");printf("1.FCFS调度算法\\n");    

    printf("    ");printf("2.SSTF调度算法\\n");

    printf("    ");printf("3.SCAN调度算法\\n");

    printf("    ");printf("4.CSCAN调度算法\\n");        

    printf("    ");printf("5.退出\\n");

    printf("******************************磁盘调度算法****************************\\n");

    printf("请输入请求的柱面数 :");

    scanf("%d",&n);

    printf("请输入磁头开始的位置:");

    scanf("%d",&start);

    Initial(a,n);

    while(1)

    {

        printf("请选择你要的操作序号\\n");

        scanf("%d",&choice);

        switch(choice){

        case 1:FCFS(a,start,n);break;

        case 2:SSTF(a,start,n);break;

        case 3:SCAN(a,start,n);break;

        case 4:CSCAN(a,start,n);break;

        case 5:exit(-1);

        default:printf("你输入的操作序号有误!");

        }

        printf("\\n");

    }

}

文档

操作系统磁盘调度算法

#include#include#include#defineN20typedefstruct{intnum;//磁道intflag;//1个标记量}V,*v;//*********************************************************************voidInitial(v*a,intn){//初始化磁道请求printf("请输入请求顺序(磁道范围是0-199):\\n");for(inti=1;inum);a[i]->flag=0;}}/
推荐度:
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top