⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 memsimu.c

📁 Linux下使用c语言实现的内存管理模拟器 假设有台计算机物理内存大小为4MB,每个内存页大小为4k。采用分页机制
💻 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 + -