<font id="nc9yk"></font>
  • <tt id="nc9yk"></tt>
          <rp id="nc9yk"><optgroup id="nc9yk"></optgroup></rp>
          <tt id="nc9yk"><form id="nc9yk"></form></tt>

            <cite id="nc9yk"></cite>

            C語言實現頁面置換 先進先出算法(FIFO)

             更新時間:2020年12月29日 11:28:16   作者:little pepper  
            這篇文章主要為大家詳細介紹了C語言實現頁面置換,先進先出算法(FIFO),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

            本文實例為大家分享了C語言實現頁面置換算法的具體代碼,供大家參考,具體內容如下

            一、設計目的   

            加深對請求頁式存儲管理實現原理的理解,掌握頁面置換算法中的先進先出算法。

            二、設計內容

            設計一個程序,有一個虛擬存儲區和內存工作區,實現下述三種算法中的任意兩種,計算訪問命中率(命中率=1-頁面失效次數/頁地址流長度)。附加要求:能夠顯示頁面置換過程。

            該系統頁地址流長度為320,頁面失效次數為每次訪問相應指令時,該指令對應的頁不在內存的次數。   
            程序首先用srand()和rand()函數分別進行初始化、隨機數定義和產生指令序列,然后將指令序列變換成相應的頁地址流,并針對不同的算法計算出相應的命中率。

            通過隨機數產生一個指令序列。共320條指令,指令的地址按下述原則生成:

            (1)50%的指令是順序執行的。
            (2)25%的指令是均勻分布在前地址部分。
            (3)25%的指令是均勻分布在后地址部分。

            具體的實施方法如下:

            在【0,319】的指令地址之間隨機選取一起點m。
            順序執行一條指令,即執行地址為m+1的指令。
            在前地址【0,m+1】中隨機選取一條指令并執行,該指令的地址為m'。
            順序執行一條指令,其地址為m'+1。
            在后地址【m'+2,319】中隨機選取一條指令并執行。
            重復步驟(1)-(5),直到320次指令。
            將指令序列變換為頁地址流。

            設:

            頁面大小為1KB。
            用戶內存容量4頁到32頁。
            用戶虛存容量為32KB。
            在用戶虛存中,按每K存放10條指令虛存地址,即320條指令在虛存中的存放方式為:
            第0條~9條指令為第0頁(對應虛存地址為【0,9】)。
            第10條~19條指令為第1頁(對應虛存地址為【10,19】)。
            ……
            第310條~319條指令為第31頁(對應虛擬地址為【310,319】)。
            按以上方式,用戶指令可組成32頁。
            計算每種算法在不同內存容量下的命中率。

            三、程序結構

            首先,用srand()和rand()函數分別進行初始化、隨機數定義和產生指令序列;
            接著,將指令序列變換成相應的頁地址流;
            然后,并針先進先出算法計算出相應的命中率和輸出頁面置換過程。

            源程序:

            #include<stdio.h>
            #include<stdlib.h>
            #define N 320
            int num[N]; //存放隨機數 
            int page[N]; //存放頁地址流 
            int mc[33]; //memory capacity內存容量 ,并初始化為0 
             
            void randomnumber()//random number隨機數 程序第一步,產生320個指令序列 
            { 
             int pc;
             int flag=0; 
             scanf("%d",&pc); 
             printf("\n在0-319之間產生的320個隨機數如下:\n"); 
             for(int i=0;i<320;i++) 
             { 
             num[i]=pc; 
             if(flag%2==0) pc=++pc%320; //flag=0||2 50%的指令是順序執行的 
             if(flag==1) pc=rand()% (pc-1); //flag=1 25%的指令是均勻分布在前地址部分 
             if(flag==3) pc=pc+1+(rand()%(320-(pc+1))); //flag=3 25%的指令是均勻分布在后地址部分 
             flag=++flag%4; 
             printf("%3d ",num[i]); 
             if((i+1)%10==0) printf("\n"); //每行輸出10個數 
             } 
            } 
             
            void pageaddress() //pageaddress頁地址 程序第二步,將指令序列變換為頁地址流 
            { 
             for(int i=0;i<320;i++) 
             { 
             printf("%3d ",page[i]=num[i]/10); 
             if((i+1)%10==0) printf("\n"); //每行輸出10個數 
             } 
            }
             
            int FIFO(int capacity)
            {
             int j,x,y,m;
             int sum=0; //mc中分配的個數 
             int exist=0; //命中次數 
             int flag; //標志是否命中 flag=0沒命中 flag=1命中 
             int ep=1; //elimination position淘汰位置 
             mc[1]=page[0];
             printf(" %2d加入 \t",page[0]);
             for(m=1;m<=capacity;m++) //輸出當前內存塊的存儲情況 
             printf("%2d ",mc[m]);
             printf("\n");
             sum+=1; 
             for(j=1;j<320;j++)
             { 
             flag=0; 
             for(y=1;y<=sum;y++) //判斷這個頁地址流是否命中 
             if(mc[y]==page[j]) {
             exist++;
             flag=1;
             printf(" %2d命中 \t",page[j]);
             for(m=1;m<=capacity;m++) //輸出當前內存塊的存儲情況 
             printf("%2d ",mc[m]);
             printf("\n");
             break;} 
             //沒命中 
             if(flag==0) 
             {
             if(sum<capacity) //還有空塊 
             {for(x=1;x<=capacity;x++) //查找內存塊中第一個空塊 
             if(mc[x]==-1) {
             mc[x]=page[j];
             sum++;
             printf(" %2d加入 \t",page[j]);
             for(m=1;m<=capacity;m++) //輸出當前內存塊的存儲情況 
             printf("%2d ",mc[m]);
             printf("\n");
             break;}
             }
             else if(sum>=capacity)
             {
             int t=mc[ep];
             mc[ep]=page[j];
             printf(" %2d置換%2d\t",page[j],t);
             for(m=1;m<=capacity;m++) //輸出當前內存塊的存儲情況 
             printf("%2d ",mc[m]);
             printf("\n");
             ep+=1;
             if(ep==capacity+1) ep=1; 
             } 
             }
             } 
             printf("\nexist=%d\n命中率=%lf",exist,exist/320.0);
            } 
            int main()
            {
             int capacity; //內存塊數 
             printf("請輸入第一條指令號(0~319):");
             randomnumber();
             printf("\n指令序列對應的頁地址流:\n"); 
             pageaddress(); 
             printf("\n\n\n\t\t先進先出算法(FIFO):\n\n");
             printf("請輸入內存塊數(4-32):");
             scanf("%d",&capacity);
             for(int i=1;i<=32;i++) //給數組賦初值 
             mc[i]=-1;
             FIFO(capacity); 
             return 0;
            }

            以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

            相關文章

            最新評論

            hao500彩票 www.hitsandlyrics.com:凉城县| www.firmarehberisitesi.com:荆州市| www.atanasteodosiev.com:曲周县| www.vermord.com:宁波市| www.cp7119.com:徐州市| www.my-testimony.org:达尔| www.wedding-invites.net:陈巴尔虎旗| www.wwwhg8682.com:孝义市| www.la-grange-fleurie.net:武邑县| www.gun2424.com:邵阳市| www.wyadorkable.com:平定县| www.ceriacell.com:井陉县| www.smashingoffernow.com:徐闻县| www.usfluence.com:乌拉特中旗| www.q2969.com:沙洋县| www.ozcanis.com:山阳县| www.nawalodge.com:肇州县| www.wangwangla.com:广州市| www.rabarg.com:岑溪市| www.aircompressorhose.org:古浪县| www.pearlfan.com:竹北市| www.illusionsandreality.com:樟树市| www.6w22.com:常州市| www.nederlandsefilms.com:项城市| www.supernac.com:靖远县| www.jtian-168.com:方城县| www.zsjgt.com:鸡西市| www.shanghaisujia.com:阿拉尔市| www.marcandreboivin.com:永丰县| www.kennedypromotions.com:名山县| www.allnaturessafeway.com:民权县| www.wwwhg5717.com:绥江县| www.nj-tyjx.com:宁安市| www.445cf.com:梁山县| www.anapanasatiyoga.net:永州市| www.wwwmamma.com:日喀则市| www.gzdecen.com:深圳市| www.phoenix-nr.com:金沙县| www.55conduitroad.com:台中县| www.83-bits.com:介休市| www.porcoespirito.com:常德市| www.xjzsxx.com:永定县| www.13425690000.com:修文县| www.chmyl.com:阳新县| www.rightics.com:阳原县| www.asrgame.com:昭觉县| www.myproperties4sale.com:隆尧县| www.qingshushanzhuang.com:青海省| www.ulisesmoralesabogados.com:清水县| www.twoland-tech.com:尉氏县| www.gutbrodpackaging.com:陇川县| www.n9878.com:双鸭山市| www.nbuyi.com:惠水县| www.bc0010.com:沁水县| www.biz2345.com:常德市| www.ppdownloader.com:凉山| www.dawntoner.com:彭泽县| www.ynsh9188.com:米易县| www.safecarservice.com:金寨县| www.joedonovanpersonaltraining.com:三原县| www.droid-factory.com:阿克| www.acehobbyaustralia.com:卢龙县| www.shophapi.com:花莲市| www.blogucn.com:皋兰县| www.brandarab123.com:额敏县| www.99069hh.com:焉耆| www.wfwcmm.com:铁岭市| www.wordsihate.org:六安市| www.inhouse-outhouse.com:林西县| www.xffrw.cn:武平县| www.tztrelleborg.com:吴桥县| www.awov.org:洞头县| www.liansheng-tech.com:理塘县| www.hbccp.com:通辽市| www.actforourfuture.org:江门市| www.aw368.com:黎平县| www.018448.com:苏尼特左旗| www.jshongfu56.com:景宁| www.sallytarr.com:嘉义市| www.weipengsc.com:二连浩特市| www.offthechartslive.com:英山县| www.yt9168.com:南京市| www.imoglobalchance.com:明星| www.bccc14.com:竹山县|