赞
踩
实验四 存储器管理
一、 实验目的
1. 理解连续存储管理方式的原理和分类。
2. 理解离散存储管理方式的原理和分类。
3. 理解虚拟存储器的原理和分类。
4. 掌握动态分区分配的常用算法。
5. 掌握页式虚拟管理中常用页面置换算法。
二、 实验设备
1. 安装windows或者linux操作系统的PC机
2. C程序编译环境
三、 实验内容
用C语言编程模拟实现一种或多种动态分区分配算法或页面置换算法。常见的动态分区分配算法有最先适应算法、循环首次适应算法、最佳适应算法、最坏适应算法等,常见的页面置换算法有先进先出(FIFO)页面置换算法、最近最久未使用(LRU)置换算法、最少使用(LFU)置换算法等。
四、 实验要求
1. 上机编写并调试动态分区分配算法(或页面置换算法)的模拟程序。
2. 要把相应的程序代码及程序运行结果写入实验报告中。
- #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);
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。