您的位置:首页 > 编程语言 > C语言/C++

存储管理之分页存储管理方式C语言模拟(实验五)

2016-12-13 11:32 531 查看
       分页存储管理方式,将程序划分为若干个大小固定的区域(页),也把物理内存划分为大小和页相等的块,通过页表完成页到块的映射。

分页存储管理之C语言模拟:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define PAGE 20

int memory[PAGE];

struct page{ //描述进程信息
int process;
int page_num;
int user[PAGE];
int f;

page(){
f = 0;
process = 0;
page_num = 0;
memset(user,0,PAGE);
}

};

struct page *Mem = new page[PAGE];

void init_memory()
{
printf("请输入一个4*5的二维矩阵,1代表已分配,0代表未分配\n");
for(int i = 0; i < 4; i++)
for(int j = 0; j < 5; j++)
scanf("%d",&memory[i * 5 + j]);
}

void output()
{
printf("当前内存的状态\n");
for(int i = 0; i < PAGE; i++){
printf("%d ",memory[i]);
if(!((i +1) % 5))
printf("\n");
}
printf("\n");
}

void c_malloc() /*分配内存*/
{
int page_num,page_no;
printf("请输入作业号和作业大小\n");
scanf("%d%d",&page_no,&page_num);

int sum = 0;
for(int i = 0; i < PAGE; i++) /*检查内存状态,是否满足作业需求*/
if(!memory[i])
sum ++;

if(sum < page_num){ /*可用内存页数小于作业需要的内存页数则结束*/
printf("内存空间不足\n");
return;
}
int page_s;
for( page_s = 0; page_s < PAGE; page_s++){ /*检查是否存在相同作业号的作业*/
if(Mem[page_s].f && Mem[page_s].process == page_no){ /*存在同名的给出提示并结束*/
printf("存在同名的作业号\n");
return;
}

if(Mem[page_s].f == 0){ /*作业状态标记为使用*/
Mem[page_s].f = 1;
break;
}
}

Mem[page_s].process = page_no;
Mem[page_s].page_num = page_num;

for(int i = 0,j = 0; i < PAGE; i++) /*更发内存页号为已使用*/
if(!memory[i] && j < page_num){
memory[i] = 1;
Mem[page_s].user[j++] = i;
}
}

void c_free() /*回收内存*/
{
int page_no;
printf("请输入作业号和作业大小\n");
scanf("%d",&page_no);

int page_f;
for(page_f = 0; page_f < PAGE; page_f++) /*检查是否存在作业信息*/
if(Mem[page_f].f && Mem[page_f].process == page_no) /*若存在则结束*/
break;

if(page_f == PAGE - 1){ /*作业信息不存在,提示并结束*/
printf("作业信息不存在\n");
return;
}

for(int i = 0; i < Mem[page_f].page_num; i++) /*把矩阵置0*/
memory[Mem[page_f].user[i]] = 0;

Mem[page_f].f = 0; /*把作业标志置0*/
}

int menu() /*菜单*/
{
printf("添加作业:1\n");
printf("删除作业:2\n");
printf("输出内存状态:3\n");
printf("结束作业:0\n");
int menu;
scanf("%d",&menu);

return menu;
}

int main(int argc,char *argv[])
{
init_memory(); /*初始化内存空间*/

int t;

while((t = menu())){

if(t == 1)
c_malloc(); /*分配内存*/
else if(t == 2)
c_free(); /*释放内存*/
else if(t == 3)
output(); /*输出内存信息*/
}

return 0;
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息