操作系统 分页式存储器管理 C语言版

目的

1、熟练掌握分页式管理基本原理,并在实验过程中体现内存空间的分配与
回收、地址转换过程。
2、 掌握利用“位示图”管理内存与置换空间的分配与回收。
3、 掌握基本的位运算。
4、 掌握请求分页式存储管理基本原理,并在实验过程中体现内存与置换空
间的分配与回收、地址转换以及缺页处理过程。

实现分页式存储管理内存分配和地址转换过

程。进一步实现请求分页式存储管理过程,包括内存和置换空间管理、地址转换
以及缺页处理,能够体现 FIFO 和 LRU 算法思想。

#include <stdio.h>
#include <stdlib.h>
#include<math.h>
#define BLOCK_SiZE 1//块的大小
#define MEN_SIZE 64//内存大小
typedef struct Page
{
    int kuai;//快号
    int state;//状态
}P;
P p[10],p1[10];//页表
int n,m;
int c;//内存c*c
int b[10][10],b1[10][10];//位视图
float que = 0,que1 = 0;//缺页次数
float counts = 0,counts1 = 0;//总次数
int a[3] = {-1,-1,-1};//块表
int a1[3] = {-1,-1,-1};//块表1
void byteshow(int c)
{
    int count = 0;
    srand((unsigned)time(NULL));
    for(int i = 0;i<c;i++)
    {
        for(int j = 0;j<c;j++)
        {
            b[i][j] = b1[i][j]=rand()%2;
            if(b[i][j]==0)
            {
                count++;
            }
            if(count>3)
            {
                b[i][j] = b1[i][j]= 1;
            }
            printf("%d ",b[i][j]);

        }
        printf("\n");
    }
}
int findNULL()
{
    for(int i = 0;i<c;i++)
    {
        for(int j = 0;j<c;j++)
        {
            if(b[i][j] == 0)
            {
                //printf("%d ",i*m+j);
                return i*c+j;
            }
        }
    }
    return -1;
}
int findNULL1()
{
    for(int i = 0;i<c;i++)
    {
        for(int j = 0;j<c;j++)
        {
            if(b1[i][j] == 0)
            {
                //printf("%d ",i*m+j);
                return i*c+j;
            }
        }
    }
    return -1;
}
void updatekuai(int yeNum)
{
    for(int i = 2;i>=0;i--)
    {
        if(a[i]==-1)
        {
            a[i]=yeNum;
            break;
        }
    }
}
void updatekuai1(int yeNum)
{
    for(int i = 2;i>=0;i--)
    {
        if(a1[i]==-1)
        {
            a1[i]=yeNum;
            break;
        }
    }
}
void showKuai()
{
    printf("*******FIFO*******   *******LRU*******\n");
    printf("块表:                 块表:\n");
    for(int i = 0;i<3;i++)
    {
        printf("[%2d]                        [%2d]\n",a[i],a1[i]);
    }
}
void showYe()
{
    printf("*******FIFO*******   *******LRU*******\n");
    printf("页表                  页表\n");
    for(int i = 0;i<n;i++)
    {
        printf("%2d %2d %2d                   %2d %2d %2d\n",i,p[i].kuai,p[i].state,i,p1[i].kuai,p1[i].state);
    }
}
void zhihuan(int yeNum)
{
    p[yeNum].state = 1;//更新页表
    p[yeNum].kuai = p[a[2]].kuai;
    p[a[2]].state = -1;
    p[a[2]].kuai = -1;
    a[2] = a[1];//更新块表
    a[1] = a[0];
    a[0] = yeNum;
}
void zhihuan1(int yeNum)
{
    p1[yeNum].state = 1;//更新页表
    p1[yeNum].kuai = p[a1[2]].kuai;
    p1[a1[2]].state = -1;
    p1[a1[2]].kuai = -1;
    a1[2] = a1[1];//更新块表
    a1[1] = a1[0];
    a1[0] = yeNum;

}
void LRU(int yeNum)
{
    if(a1[0]==yeNum)
    {

    }
    if(a1[1]==yeNum)
    {
        a1[1] = a1[0];
        a1[0] = yeNum;
    }
    if(a1[2]==yeNum)
    {
        a1[2] = a1[1];
        a1[1] = a1[0];
        a1[0] = yeNum;
    }
}
int main()
{
    int flag = 1;
    int len;
    printf("请输入页长 剩余块的数目 块的大小(kb)\n");
    scanf(" %d %d %d",&n,&m,&len);
    for(int i = 0;i<n;i++)//初始化页表
    {
        p[i].state = -1;
        p1[i].state = -1;
        p[i].kuai = -1;
        p1[i].kuai = -1;
    }
    c = sqrt(MEN_SIZE/BLOCK_SiZE);
    byteshow(c);
    while(flag)
    {
        int luo;//逻辑地址
        int wuli,wuli1;//物理地址
        int yeNum;//页号
        int inyeNum;//页内地址
        int k,k1;
        printf("请输入逻辑地址\n");
        scanf(" %d",&luo);
        if(luo == -1)
        {
            flag = 0;
        }
        yeNum = luo/(BLOCK_SiZE*1024);
        inyeNum = luo%(BLOCK_SiZE*1024);
        if(yeNum>=n)
        {
            printf("逻辑地址越界\n");
        }else
        {
            if(p[yeNum].state == -1)//p 缺页
            {
                counts++;
                que++;
                k = findNULL();//查找空闲块
                if(k!=-1)
                {
                    p[yeNum].kuai = k;//更新页表
                    p[yeNum].state = 1;
                    b[k/c][k%c] = 1;
                    updatekuai(yeNum);//更新块表
                    wuli = k*1024+inyeNum;
                }else
                {
                    wuli = p[a[2]].kuai*1024+inyeNum;
                    zhihuan(yeNum);
                }
            }
            else//命中
            {
                counts++;
                wuli = p[yeNum].kuai*1024+inyeNum;
            }
            if(p1[yeNum].state == -1)//p1[]缺页
            {
                counts1++;
                que1++;
                k1 = findNULL1();//查找空闲块
                if(k!=-1)
                {
                    p1[yeNum].kuai = k1;//更新页表
                    p1[yeNum].state = 1;
                    b1[k1/c][k1%c] = 1;
                    updatekuai1(yeNum);//更新块表
                    wuli1 = k*1024+inyeNum;
                }else
                {
                    wuli1 = p1[a1[2]].kuai*1024+inyeNum;
                    zhihuan1(yeNum);
                }
            }
            else//命中
            {
                counts1++;
                //2.LRU
                LRU(yeNum);
                wuli1 = p1[a1[0]].kuai*1024+inyeNum;
            }
            showYe();
            showKuai();
            printf("物理地址为: %d         物理地址为: %d\n",wuli,wuli1);
            printf("访问次数%.lf              访问次数%.lf\n",counts,counts1);
            printf("缺页次数%.lf              缺页次数%.lf\n",que,que1);
            printf("缺页率%.2lf%         缺页率%.2lf%\n\n\n",(que/counts)*100,((que1/counts1)*100));
        }


    }
    return 0;
}

在这里插入图片描述

图 2-3 位示图实现截图
页面置换实现图1
图 2-5 页面置换实现图2
页面置换实现图3
页面置换实现图4
页面置换实现图5
页面置换实现图6

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木子Link

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值