操作系统原理与实验——实验九分页式存储
实验指南
运行环境:
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 #include #include #include #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;i60&&i%60 == 1) printf("\n "); printf(" %2d",i); } printf("\n"); for(int i = 0;inext = NULL; print(); printf(" 请输入作业的名字:"); scanf("%s",&p->name); printf(" 请输入作业需要分配的大小:"); scanf("%d",&p->jobsize); if(p->jobsizenext!=NULL) { q = q->next; } q->next = p; q = p; } printf(" 分配成功!\n"); int count = 0; for(int i = 0;isize[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;ijobsize;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;ijobsize;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
还没有评论,来说两句吧...