操作系统实验四 基本分页存储管理

在这里插入图片描述

一、目的与任务
目的:熟悉并掌握基本分页存储管理的思想及其实现方法,熟悉并掌握基本分页存储管理的分配和回收方式。
任务:模拟实现基本分页存储管理方式下内存空间的分配和回收。

二、内容、要求与安排
1、实验内容
内存空间的初始化——可以由用户输入初始内存空间各个物理块情况。(用二维矩阵的方式按物理块号,逐行给出每个物理块的状态,1——表示已分配,0——表示未分配,并能够将行标、列标转换为对应的物理块号,以查看或修改每一个块的状态,要求:初始时部分物理块已分配)
基本分页的分配过程:由用户输入作业号和作业的大小(这里的大小是逻辑页面数),实现分配过程:空间充足,分配,修改状态矩阵的相应位置的值(值由0转变为1),并用专门的数据记录下该作业占用的物理块的块号,以备删除作业时回收空间。
作业空间的回收:用户输入作业号,实现分区回收(通过相应的数据结构找到该作业占有的物理块号,将块号转变成对应的行标、列标,将对应位置的值由1转变成0就完成了回收)。
分区的显示:任何时刻,可以查看当前内存的情况(显示记录内存情况的矩阵的值)。
2、实验要求
(1)内存空间不足的情况,要有相应的显示;
(2)作业不能同名,但是删除后可以再用这个名字;
(3)作业空间回收是输入作业名,回收相应的空间,如果这个作业名不存在,也要有相应的提示。

三、实验代码

#include<bits/stdc++.h>

using namespace std;

const int Row = 10;//行
const int Column = 20;//列
int Remain = Row * Column;//剩余物理块数
int Blocks[Row][Column];//物理块
map<int, queue<int> > biao;//key是作业号,value是队列用来存这个作业存放在那个物理块,模拟了一个页表

void in_it();
void m_malloc();
void m_free();
void show();
void solve();
int menu();

int main()
{
    in_it();
    solve();
}

void in_it()
{
    memset(Blocks, 0, sizeof(Blocks));
    int flag;
    printf("手动选择物理块占用输入1,程序随机选择输入2:");
    scanf("%d", &flag);
    if(flag == 1)
    {
        for(int i=0; i<Row; i++)
            for(int j=0; j<Column; j++)
                scanf("%d", &Blocks[i][j]);
    }
    else
    {
        srand(time(NULL));
        for(int i=0; i<Row; i++)
            for(int j=0; j<Column; j++)
                rand() % 2 == 1 ? Blocks[i][j]=1,Remain-- : Blocks[i][j]=0;
        for(int i=0; i<Row; i++)
            for(int j=0; j<Column; j++)
                printf("%d%c", Blocks[i][j], j == Column-1 ? '\n' : ' ');
    }
}
void m_malloc()
{
    int id, si;
    printf("输入作业ID和大小:");
    while(scanf("%d%d", &id, &si), biao.find(id) != biao.end())
        printf("!!!ID重复,请重新输入作业ID和大小:");
    if(Remain < si)
        printf("!!!内存已满\n");
    else
    {
        for(int i=0; i<Row&&si!=0; i++)//从头遍历,放满si个就退出
        {
            for(int j=0; j<Column&&si!=0; j++)
            {
                if(!Blocks[i][j])
                {
                    si--;
                    Blocks[i][j] = 1;
                    biao[id].push(i * Column + j);
                    Remain--;
                }
            }
        }
        printf("分配成功\n");
    }
}
void m_free()
{
    int id;
    printf("输入作业ID:");
    while(scanf("%d", &id), biao.find(id) == biao.end())
        printf("!!!ID缺失,请重新输入作业ID:");
    while(!biao[id].empty())
    {
        int top = biao[id].front();
        Blocks[top/Column][top%Column] = 0;
        biao[id].pop();
        Remain++;
    }
    biao.erase(id);
    printf("释放成功\n");
}
void show()
{
    printf("内存块使用情况\n");
    for(int i=0; i<Row; i++)
        for(int j=0; j<Column; j++)
            printf("%d%c", Blocks[i][j], j == Column-1 ? '\n' : ' ');
}
void solve()
{
    int flag;
    while( (flag = menu()) )
    {
        switch(flag)
        {
        case 1:
            m_malloc();
            break;
        case 2:
            m_free();
            break;
        case 3:
            show();
            break;
        case -1:
            printf("!!!数据非法,重新输入:");
            break;
        }
    }
}

int menu()
{
    printf("--------------------\n");
    printf("Create:1\n");
    printf("Free:2\n");
    printf("View Info:3\n");
    printf("Over Input:0\n");
    printf("Plase Input A Num:");
    int m;
    scanf("%d",&m);
    switch(m)
    {
    case 0:
    case 1:
    case 2:
    case 3:
        return m;
        break;
    default:
        return -1;
    }

    return m;
}
  • 12
    点赞
  • 94
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值