实验指南
运行环境:
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
*/
关键代码
#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++;elseAvailableBlockNum++;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;
}
运行结果
实验总结
①对链表的应用还不是很熟悉
②打印格式稍加修改了一下