📄 memsimu.c
字号:
/************************************************************************/
/* */
/* The 3rd experiment of OS course */
/* */
/* LUO Pengkui (SS31,2003010655) */
/* */
/* 2005-12-19 */
/* */
/* */
/************************************************************************/
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
/************************************************************************/
struct Mem_page {
int flag;
int next;
int pre;
int m_page;
int pg_index;
} mem_page[1024]={{0,0,0,0,0}};
int swap_page[1024]={0};
unsigned long dir[1024]={0};
unsigned long page[1024][1024]={0};
int swapout,nrout,nrin;
int head=0;
int tail=1023;
/************************************************************************/
int swap_out()
{
int i;
for(i=0;i<1024;i++)
if (!swap_page[i]) break;
if (i>=1024) printf("ERROR OCCURS!\n");
else {
swap_page[i]=1;
page[mem_page[tail].pg_index][mem_page[tail].m_page]=(i<<22)|2;
nrout=i;
}
return i;
}
void visit_page(int i)
{
if (i!=head) {
mem_page[mem_page[i].pre].next=mem_page[i].next;
mem_page[i].next=head;
mem_page[head].pre=i;
if (i==tail) tail=mem_page[i].pre;
head=i;
}
head=i;
}
unsigned long get_freepage(int pg_index,int m_page,int* pswap)
{
unsigned long i;
if(mem_page[tail].flag) *pswap=swap_out();
else *pswap=-1;
i=tail;
swapout=tail;
mem_page[tail].flag=1;
mem_page[tail].pg_index=pg_index;
mem_page[tail].m_page=m_page;
visit_page(tail);
return i;
}
unsigned long genRan()
{
unsigned long res=0;
for (int i=10; i<=32; i++) res = res=(res<<1)+rand()%2;
return res;
}
/************************************************************************/
void main()
{
FILE * f;
int i,j,k;
unsigned long vAddr;
unsigned long pgd,pte;
int m_index=0;
int m_page=0;
int pg_index=0;
int nr;
/* initialization */
for(i=0;i<1024;i++) {
mem_page[i].next=i+1;
mem_page[i].pre=i-1;
}
srand((unsigned)time( NULL));
f=fopen("out.txt","w");
fprintf(f,"RefAddr \tPgd \t\tPte \t\tSwap_nr \n");
for(i=0;i<8192;i++)
{
vAddr=genRan();
m_index=vAddr>>22;
m_page=(vAddr>>12) & 1023;
if (!(dir[m_index]&1)) /* if last bit of m_index==0, table misses */
{
pgd = (m_index<<22) | 1;
dir[m_index]=pgd;
}
pgd=dir[m_index];
pg_index=pgd>>22;
j=(page[pg_index][m_page]<<30) >>30; /* last 2 bits of page */
k=page[pg_index][m_page]>>22; /* first 10 bits */
switch(j)
{
case 2: /* page on the swap page */
pte=(get_freepage(pg_index,m_page,&nr)<<22)|1;
page[pg_index][m_page]=pte;
swap_page[k]=0;
nrin=k;
break;
case 0: /* no mapping mem */
pte=(get_freepage(pg_index,m_page,&nr)<<22)|1;
page[pg_index][m_page]=pte;
break;
default: /* ==1, already point to a page */
pte=page[pg_index][m_page];
visit_page(k);
nr=-1;
}
if (nr==-1) fprintf(f,"%8X \t%8X \t%8X \t\t-1\n",vAddr,pgd,pte);
else fprintf(f,"%8X \t%8X \t%8X \t%8X\n",vAddr,pgd,pte,nr);
}
fclose(f);
}
/************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -