操作系统实验四 页面置换算法(fifo 算法代码------页面置换代码集合)
2016-06-14 23:13
344 查看
实验四 存储器管理
一、 实验目的
1. 理解连续存储管理方式的原理和分类。
2. 理解离散存储管理方式的原理和分类。
3. 理解虚拟存储器的原理和分类。
4. 掌握动态分区分配的常用算法。
5. 掌握页式虚拟管理中常用页面置换算法。
二、 实验设备
1. 安装windows或者linux操作系统的PC机
2. C程序编译环境
三、 实验内容
用C语言编程模拟实现一种或多种动态分区分配算法或页面置换算法。常见的动态分区分配算法有最先适应算法、循环首次适应算法、最佳适应算法、最坏适应算法等,常见的页面置换算法有先进先出(FIFO)页面置换算法、最近最久未使用(LRU)置换算法、最少使用(LFU)置换算法等。
四、 实验要求
1. 上机编写并调试动态分区分配算法(或页面置换算法)的模拟程序。
2. 要把相应的程序代码及程序运行结果写入实验报告中。
一、 实验目的
1. 理解连续存储管理方式的原理和分类。
2. 理解离散存储管理方式的原理和分类。
3. 理解虚拟存储器的原理和分类。
4. 掌握动态分区分配的常用算法。
5. 掌握页式虚拟管理中常用页面置换算法。
二、 实验设备
1. 安装windows或者linux操作系统的PC机
2. C程序编译环境
三、 实验内容
用C语言编程模拟实现一种或多种动态分区分配算法或页面置换算法。常见的动态分区分配算法有最先适应算法、循环首次适应算法、最佳适应算法、最坏适应算法等,常见的页面置换算法有先进先出(FIFO)页面置换算法、最近最久未使用(LRU)置换算法、最少使用(LFU)置换算法等。
四、 实验要求
1. 上机编写并调试动态分区分配算法(或页面置换算法)的模拟程序。
2. 要把相应的程序代码及程序运行结果写入实验报告中。
先进先出(FIFO)页面置换算法
#include "stdio.h" #include "stdlib.h" #include "math.h" #include "conio.h" #include "time.h" #define TRUE 1 #define FALSE 0 #define NULL 0 #define total_instruction 20 #define total_vp 10 typedef struct { int pn,pfn; }pv_type; pv_type pv[10]; typedef struct pf_struct { int pn,pfn; struct pf_struct *next; }pf_type; pf_type pf[20],*free_head,*busy_head,*busy_tail,*q; int page[total_instruction]; int total_pf; int count; void initialiaze() { int i; count=0; for(i=0;i<total_vp;i++) { pv[i].pn=i; pv[i].pfn=-1; } printf("请输入实页数目:"); scanf("%d",&total_pf); for(i=0;i<=total_pf-1;i++) { pf[i].next=&pf[i+1]; pf[i].pfn=i+1; pf[i].pn=-1; } pf[total_pf-1].next=NULL; free_head=&pf[0]; printf("随机产生的页地址流为:\n"); for(i=0;i<total_instruction;i++) { page[i]=rand()%10; printf("%2d",page[i]); } } void FIFO() { int i,j; pf_type *p; q=busy_head=busy_tail=NULL; for(i=0;i<=total_instruction-1;i++) { printf("\n第%d次执行:",i+1); if(pv[page[i]].pfn==-1) { count+=1; printf("缺页,缺页次数count=%d,",count); if(free_head==NULL) { printf("实页%d中的页面%d将被置换出去",busy_head->pfn,busy_head->pn); p=busy_head->next; pv[busy_head->pn].pfn=-1; free_head=busy_head; free_head->next=NULL; busy_head=p; } p=free_head->next; free_head->next=NULL; free_head->pn=page[i]; pv[page[i]].pfn=free_head->pn; if(busy_tail==NULL) busy_head=busy_tail=free_head; else { busy_tail->next=free_head; busy_tail=free_head; } free_head=p; } else printf("命中,缺页次数不变,仍为count=%d",count); printf("\npfn pn"); for(j=0;j<=total_pf-1;j++) {if(pf[j].pn!=-1) printf("\n%d%8d",pf[j].pfn,pf[j].pn); } } printf("\n先进先出算法的命中率为:%6.4f\n缺页总次数为%d\n",1-(float)count/20,count); } int main() { srand((unsigned)time(NULL)); initialiaze(); FIFO(); return 0; <h2 style="text-align: center;">} 常见的页面置换算法有先进先出(FIFO)页面置换算法、最近最久未使用(LRU)置换算法、最少使用(LFU)置换算法等。</h2>
#include <stdio.h> #include <stdlib.h> /*È«¾Ö±äÁ¿*/ int mSIZE; /*ÎïÀí¿éÊý*/ int pSIZE; /*Ò³ÃæºÅÒýÓô®¸öÊý*/ static int memery[10]={0}; /*ÎïÀí¿éÖеÄÒ³ºÅ*/ static int page[100]={0}; /*Ò³ÃæºÅÒýÓô®*/ static int temp[100][10]={0}; /*¸¨ÖúÊý×é*/ /*Öû»Ëã·¨º¯Êý*/ void FIFO(); void LRU(); void OPT(); /*¸¨Öúº¯Êý*/ void print(unsigned int t); void designBy(); void download(); void mDelay(unsigned int Delay); /*Ö÷º¯Êý*/ int main() { int i,k,code; system("color 0A"); designBy(); printf("©§Çë°´ÈÎÒâ¼ü½øÐгõʼ»¯²Ù×÷... ©§\n"); printf("©»©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¿\n"); printf(" >>>"); getchar(); system("cls"); system("color 0B"); printf("ÇëÊäÈëÎïÀí¿éµÄ¸öÊý(M<=10)£º"); scanf("%d",&mSIZE); printf("ÇëÊäÈëÒ³ÃæºÅÒýÓô®µÄ¸öÊý(P<=100)£º"); scanf("%d",&pSIZE); puts("ÇëÒÀ´ÎÊäÈëÒ³ÃæºÅÒýÓô®(Á¬ÐøÊäÈ룬ÎÞÐè¸ô¿ª)£º"); for(i=0;i<pSIZE;i++) scanf("%1d",&page[i]); download(); system("cls"); system("color 0E"); do{ puts("ÊäÈëµÄÒ³ÃæºÅÒýÓô®Îª£º"); for(k=0;k<=(pSIZE-1)/20;k++) { for(i=20*k;(i<pSIZE)&&(i<20*(k+1));i++) { if(((i+1)%20==0)||(((i+1)%20)&&(i==pSIZE-1))) printf("%d\n",page[i]); else printf("%d ",page[i]); } } printf("* * * * * * * * * * * * * * * * * * * * * * *\n"); printf("* ÇëÑ¡ÔñÒ³ÃæÖû»Ëã·¨£º\t\t\t *\n"); printf("* ----------------------------------------- *\n"); printf("* 1.ÏȽøÏȳö(FIFO) 2.×î½ü×î¾ÃδʹÓÃ(LRU) *\n"); printf("* 3.×î¼Ñ(OPT) 4.Í˳ö *\n"); printf("* * * * * * * * * * * * * * * * * * * * * * *\n"); printf("ÇëÑ¡Ôñ²Ù×÷£º[ ]\b\b"); scanf("%d",&code); switch(code) { case 1: FIFO(); break; case 2: LRU(); break; case 3: OPT(); break; case 4: system("cls"); system("color 0A"); designBy(); /*ÏÔʾÉè¼ÆÕßÐÅÏ¢ºóÍ˳ö*/ printf("©§Ð»Ð»Ê¹ÓÃÒ³ÃæÖû»Ëã·¨ÑÝʾÆ÷! ©§\n"); printf("©»©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¿\n"); exit(0); default: printf("ÊäÈë´íÎó£¬ÇëÖØÐÂÊäÈ룺"); } printf("°´ÈÎÒâ¼üÖØÐÂÑ¡ÔñÖû»Ëã·¨£º>>>"); getchar(); system("cls"); }while (code!=4); getch(); return 0; } /*ÔØÈëÊý¾Ý*/ void download() { int i; system("color 0D"); printf("¨X¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨[\n"); printf("¨UÕýÔÚÔØÈëÊý¾Ý£¬ÇëÉÔºò !!!¨U\n"); printf("¨^¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨T¨a\n"); printf("Loading...\n"); printf(" O"); for(i=0;i<51;i++) printf("\b"); for(i=0;i<50;i++) { mDelay((pSIZE+mSIZE)/2); printf(">"); } printf("\nFinish.\nÔØÈë³É¹¦£¬°´ÈÎÒâ¼ü½øÈëÖû»Ë㷨ѡÔñ½çÃ棺>>>"); getchar(); } /*ÉèÖÃÑÓ³Ù*/ void mDelay(unsigned int Delay) { unsigned int i; for(;Delay>0;Delay--) { for(i=0;i<124;i++) { printf(" \b"); } } } /*ÏÔʾÉè¼ÆÕßÐÅÏ¢*/ void designBy() { printf("©³©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©·\n"); printf("©§ ʵÑéËÄ£ºÒ³ÃæÖû»Ëã·¨ ©§\n"); printf("©§ °à¼¶£º ©§\n"); printf("©§ ÐÕÃû£ºÕÅͬѧ ©§\n"); printf("©Ç©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©¥©Ï\n"); } void print(unsigned int t) { int i,j,k,l; int flag; for(k=0;k<=(pSIZE-1)/20;k++) { for(i=20*k;(i<pSIZE)&&(i<20*(k+1));i++) { if(((i+1)%20==0)||(((i+1)%20)&&(i==pSIZE-1))) printf("%d\n",page[i]); else printf("%d ",page[i]); } for(j=0;j<mSIZE;j++) { for(i=20*k;(i<mSIZE+20*k)&&(i<pSIZE);i++) { if(i>=j) printf(" |%d|",temp[i][j]); else printf(" | |"); } for(i=mSIZE+20*k;(i<pSIZE)&&(i<20*(k+1));i++) { for(flag=0,l=0;l<mSIZE;l++) if(temp[i][l]==temp[i-1][l]) flag++; if(flag==mSIZE)/*Ò³ÃæÔÚÎïÀí¿éÖÐ*/ printf(" "); else printf(" |%d|",temp[i][j]); } /*ÿÐÐÏÔʾ20¸ö*/ if(i%20==0) continue; printf("\n"); } } printf("----------------------------------------\n"); printf("ȱҳ´ÎÊý£º%d\t\t",t+mSIZE); printf("ȱҳÂÊ£º%d/%d\n",t+mSIZE,pSIZE); printf("Öû»´ÎÊý£º%d\t\t",t); printf("·ÃÎÊÃüÖÐÂÊ£º%d%%\n",(pSIZE-(t+mSIZE))*100/pSIZE); printf("----------------------------------------\n"); } /*¼ÆËã¹ý³ÌÑÓ³Ù*/ void compute() { int i; printf("ÕýÔÚ½øÐÐÏà¹Ø¼ÆË㣬ÇëÉÔºò"); for(i=1;i<20;i++) { mDelay(15); if(i%4==0) printf("\b\b\b\b\b\b \b\b\b\b\b\b"); else printf("¦¨"); } for(i=0;i++<30;printf("\b")); for(i=0;i++<30;printf(" ")); for(i=0;i++<30;printf("\b")); } /*ÏȽøÏȳöÒ³ÃæÖû»Ëã·¨*/ void FIFO() { int memery[10]={0}; int time[10]={0}; /*¼Ç¼½øÈëÎïÀí¿éµÄʱ¼ä*/ int i,j,k,m; int max=0; /*¼Ç¼»»³öÒ³*/ int count=0; /*¼Ç¼Öû»´ÎÊý*/ /*Ç°mSIZE¸öÊýÖ±½Ó·ÅÈë*/ for(i=0;i<mSIZE;i++) { memery[i]=page[i]; time[i]=i; for(j=0;j<mSIZE;j++) temp[i][j]=memery[j]; } for(i=mSIZE;i<pSIZE;i++) { /*ÅжÏÐÂÒ³ÃæºÅÊÇ·ñÔÚÎïÀí¿éÖÐ*/ for(j=0,k=0;j<mSIZE;j++) { if(memery[j]!=page[i]) k++; } if(k==mSIZE) /*Èç¹û²»ÔÚÎïÀí¿éÖÐ*/ { count++; /*¼ÆËã»»³öÒ³*/ max=time[0]<time[1]?0:1; for(m=2;m<mSIZE;m++) if(time[m]<time[max]) max=m; memery[max]=page[i]; time[max]=i; /*¼Ç¼¸ÃÒ³½øÈëÎïÀí¿éµÄʱ¼ä*/ for(j=0;j<mSIZE;j++) temp[i][j]=memery[j]; } else { for(j=0;j<mSIZE;j++) temp[i][j]=memery[j]; } } compute(); print(count); } /*×î½ü×î¾ÃδʹÓÃÖû»Ëã·¨*/ void LRU() { int memery[10]={0}; int flag[10]={0}; /*¼Ç¼ҳÃæµÄ·ÃÎÊʱ¼ä*/ int i,j,k,m; int max=0; /*¼Ç¼»»³öÒ³*/ int count=0; /*¼Ç¼Öû»´ÎÊý*/ /*Ç°mSIZE¸öÊýÖ±½Ó·ÅÈë*/ for(i=0;i<mSIZE;i++) { memery[i]=page[i]; flag[i]=i; for(j=0;j<mSIZE;j++) temp[i][j]=memery[j]; } for(i=mSIZE;i<pSIZE;i++) { /*ÅжÏÐÂÒ³ÃæºÅÊÇ·ñÔÚÎïÀí¿éÖÐ*/ for(j=0,k=0;j<mSIZE;j++) { if(memery[j]!=page[i]) k++; else flag[j]=i; /*ˢиÃÒ³µÄ·ÃÎÊʱ¼ä*/ } if(k==mSIZE) /*Èç¹û²»ÔÚÎïÀí¿éÖÐ*/ { count++; /*¼ÆËã»»³öÒ³*/ max=flag[0]<flag[1]?0:1; for(m=2;m<mSIZE;m++) if(flag[m]<flag[max]) max=m; memery[max]=page[i]; flag[max]=i; /*¼Ç¼¸ÃÒ³µÄ·ÃÎÊʱ¼ä*/ for(j=0;j<mSIZE;j++) temp[i][j]=memery[j]; } else { for(j=0;j<mSIZE;j++) temp[i][j]=memery[j]; } } compute(); print(count); } /*×î¼ÑÖû»Ëã·¨*/ void OPT() { int memery[10]={0}; int next[10]={0}; /*¼Ç¼ÏÂÒ»´Î·ÃÎÊʱ¼ä*/ int i,j,k,l,m; int max; /*¼Ç¼»»³öÒ³*/ int count=0; /*¼Ç¼Öû»´ÎÊý*/ /*Ç°mSIZE¸öÊýÖ±½Ó·ÅÈë*/ for(i=0;i<mSIZE;i++) { memery[i]=page[i]; for(j=0;j<mSIZE;j++) temp[i][j]=memery[j]; } for(i=mSIZE;i<pSIZE;i++) { /*ÅжÏÐÂÒ³ÃæºÅÊÇ·ñÔÚÎïÀí¿éÖÐ*/ for(j=0,k=0;j<mSIZE;j++) { if(memery[j]!=page[i]) k++; } if(k==mSIZE) /*Èç¹û²»ÔÚÎïÀí¿éÖÐ*/ { count++; /*µÃµ½ÎïÀí¿ìÖи÷Ò³ÏÂÒ»´Î·ÃÎÊʱ¼ä*/ for(m=0;m<mSIZE;m++) { for(l=i+1;l<pSIZE;l++) if(memery[m]==page[l]) break; next[m]=l; } /*¼ÆËã»»³öÒ³*/ max=next[0]>=next[1]?0:1; for(m=2;m<mSIZE;m++) if(next[m]>next[max]) max=m; /*ÏÂÒ»´Î·ÃÎÊʱ¼ä¶¼ÎªpSIZE,ÔòÖû»ÎïÀí¿éÖеÚÒ»¸ö*/ memery[max]=page[i]; for(j=0;j<mSIZE;j++) temp[i][j]=memery[j]; } else { for(j=0;j<mSIZE;j++) temp[i][j]=memery[j]; } } compute(); print(count); }
相关文章推荐
- PHP中构造函数和析构函数解析
- java动态规划 实现输出最大公共子序列的长度以及输出最大子字符串
- R.java was modified manually! Reverting to generated version!(R文件丢失异常原因汇总)
- php面向对象学习
- Python 的Except 异常处理
- C++文件流
- Python高级特性
- 计蒜客2015 初赛题解及代码
- 练习OGNL 与 Struts2的使用(一)
- Java设计模式(六) 模版方法模式详解
- Metatable 对象默认的操作方式
- interface VS abstract class in java
- effective c++学习笔记0
- 240. Search a 2D Matrix II
- [leetcode]20. Valid Parentheses ,有效的括号符串python实现【easy】
- laravel框架——学习笔记
- 自学javase第一天HelloWord遇到困难
- final
- Java中的堆栈存储机制详解
- c++:chang fang zhu de tiji yu mianji