专注app软件定制开发利用C语言实现页面置换算法

专注app软件定制开发罗马数字转整数

专注app软件定制开发操作系统实验

专注app软件定制开发页面置换算法(、LRU、OPT)

概念:

1.专注app软件定制开发最佳置换算法(OPT)(专注app软件定制开发理想置换算法):从主存中移出永远不再需要的页面;如无这样的页面存在,则选择最长时间不需要访问的页面。于所选择的被淘汰页面将是以后永不使用的,或者是在最长时间内不再被访问的页面,这样可以保证获得最低的缺页率。
2.先进先出置换算法(FIFO):是最简单的页面置换算法。这种算法的基本思想是:当需要淘汰一个页面时,总是选择驻留主存时间最长的页面进行淘汰,即先进入主存的页面先淘汰。其理由是:最早调入主存的页面不再被使用的可能性最大。
3.最近最久未使用(LRU)算法:这种算法的基本思想是:利用局部性原理,根据一个作业在执行过程中过去的页面访问历史来推测未来的行为。它认为过去一段时间里不曾被访问过的页面,在最近的将来可能也不会再被访问。所以,这种算法的实质是:当需要淘汰一个页面时,总是选择在最近一段时间内最久不用的页面予以淘汰。

题目:

编写一个程序,实现本章所述的FIFO、LRU和最优页面置换算法。首先,生成一个随机的页面引用串,其中页码范围为0-9.将这个随机页面引用串应用到每个算法,并记录每个算法引起的缺页错误的数量。实现置换算法,一遍页面帧的数量可以从1~7。

代码

#include <stdio.h>#include <stdlib.h>#include <time.h>int numbers[20]={7,0,1,2,                 0,3,0,4,                 2,3,0,3,                 2,1,2,0,                 1,7,0,1};//本地数据,与课本一致,方便测试int nums=0;//输入栈的个数,为了方便使用,int stack[20][7]={10};void begin();void randomnum();//用于产生随机数void init();//初始化void FIFO();//FIFO算法void LRU();//LRU算法void OPT();//最优页面置换算法(OPT)void print();//输出int main() {    begin();    FIFO();    LRU();    OPT();    return 0;}void begin()//开始菜单界面{    int i,j,k;    printf("请输入页面帧的数量(1-7):");    scanf("%d",&nums);    for(k=0;;k++)    {        printf("是否使用随机数产生输入串(0:是,1:否)");        scanf("%d",&j);        if(j==0)        {            randomnum();            break;        }        else if(j==1)        {            break;        }        else        {            printf("请输入正确的选择!\");        }    }    printf("页面引用串为:\");    for(i=0;i<20;i++)    {        printf("%d  ",numbers[i]);    }    printf("\");    init();}void randomnum()//如果需要使用随机数生成输入串,调用该函数{    srand(time(0));//设置时间种子    for(int i = 0; i < 20; i++) {        numbers[i] = rand() % 10;//生成区间0`9的随机页面引用串    }}void init()//用于每次初始化页面栈中内容,同时方便下面输出的处理{    int i,j;    for(i=0;i<20;i++)        for(j=0;j<nums;j++)            stack[i][j]=10;}void print()//输出各个算法的栈的内容{    int i,j;    for(i=0;i<nums;i++)    {        for(j=0;j<20;j++)        {            if(stack[j][i]==10)                printf("*  ");            else                printf("%d  ",stack[j][i]);        }        printf("\");    }}void FIFO()//FIFO算法{    init();    int i,j=1,n=20,k,f,m;    stack[0][0]=numbers[0];    for(i=1;i<20;i++)    {        f=0;        for(m=0;m<nums;m++)        {            stack[i][m]=stack[i-1][m];        }        for(k=0;k<nums;k++)        {            if(stack[i][k]==numbers[i])            {                n--;                f=1;                break;            }        }        if(f==0)        {            stack[i][j]=numbers[i];            j++;        }        if(j==nums)            j=0;    }    printf("\");    printf("FIFO算法:\");    print();    printf("缺页错误数目为:%d\",n);}void LRU()//LRU算法{    int i,j,m,k,sum=1,f;    int sequence[7]={0};//记录序列    init();    stack[0][0]=numbers[0];    sequence[0]=nums;    for(i=1;i<nums;i++)//前半部分,页面空置的情况    {        for(j=0;j<nums;j++)        {            stack[i][j]=stack[i-1][j];        }        for(j=0;j<nums;j++)  //判断要插入的是否在栈中已经存在        {            f=0;            if(stack[i][j]==numbers[i])            {                f=1;                sum--;                sequence[j]=nums;                break;            }        }        for(j=0;j<nums;j++)        {            if(sequence[j]==0&&f==0)            {                stack[i][j]=numbers[i];                sequence[i]=nums;//最近使用的优先级列为最高                break;            }        }        for(j=0;j<i;j++)//将之前的优先级序列都减1        {            if(sequence[j]!=0)               sequence[j]--;        }        //sequence[i]=nums;        sum++;    }    for(i=nums;i<20;i++)//页面不空,需要替换的情况    {        int f;        f=0;        for(j=0;j<nums;j++)        {            stack[i][j]=stack[i-1][j];        }        for(j=0;j<nums;j++)//判断输入串中的数字,是否已经在栈中        {            if(stack[i][j]==numbers[i])            {                f=1;                k=j;                break;            }        }        if(f==0)//如果页面栈中没有,不相同        {            for(j=0;j<nums;j++)//找优先序列中为0的            {                if(sequence[j]==0)                {                    m=j;                    break;                }            }            for(j=0;j<nums;j++)            {                sequence[j]--;            }            sequence[m]=nums-1;            stack[i][m]=numbers[i];            sum++;        }        else//如果页面栈中有,替换优先级        {           if(sequence[k]==0)//优先级为最小优先序列的           {               for(j=0;j<nums;j++)               {                   sequence[j]--;               }               sequence[k]=nums-1;           }           else if(sequence[k]==nums-1)//优先级为最大优先序列的           {               //无需操作           }           else//优先级为中间优先序列的           {               for(j=0;j<nums;j++)               {                   if(sequence[k]<sequence[j])                   {                       sequence[j]--;                   }               }               sequence[k]=nums-1;           }        }    }    printf("\");    printf("LRU算法:\");    print();    printf("缺页错误数目为:%d\",sum);}void OPT()//OPT算法{    int i,j,k,sum=1,f,q,max;    int seq[7]={0};//记录序列    init();    stack[0][0]=numbers[0];    seq[0]=nums-1;    for(i=1;i<nums;i++)//前半部分,页面空置的情况    {        for(j=0;j<nums;j++)        {            stack[i][j]=stack[i-1][j];        }        for(j=0;j<nums;j++)  //判断要插入的是否在栈中已经存在        {            f=0;            if(stack[i][j]==numbers[i])            {                f=1;                sum--;                //b++;                seq[j]=nums;                break;            }        }        for(j=0;j<nums;j++)        {            if(seq[j]==0&&f==0)            {                stack[i][j]=numbers[i];                seq[j]=nums;//最近使用的优先级列为最高                break;            }//            else if(seq[j]==0&&f==1){//                b++;//                sum--;//                seq[j]=nums-1;//                break;//            }        }        for(j=0;j<nums;j++)//将之前的优先级序列都减1        {            if(seq[j]!=0)               seq[j]--;        }        sum++;    }    for(i=nums;i<20;i++)//后半部分,页面栈中没有空的时候情况    {        //k=nums-1;//最近的数字的优先级        for(j=0;j<nums;j++)//前面的页面中内容赋值到新的新的页面中        {            stack[i][j]=stack[i-1][j];        }        for(j=0;j<nums;j++)        {            f=0;            if(stack[i][j]==numbers[i])            {                f=1;                break;            }        }        if(f==0)//页面中没有,需要替换的情况        {            for(q=0;q<nums;q++)//优先级序列中最大的就是最久不会用的,有可能出现后面没有在用过的情况            {                seq[q]=20;            }            for(j=0;j<nums;j++)//寻找新的优先级            {                for(q=i+1;q<20;q++)                {                    if(stack[i][j]==numbers[q])                    {                        seq[j]=q-i;                        break;                    }                }            }            max=seq[0];            k=0;            for(q=0;q<nums;q++)            {                if(seq[q]>max)                {                    max=seq[q];                    k=q;                }            }            stack[i][k]=numbers[i];            sum++;        }        else        {            //页面栈中有需要插入的数字,无需变化,替换的优先级也不需要变化        }    }    printf("\");    printf("OPT算法:\");    print();    printf("缺页错误数目为:%d\",sum);}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185
  • 186
  • 187
  • 188
  • 189
  • 190
  • 191
  • 192
  • 193
  • 194
  • 195
  • 196
  • 197
  • 198
  • 199
  • 200
  • 201
  • 202
  • 203
  • 204
  • 205
  • 206
  • 207
  • 208
  • 209
  • 210
  • 211
  • 212
  • 213
  • 214
  • 215
  • 216
  • 217
  • 218
  • 219
  • 220
  • 221
  • 222
  • 223
  • 224
  • 225
  • 226
  • 227
  • 228
  • 229
  • 230
  • 231
  • 232
  • 233
  • 234
  • 235
  • 236
  • 237
  • 238
  • 239
  • 240
  • 241
  • 242
  • 243
  • 244
  • 245
  • 246
  • 247
  • 248
  • 249
  • 250
  • 251
  • 252
  • 253
  • 254
  • 255
  • 256
  • 257
  • 258
  • 259
  • 260
  • 261
  • 262
  • 263
  • 264
  • 265
  • 266
  • 267
  • 268
  • 269
  • 270
  • 271
  • 272
  • 273
  • 274
  • 275
  • 276
  • 277
  • 278
  • 279
  • 280
  • 281
  • 282
  • 283
  • 284
  • 285
  • 286
  • 287
  • 288
  • 289
  • 290
  • 291
  • 292
  • 293
  • 294
  • 295
  • 296
  • 297
  • 298
  • 299
  • 300
  • 301
  • 302
  • 303
  • 304
  • 305
  • 306
  • 307
  • 308
  • 309
  • 310
  • 311
  • 312
  • 313
  • 314
  • 315
  • 316
  • 317
  • 318
  • 319
  • 320
  • 321
  • 322
  • 323
  • 324
  • 325
  • 326
  • 327
  • 328
  • 329
  • 330
  • 331
  • 332
  • 333
  • 334
  • 335
  • 336
  • 337
  • 338
  • 339
  • 340
  • 341
  • 342
  • 343
  • 344
  • 345
  • 346

运行结果截图:



总结

设置多个数组,一个用来模仿栈,一个用来存要存取的页面,还有在OPT算法和LRU算法中,记录栈中每个数据的替换优先级。
之前的代码写的有点烂,重新看了一次才感觉之前的有多烂,哈哈哈哈哈,这个代码能在linux上跑通的,在windows上肯定也没得问题

网站建设定制开发 软件系统开发定制 定制软件开发 软件开发定制 定制app开发 app开发定制 app开发定制公司 电商商城定制开发 定制小程序开发 定制开发小程序 客户管理系统开发定制 定制网站 定制开发 crm开发定制 开发公司 小程序开发定制 定制软件 收款定制开发 企业网站定制开发 定制化开发 android系统定制开发 定制小程序开发费用 定制设计 专注app软件定制开发 软件开发定制定制 知名网站建设定制 软件定制开发供应商 应用系统定制开发 软件系统定制开发 企业管理系统定制开发 系统定制开发