《基本分存储管理.docx》由会员分享,可在线阅读,更多相关《基本分存储管理.docx(8页珍藏版)》请在三一文库上搜索。
1、操作系统课程实验报告实验名称:基本分页储存管理实验五基本分页存储管理 实验目的:熟悉并掌握基本分页存储管理的思想。熟悉并掌握基本分页存储管理的分配和回收方式,并能够模拟实现。实验内容:用高级语言模拟实现基本分页存储管理,要求:1、 内存空间的初始化一一可以由用户输入初始内存空间各个物理块情况。(用二维矩阵的方式按物理块号,逐行给出每个物理块的 状态,1表示已分配,0表示未分配,并能够将行标、列标 转换为对应的物理块号,以查看或修改每一个块的状态,要求:初 始时部分物理块已分配)2、 基本分页的分配过程:由用户输入作业号和作业的大小 (这里的 大小是逻辑页面数),实现分配过程:空间充足,分配,修
2、改状态 矩阵的相应位置的值(值由0转变为1),并用专门的数据记录下 该作业占用的物理块的块号,以备删除作业时回收空间。3、 作业空间的的回收:用户输入作业号,实现分区回收(通过相应 的数据结构找到该作业占有的物理块号,将块号转变成对应的行标、列标,将对应位置的值由1转变成0就完成了回收)4、 分区的显示:任何时刻,可以查看当前内存的情况(显示记录内存情况的矩阵的值)要求考虑:(1)内存空间不足的情况,要有相应的显示;(2)作业不能同名,但是删除后可以再用这个名字;(3)作业空间回收是输入作业名,回收相应的空间,如果这个作业 名不存在,也要有相应的提示。三、实验代码#include <&g
3、t;#include <>#define N 100/共有100个内存块int processNN+1; /存放每个进程的页表int blockN;/内存块状态标志数组,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<N; i+)blocki = 0;fo
4、r (i=0; i<20; i+)blockrand()%(N-1) = 1;blockCount = 0;for (i=0; i<N; i+)if (blocki = 0) blockCount+;/初始化存放进程的数组for (i=0; i<N; i+)processi0 = 0;for (j=1; j<N; j+)processij = -1;processCount = 0;printf("初始化结果如下:");output();flag = false;void output()printf("n内存总量:%d块,已用空间:%d块
5、,剩余空间:%d块,进程总 数:%d 个n", N, N-blockCount, blockCount, processCount);if (flag && blockCount < N)printf("已使用的内存块(d): n", N-blockCount);for (int k=0,count=0; k<N; k+)if (blockk = 1)printf("%2d ", k, +count);if (count = 15) putchar('n');count = 0;putchar(
6、9;n');/输出各进程占用内存详细情况if (processCount > 0)(printf("内存详细使用情况如下:n");for (int i=0; i<N; i+)(if (processi0 > 0)(printf("进程号:d n 占用内存块(2d): ", i, processi0);for (int j=1,count=0; j<=processi0; j+)(printf("%2d ", processij, count+);if (count = 15)(putchar('
7、n');printf("");count = 0;putchar('n');elseprintf("当前内存无进程! n");/*/输出空闲内存块if (blockCount > 0)(printf("空闲内存块(d): n", blockCount);for (int k=0,count=0; k<N; k+)(if (blockk = 0)printf("%2d ", k, +count);if (count = 15)(putchar('n');count
8、= 0;putchar('n');*/putchar('n');bool createProcess()(int pid, pages, k = 0;loop:printf("请输入进程号(小于%d)和所需页面数:",N);scanf("%d%d", &pid, &pages);if (pid > 99)(printf("错误!进程号过大! n");goto loop;if (pages > blockCount)return false;blockCount -= page
9、s;processpid0 = pages;for (int i=1; i<=pages; i+)(while (blockk=1 && k<100)k+;processpidi = k;blockk = 1;k+;processCount+;return true;bool endProcess()(int pid, pages;if (processCount < 1)(printf("当前内存没有进程! nn");return false;processCount);printf("当前内存中的进程有 %d个,进程号为:”,
10、 for (int i=0; i<N; i+)if (processi0 > 0)printf("%2d ", i);putchar('n');printf("请输入您要结束的进程号(小于d): ", N);scanf("%d", &pid);pages = processpid0;if (pages = 0)(printf("对不起!该进程不存在!n");return false;)for (int j=1; jpages; j+)(blockprocesspidj = 0;p
11、rocesspidj = -1;)processpid0 = 0;processCount-;blockCount += pages;return true;)void menu()(int choice;while (true)(printf("操作菜单:n");printf(" 1 -创建进程n 2 -结束进程n 3 -查看内存n 0 -退出程 序 n");printf("请输入您要进行的操作:");scanf("%d”, &choice);switch (choice)(case 1:if (createPro
12、cess()printf("创建新进程成功! nn");elseprintf("抱歉!内存空间不足,创建新进程失败!nn");break;case 2:if (endProcess()printf("进程已结束! nn");elseprintf("进程结束失败!nn");break;case 3:output();break;case 0:return ;default:printf("对不起!您的选择有误!请重新选择!nn");)void main()(init();menu();)四、实验结
13、果进程号为, 2内存总量典块,已用空同18块,剩余空间:曜块,进程总数: 当刎内存无进程!内存息至:I丽块,己用至同! 43块,剩余至同:打块,进程总数 量蠡细期椒加R占用内存块:33: 22 23 24 26 27 28 3B 31 32 33 35 36 37 38 394B 42 43 44 45 4G 47 48 49L个9个2个行进来X 11 俏工% 操辜 的蕾挑的绐I.>中野束 他盒心结一存序 st内程 建laH'P出 包空杳混32 3 0-笔创维查退骋 荚->->7->入 乍一-二刖3荚->->->->入 作;二瑜操卷存序号
14、2 3 ®*±M一创维查退敏12个建*出 出空查退K->->->->八月入己 r -嗨划. L 2 3 a 江阴3依2楂 嗓辜 进的结 >中r,T .位存U结加工 口节 程eB 进fl一存序 进进内程->->入R.八已 -瑜,至2 3 a王后当主五、实验总结在存储器管理中,连续分配方式会形成许多 碎片”,虽然可通过 紧凑”方法 将许多碎片拼接成可用的大块空间,但须为之付出很大开销。如果允许将一个进程直接分散地装入到许多不相邻的分区中,则无须再进行紧凑”。基于这一思想而产生了离散分配方式。如果离散分配的基本单位是页, 则称为分页存储管理方式。在分页存储管理方式中,如果不具备页面对换功能, 则称为基本分页存储管理方式,或称为纯分页存储管理方式,它不具有支持实现 虚拟存储器的功能,它要求把每个作业全部装入内存后方能运行。