操作系统-基本分页存储管理(内有代码)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基本分页存储管理
实验目的
连续内存分配方式会形成许多“碎片”,虽然可以通过“紧凑”方法将许多碎片拼接成可用的大块空间,但须为之付出很大开销。如果允许将一个进程直接分散地装入到许多不相邻接的分区中,则无需再进行“紧凑”。基于这一思想而产生了离散分配方式。如果离散分配的基本单位是页,则称为分页存储管理方式;如果离散分配的基本单位是段,则称为分段存储管理方式。
在分页存储管理方式中,如果不具备页面兑换功能,则称为基本的分页存储管理方式,或称为纯分页存储管理方式,它不具备支持虚拟存储器的功能,它要求把每个作业全部装入内存后方能运行。
本实验通过程序模拟操作系统的基本分页存储管理方式,进一步理解这一内存分配方式的原理和特点,加深对理论知识的掌握。
实验要求
1、用C语言或Java语言编写程序模拟操作系统对内存的基本分页存储管理方式
2、程序要能正确对“内存”进行“分配”和“回收”,能接受用户的输入,显示内存的分配情况,并有一定的容错能力。
3、每个人独立按时完成实验内容。
实验内容
本实验假定内存空间已经按块划分,目标程序无需关心内存块大小等底层细节,只需按算法对内存块进行分配即可。程序应该实现以下功能:
1、内存初始化。假定内存块共有N个,初始化后的内存空间应该有一部分已经被使用,这可以用随机数或程序内部的其他算法完成。
2、程序应该能接受用户输入的进程信息,并为之分配内存,返回分配结果(成功或失败),注意,此处应该考虑到不合法的输入并进行相应处理。
3、程序能回收用户指定的进程所占用的内存空间,因此,程序可能需要为每个进程分配一个唯一的进程号并给出详细的提示信息。
4、能直观合理地显示内存分配情况。
5、程序界面友好,便于操作和查看运行结果。
#include
#include
#define N 100 // 共有100个内存块
int process[N][N+1]; // 存放每个进程的页表
int block[N]; // 内存块状态标志数组,0:空闲,1:使用
int blockCount; // 记录当前内存剩余空间
int processCount; // 记录当前进程数
bool flag = true;
void init();
void output();
bool createProcess();
bool endProcess();
void init()
{
int i, j;
// 初始化内存状态标志数组
for (i=0; i block[i] = 0; for (i=0; i<20; i++) block[rand()%(N-1)] = 1; blockCount = 0; for (i=0; i if (block[i] == 0) blockCount++; // 初始化存放进程的数组 for (i=0; i process[i][0] = 0; for (j=1; j process[i][j] = -1; } processCount = 0; printf("初始化结果如下:"); output(); flag = false; } void output() { printf("\n内存总量:%d 块, 已用空间:%d 块, 剩余空间:%d 块, 进程总 数:%d 个\n", N, N-blockCount, blockCount, processCount); if (flag && blockCount < N) { printf("已使用的内存块(%d):\n", N-blockCount); for (int k=0,count=0; k { if (block[k] == 1) printf("%2d ", k, ++count); if (count == 15) { putchar('\n'); count = 0; } } putchar('\n'); } // 输出各进程占用内存详细情况 if (processCount > 0) { printf("内存详细使用情况如下:\n"); for (int i=0; i { if (process[i][0] > 0) { printf("进程号:%d \n占用内存块(%2d):", i, process[i][0]); for (int j=1,count=0; j<=process[i][0]; j++) { printf("%2d ", process[i][j], count++); if (count == 15) { putchar('\n'); printf(" "); count = 0; } } putchar('\n'); } } } else printf("当前内存无进程!\n"); /*// 输出空闲内存块 if (blockCount > 0) {