实验指南
运行环境:
Dev c++
算法思想:
本实验模拟分页存储管理,对于需要分配资源的作业,预先申请空间,内存空间满足要求,进行内存分配并插入作业链表,打印该作业页表信息与系统内存信息。对于需要回收资源的作业,若能再作业链表中找到该作业,进行内存释放并从作业链表中删除,最后打印系统内存信息。
关键数据结构定义:
int sc[MAX][MAX]= {0};//系统内存
int MemorySize;//系统内存大小
int WordLength;//字长
int WordNum;//页数
int BlockSize;//物理块
int BlockNum;//一个物理块的大小
int UsingBolckNum;
int AvailableBlockNum;
//作业节点
typedef struct link_node
{
char name[10];//作业名
int size[MAX][MAX];//作业页表
struct link_node *next;
} node;
程序框架:
//函数名:OperationChoice 函数参数:无
int OperationChoice()
{
//函数功能:打印操作菜单,选择需要进行的操作
}
//函数名:print 函数参数:无
void print()
{
//函数功能:打印系统内存信息
}
//函数名:allocate 函数参数:head(作业链表的第一个节点)
node* allocate(node *head)
{
//函数功能:建立作业节点,判断是否可以分配,可以进行下一步,进行内存分配,插 入作业链表,打印该作业的页表信息,打印系统内存信息
}
//函数名:recycle 函数参数:head(作业链表的第一个节点)
node* recycle(node *head)
{
//函数功能:找到待回收的作业节点,释放内存,从作业链表中删除,打印系统内存信息
}
//函数名:initMemory 函数参数:无
void initMemory(){
//函数功能:定义内存大小,字长与物理块大小,初始化系统内存,打印系统内存信息
}
//函数名:Apply 函数参数:无
void Apply()
{
initMemory();
while(1)
{
int c;
c=OperationChoice();
switch(c)
{
case 1:
head=allocate(head);
break;
case 2:
head=recycle(head);
break;
case 0:
return ;
}
}
}
int main()
{
Apply();
return 0;
}
测试用例:
/*
1000
64
1
1
job2
50
1
job1
30
2
job2
2
1
2
job1
0
*/
关键代码
cs
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include<string.h>
#define MAX 100
int sc[MAX][MAX]= {0};//系统内存
int MemorySize;//系统内存大小
int WordLength;//字长
int WordNum;//页数
int BlockSize;//一个物理块的大小
int BlockNum;//物理块数
int UsingBlockNum;//已用物理块数
int AvailableBlockNum;//系统剩余物理块数
//作业节点
typedef struct link_node
{
char name[10];//作业名
int size[MAX][MAX];//作业页表
int jobsize;//作业大小
struct link_node *next;
} node;
int OperationChoice();
void print();
node* allocate(node *head);
node* recycle(node *head);
void initMemory();
void Apply();
//函数名:OperationChoice 函数参数:无
int OperationChoice()
{
//函数功能:打印操作菜单,选择需要进行的操作
//printf(" 剩余物理块数%d\n",AvailableBlockNum);
printf("*********分页式管理*********\n");
printf(" * 1.内存分配 * \n");
printf(" * 2.内存去配 * \n");
printf(" * 0.退出 * \n");
printf(" 请输入选项[ ]\b\b");
int c;
scanf("%d",&c);
return c;
}
//函数名:print 函数参数:无
void print()
{
//函数功能:打印系统内存信息
int count = 0;
printf("主存位示图如下所示:\n ");
for(int i = 0;i<WordLength;i++)
{
if(i>60&&i%60 == 1)
printf("\n ");
printf(" %2d",i);
}
printf("\n");
for(int i = 0;i<WordNum;i++)
{
for(int j = 0;j<WordLength;j++)
{
if(j == 0)
{
printf("%3d| %2d",i,sc[i][j]);
}
else
{
if(j>60&&j%60 == 1)
{
printf("\n ");
}
printf(" %2d",sc[i][j]);
}
count++;
if(count == BlockNum)
break;
}
printf("\n");
}
printf("\n");
printf(" 剩余物理块数%d\n",AvailableBlockNum);
}
//函数名:allocate 函数参数:head(作业链表的第一个节点)
node* allocate(node *head)
{
//函数功能:建立作业节点,判断是否可以分配,可以进行下一步,进行内存分配,插 入作业链表,打印该作业的页表信息,打印系统内存信息
node *q;
q=head;
node *p = (node *)malloc(sizeof(node));
p->next = NULL;
print();
printf(" 请输入作业的名字:");
scanf("%s",&p->name);
printf(" 请输入作业需要分配的大小:");
scanf("%d",&p->jobsize);
if(p->jobsize<=AvailableBlockNum)
{
if(q == NULL)
{
q = p;
head = q;
}
else
{
while(q->next!=NULL)
{
q = q->next;
}
q->next = p;
q = p;
}
printf(" 分配成功!\n");
int count = 0;
for(int i = 0;i<WordNum;i++)
{
for(int j = 0;j<WordLength;j++)
{
if(sc[i][j] == 0)
{
//printf("置换%d %d\n",i,j);
sc[i][j] = 1;
UsingBlockNum++;
AvailableBlockNum--;
p->size[count][0] = count;
p->size[count][1] = i*WordLength + j;
count++;
if(count == p->jobsize)
break;
}
}
if(count == p->jobsize)
break;
}
print();
printf("**********打印%s作业的页表**********\n",p->name);
for(int i = 0;i<p->jobsize;i++)
printf(" %2d %2d\n",p->size[i][0],p->size[i][1]);
}
else
{
printf("分配失败!\n");
print();
free(p);
}
return head;
}
//函数名:recycle 函数参数:head(作业链表的第一个节点)
node* recycle(node *head)
{
//函数功能:找到待回收的作业节点,释放内存,从作业链表中删除,打印系统内存信息
node *pre,*p;
char Name[10];
printf("请输入你当前要回收的作业名:");
scanf("%s",&Name);
p = head;
while(p!=NULL)
{
if(strcmp(Name,p->name) == 0)
break;
pre = p;
p = p->next;
}
if(p == NULL)
printf("无此作业!回收失败!\n");
else
{
printf("该作业回收成功!\n");
if(p == head)
{
head = p->next;
}
else
{
pre->next = p->next;
}
for(int i = 0;i<p->jobsize;i++)
{
sc[p->size[i][1]/WordLength][p->size[i][1]%WordLength] = 0;
UsingBlockNum--;
AvailableBlockNum++;
}
free(p);
print();
}
return head;
}
//函数名:initMemory 函数参数:无
void initMemory(){
//函数功能:定义内存大小,字长与物理块大小,初始化系统内存,打印系统内存信息
printf("请输入系统内存空间的大小:");
scanf("%d",&MemorySize);
printf("请输入字长(16/32/64):");
scanf("%d",&WordLength);
printf("请输入物理块大小:");
scanf("%d",&BlockSize);
BlockNum = MemorySize/BlockSize;
WordNum = BlockNum/WordLength;
if(BlockNum%WordLength)
WordNum++;
UsingBlockNum = 0;
AvailableBlockNum = 0;
int count = 0;
for(int i = 0;i<WordNum;i++)
{
for(int j = 0;j<WordLength;j++)
{
sc[i][j] = rand()%2;
if(sc[i][j] == 1)
UsingBlockNum++;
else
AvailableBlockNum++;
count++;
if(count == BlockNum)
break;
}
if(count == BlockNum)
break;
}
print();
}
//函数名:Apply 函数参数:无
void Apply()
{
node *head = NULL;
initMemory();
while(1)
{
int c;
c=OperationChoice();
switch(c)
{
case 1:
head=allocate(head);
break;
case 2:
head=recycle(head);
break;
case 0:
return ;
}
}
}
int main()
{
Apply();
return 0;
}
运行结果
实验总结
①对链表的应用还不是很熟悉
②打印格式稍加修改了一下