存储管理之分页存储管理方式C语言模拟(实验五)

       分页存储管理方式,将程序划分为若干个大小固定的区域(页),也把物理内存划分为大小和页相等的块,通过页表完成页到块的映射。


分页存储管理之C语言模拟:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define PAGE 20

int memory[PAGE];

struct page{ //描述进程信息
    int process;
    int page_num;
    int user[PAGE];
    int f;

    page(){
        f = 0;
        process = 0;
        page_num = 0;
        memset(user,0,PAGE);
    }

};

struct page *Mem = new page[PAGE];

void init_memory()
{
    printf("请输入一个4*5的二维矩阵,1代表已分配,0代表未分配\n");
    for(int i = 0; i < 4; i++)
        for(int j = 0; j < 5; j++)
        scanf("%d",&memory[i * 5 + j]);
}

void output()
{
    printf("当前内存的状态\n");
    for(int i = 0; i < PAGE; i++){
        printf("%d ",memory[i]);
        if(!((i +1) % 5))
            printf("\n");
    }
    printf("\n");
}

void c_malloc() /*分配内存*/
{
    int page_num,page_no;
    printf("请输入作业号和作业大小\n");
    scanf("%d%d",&page_no,&page_num);

    int sum = 0;
    for(int i = 0; i < PAGE; i++) /*检查内存状态,是否满足作业需求*/
        if(!memory[i])
            sum ++;

    if(sum < page_num){ /*可用内存页数小于作业需要的内存页数则结束*/
        printf("内存空间不足\n");
        return;
    }
    int page_s;
    for( page_s = 0; page_s < PAGE; page_s++){ /*检查是否存在相同作业号的作业*/
        if(Mem[page_s].f && Mem[page_s].process == page_no){ /*存在同名的给出提示并结束*/
            printf("存在同名的作业号\n");
            return;
        }

        if(Mem[page_s].f == 0){ /*作业状态标记为使用*/
            Mem[page_s].f  = 1;
            break;
        }
    }

    Mem[page_s].process = page_no;
    Mem[page_s].page_num = page_num;

    for(int i = 0,j = 0; i < PAGE; i++) /*更发内存页号为已使用*/
        if(!memory[i] && j < page_num){
             memory[i] = 1;
             Mem[page_s].user[j++] = i;
        }
}

void c_free() /*回收内存*/
{
    int page_no;
    printf("请输入作业号和作业大小\n");
    scanf("%d",&page_no);

    int page_f;
    for(page_f = 0; page_f < PAGE; page_f++) /*检查是否存在作业信息*/
        if(Mem[page_f].f && Mem[page_f].process == page_no) /*若存在则结束*/
            break;

    if(page_f == PAGE - 1){ /*作业信息不存在,提示并结束*/
        printf("作业信息不存在\n");
        return;
    }

    for(int i = 0; i < Mem[page_f].page_num; i++) /*把矩阵置0*/
        memory[Mem[page_f].user[i]] = 0;


    Mem[page_f].f = 0; /*把作业标志置0*/
}

int menu() /*菜单*/
{
    printf("添加作业:1\n");
    printf("删除作业:2\n");
    printf("输出内存状态:3\n");
    printf("结束作业:0\n");
    int menu;
    scanf("%d",&menu);

    return menu;
}

int main(int argc,char *argv[])
{
    init_memory(); /*初始化内存空间*/

    int t;

    while((t = menu())){

        if(t == 1)
            c_malloc(); /*分配内存*/
        else if(t == 2)
            c_free(); /*释放内存*/
        else if(t == 3)
            output(); /*输出内存信息*/
    }

    return 0;
}



评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值