基本分页存储管理

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

《操作系统》课程实验报告实验名称:基本分页存储管理
班级:****************
学号:*************
姓名:**************
指导老师:***************
成绩:
一、实验目的:
1.熟悉并掌握基本分页存储管理的思想。

2.熟悉并掌握基本分页存储管理的分配和回收方式,并能够模拟实现。

二、实验内容:用高级语言模拟实现动态分区存储管理,要求:
1、内存空间的初始化——可以由用户输入初始内存空间各个物理块情况。

(用二维矩阵的方式按物理块号,逐行给出每个物理块的状态,1——表
示已分配,0——表示未分配,并能够将行标、列标转换为对应的物理块
号,以查看或修改每一个块的状态,要求:初始时部分物理块已分配)
2、基本分页的分配过程:由用户输入作业号和作业的大小(这里的大小是
逻辑页面数),实现分配过程:空间充足,分配,修改状态矩阵的相应位
置的值(值由0转变为1),并用专门的数据记录下该作业占用的物理块
的块号,以备删除作业时回收空间。

3、作业空间的的回收:用户输入作业号,实现分区回收(通过相应的数据
结构找到该作业占有的物理块号,将块号转变成对应的行标、列标,将
对应位置的值由1转变成0就完成了回收)
4、分区的显示:任何时刻,可以查看当前内存的情况(显示记录内存情况
的矩阵的值)
三、实验代码
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
int A[100]; //内存物理块 0 未使用 非0 已使用
int max = 99; //记录内存的物理块数,值为A[100]最大下标
int count = 100; //记录内存未使用物理块数
typedefstructLNode{
int f; //进程号
char name[8]; //进程名
int size; //进程大小
int n; //进程页数
int ye[100]; //页表,下标表示页号 内容表示进程各页所在物理块
structLNode *next;
}LNode,*LinkList;
//内存初始化
voidCreatA()
{
int i = 0;
for(i = 0;i <= max; i++)
A[i] = 0;
}
//建立新进程
voidNewNode(LinkList&L)
{
inti,j;
intm,k;
LinkList p;
LinkListnew_node;
new_node= (LinkList)malloc(sizeof(LNode)); p = L;
printf("\n输入进程号:");
scanf("%d",&new_node->f);
j=0;
while(p != NULL&&j<3) //查找进程号是否重复{
if(p->f!=new_node->f)
p = p->next;
else
{
printf("\n该进程已存在,重新输入:");
scanf("%d",&new_node->f);
p = L;//p重新指向头结点
j++;
}
}
if(j<3)
{printf("\n输入进程名称:");
scanf("%s",new_node->name);
printf("\n输入进程的大小:");
scanf("%d",&new_node->size);
new_node->n=new_node->size/1024;
k=new_node->size%1024;
if(k!=0) new_node->n=new_node->n+1;
printf("所需要的页数为:");
printf("%d\n",new_node->n);
if(new_node->n> count)
{
printf("\n内存物理块不足 新建进程失败!!!\n\n");
}
else
{
count -=new_node->n;
m = 0;
for(i= 0; i<= max; i++)
if(A[i] == 0 && m <new_node->n)
{
A[i]=new_node->f;
new_node->ye[m] = i;
m++;
}
if(L == NULL)
L = new_node;
else
{
p = L;
//查找最后一个节点
while(p->next != NULL)
{
p = p->next;
}
p->next = new_node;
}
new_node->next = NULL;
}
}
else
{
printf("\n错误次数过多,返回主菜单:"); }
}
//回收进程 释放内存voidFreeNode(LinkList&L)
{
LinkListp,q;
int z;
printf("请输入要删除的进程号:"); scanf("%d",&z);
p = L;//查找进程 用p记录q = p;
while(p != NULL) {
if(p->f==z)
{
printf("该进程已删除"); break;
}
else
{
q = p;
p = p->next;
}
}
if(p == NULL)
{
printf("\n该进程不存在!!!\n"); }
else
{
for(int i = 0; i < p->n; i++)
A[p->ye[i]] = 0;
count += p->n;
if(p->f== q->f)//要删除的是头结点{
L = p->next;
}
else
{
q->next = p->next;
}
}
}
//显示所有进程占用的物理块
voidPrintf(LinkList L)
{
int i = 0;
printf("\n内存物理块分配情况:\n");
LinkList p = L;
printf("\n各进程信息:\n");
printf("进程号\t\t进程名称\t进程页数\t所用物理块\n");
while(p != NULL)
{
printf("%d\t\t",p->f);
printf("%s\t\t",p->name);
printf("%d\t\t",p->n);
int i;
for(i = 0;i < p->n; i++)
printf("%d,",p->ye[i]);
printf("\n");
p = p->next;
}
}
// 查看进程
void look(LinkList L)
{
int z;
printf("输入要查询的进程号");
scanf("%d",&z);
LinkList p = L;
while (p!=NULL)
{
if(p->f ==z)
{
printf("进程号\t\t进程名称\t进程页数\t所用物理块\n"); printf("%d\t\t",p->f);
printf("%s\t\t",p->name);
printf("%d\t\t",p->n);
int i;
for(i = 0;i < p->n; i++)
printf("%d,",p->ye[i]);
printf("\n");
break;
}
else p=p->next;
}
if(p==NULL)
printf("要查询的进程不存在\n");
}
//显示内存块使用情况 不分进程
voidshowit()
{
int i = 0;
printf("\n****************************\n"); printf("| 内存物理块分配情况|\n");
printf("****************************\n");
for(i = 0; i <= max; i++)
{
printf("%d\t",A[i]);
if(i%10 == 9)
printf("\n");
}
}
void main()
{
CreatA();
printf("\n*☆****** 基本分页算法*****☆**\n"); printf("\n*☆****** 51 **杨霖********☆*\n"); LinkList L = NULL;
int i = 0;
do
{
printf("\n***********菜单*************\n");
printf( " 1 进程装入\n");
printf( " 2 进程退出\n");
printf( " 3 内存使用情况\n");
printf( " 4 进程查看\n");
printf( " 5 退出程序\n");
printf( "****************************\n"); printf("请输入你的选择(select):");
scanf("%d",&i);
switch(i){
case 1:
NewNode(L);//建立新的进程
Printf(L);//输出内存物理块分配情况和各进程概况break;
case 2:
FreeNode(L); //删除某进程
Printf(L); //输出内存物理块分配情况和各进程概况break;
case 3:
showit();//显示当前内存的使用情况
break;
case 4:
look(L);
break;
case 5:
printf("谢谢使用\n\n"); exit(0);
break;
}
}while(i != 0);
}
四、实验结果
1、选择操作界面
五、实验总结
因为使用数组编译的,所以比较上手。

程序刚写完时,记录“内存”中的进程数的变量和当前剩余总内存的变量的值不正确,经检查后发现是在结束进程时没有同时更新这些数据。

内存使用情况应该以哪种形式输出以及输出哪些信息。

最终我选择了尽可能详细地输出有用信息,通过空格、空行、对齐等手段尽力使输出格式简洁美观。

相关文档
最新文档