页式存储管理方案
位示图
内存被划分成2048块(页)。用32位字长的字存放位示图,为0的位表示该块尚未分配,为1的位表示该块已分配?
实习检查:
1、运行程序,由检查教师给出文件名,该文件中存有内存目前状况的位示图的数据(0和1的文件)。(程序应做提示,界面友好)。
2、你所编制的程序应读入数据,存放在相应的数据结构中。
3、显示友好的用户界面,由检查教师输入内存申请(总块数)。
4、根据申请和位示图状态,为用户分配内存,并建立页表。
5、输出位示图和页表
本程序包括主要实现位示图算法,比较简单.
页式存储管理方案
#include<stdio.h>
#include<iostream.h>
#include<string.h>
const int PAGES=256; //定义总块数
const int WORD=32; //定义字长
const int WORDNUM=PAGES/WORD; //定义总字数
typedef struct node{
char jobname[20];
int num;
int nums[PAGES];
struct node *next;
}jobs;
int table[WORDNUM][WORD];
int freenum=0;
jobs *head;
//初始化函数
void initial(){
int i,j;
jobs *p;
//初始化位示图
for(i=0;i<WORDNUM;i++){
for(j=0;j<WORD;j++){
table[i][j]=0;
}
}
//初始化作业表头
p=new jobs;
strcpy(p->jobname,"null");
p->num=0;
p->next=NULL;
head=p;
}
//读入位示图初始数据
void readData()
{
int i,j;
FILE *fp;
char fname[20];
cout<<"请输入初始位示图数据文件名:"<<endl;
cin>>fname;
if((fp=fopen(fname,"r"))!=NULL){
for(i=0;i<WORDNUM;i++){
for(j=0;j<WORD;j++){
fscanf(fp,"%d",&table[i][j]);
if(table[i][j]==1)
freenum++;
}
}
cout<<"初始位示图"<<endl;
for(i=0;i<WORDNUM;i++){
for(j=0;j<WORD;j++){
cout<<table[i][j]<<" ";
}
cout<<endl;
}
cout<<"总空闲块数:"<<freenum;
}
else{
cout<<"文件不能打开"<<endl;
}
}
//新加入作业函数
void add()
{
char jobname[20];
int num;
jobs *p;
int i,j,k=0;
cout<<"请输入新增的作业名:";
cin>>jobname;
cout<<"新增作业所需页数:";
cin>>num;
if(num<=freenum){
freenum-=num;
p=new jobs;
strcpy(p->jobname,jobname);
p->num=num;
for(k=0;k<num;k++){
i=0;
j=0;
while(table[i][j]==1){
j=0;
while(table[i][j]==1)j++;
if(table[i][j]==1)
i++;
}
p->nums[k]=i*WORD+j;
table[i][j]=1;
}
p->next=head->next;
head->next=p;
}
else{
cout<<"错误,当前剩余页数小于所需页数,请稍候再试:}"<<endl;
}
}
//完成作业函数
void finish()
{
char jobname[20];
jobs *p,*q;
int n,i,j,num,k;
cout<<"请输入完成的作业名:";
cin>>jobname;
p=head->next;
q=head;
while(p!=NULL){
if(strcmp(p->jobname,jobname)){
q=q->next;
}
p=p->next;
}
p=q->next;
num=p->num;
for(k=0;k<num;k++){
n=p->nums[k];
i=n/WORD;
j=n%WORD;
table[i][j]=0;
}
freenum+=num;
q->next=p->next;
delete p;
}
//显示当前位示图函数
void view_table()
{
int i,j;
cout<<"当前位示图"<<endl;
for(i=0;i<WORDNUM;i++){
for(j=0;j<WORD;j++){
cout<<table[i][j]<<" ";
}
cout<<endl;
}
cout<<"总空闲块数:"<<freenum<<endl;
}
//显示所有页表函数
void view_pages()
{
jobs *p;
int i;
p=head->next;
if(p==NULL)cout<<"当前没有用户作业"<<endl;
else
cout<<"当前所有的用户作业页表情况"<<endl;
while(p!=NULL){
cout<<"作业名:"<<p->jobname<<" 所用块数:"<<p->num<<endl;
cout<<"本作业所点块的序列是:"<<endl;
for(i=0;i<p->num;i++){
cout<<p->nums[i]<<" ";
}
cout<<endl;
p=p->next;
}
}
//显示版权信息函数
void version()
{
cout<<endl<<endl;
cout<<" ┏━━━━━━━━━━━━━━━━━━━━━━━┓"<<endl;
cout<<" ┃ 页式内存管理系统模拟程序 ┃"<<endl;
cout<<" ┠───────────────────────┨"<<endl;
cout<<" ┃ (c)All Right Reserved Neo ┃"<<endl;
cout<<" ┃ sony006@163.com ┃"<<endl;
cout<<" ┃ version 2004 build 1122 ┃"<<endl;
cout<<" ┗━━━━━━━━━━━━━━━━━━━━━━━┛"<<endl;
cout<<endl<<endl;
}
void main()
{
int t=1,chioce;
version();
initial();
readData();
while(t==1){
cout<<endl<<"==========================================="<<endl;
cout<<" 页式内存管理系统模拟程序"<<endl;
cout<<"==========================================="<<endl;
cout<<"1.加入新作业 2.完成作业 3.显示当前内存位示图 4.显示所有作业页表 0.退出"<<endl;
cout<<"请选择:";
cin>>chioce;
switch(chioce){
case 1:
add();
break;
case 2:
finish();
break;
case 3:
view_table();
break;
case 4:
view_pages();
break;
case 0:
t=0;
break;
default:
cout<<"选择错误"<<endl;
}
}
}
#include<iostream.h>
#include<string.h>
const int PAGES=256; //定义总块数
const int WORD=32; //定义字长
const int WORDNUM=PAGES/WORD; //定义总字数
typedef struct node{
char jobname[20];
int num;
int nums[PAGES];
struct node *next;
}jobs;
int table[WORDNUM][WORD];
int freenum=0;
jobs *head;
//初始化函数
void initial(){
int i,j;
jobs *p;
//初始化位示图
for(i=0;i<WORDNUM;i++){
for(j=0;j<WORD;j++){
table[i][j]=0;
}
}
//初始化作业表头
p=new jobs;
strcpy(p->jobname,"null");
p->num=0;
p->next=NULL;
head=p;
}
//读入位示图初始数据
void readData()
{
int i,j;
FILE *fp;
char fname[20];
cout<<"请输入初始位示图数据文件名:"<<endl;
cin>>fname;
if((fp=fopen(fname,"r"))!=NULL){
for(i=0;i<WORDNUM;i++){
for(j=0;j<WORD;j++){
fscanf(fp,"%d",&table[i][j]);
if(table[i][j]==1)
freenum++;
}
}
cout<<"初始位示图"<<endl;
for(i=0;i<WORDNUM;i++){
for(j=0;j<WORD;j++){
cout<<table[i][j]<<" ";
}
cout<<endl;
}
cout<<"总空闲块数:"<<freenum;
}
else{
cout<<"文件不能打开"<<endl;
}
}
//新加入作业函数
void add()
{
char jobname[20];
int num;
jobs *p;
int i,j,k=0;
cout<<"请输入新增的作业名:";
cin>>jobname;
cout<<"新增作业所需页数:";
cin>>num;
if(num<=freenum){
freenum-=num;
p=new jobs;
strcpy(p->jobname,jobname);
p->num=num;
for(k=0;k<num;k++){
i=0;
j=0;
while(table[i][j]==1){
j=0;
while(table[i][j]==1)j++;
if(table[i][j]==1)
i++;
}
p->nums[k]=i*WORD+j;
table[i][j]=1;
}
p->next=head->next;
head->next=p;
}
else{
cout<<"错误,当前剩余页数小于所需页数,请稍候再试:}"<<endl;
}
}
//完成作业函数
void finish()
{
char jobname[20];
jobs *p,*q;
int n,i,j,num,k;
cout<<"请输入完成的作业名:";
cin>>jobname;
p=head->next;
q=head;
while(p!=NULL){
if(strcmp(p->jobname,jobname)){
q=q->next;
}
p=p->next;
}
p=q->next;
num=p->num;
for(k=0;k<num;k++){
n=p->nums[k];
i=n/WORD;
j=n%WORD;
table[i][j]=0;
}
freenum+=num;
q->next=p->next;
delete p;
}
//显示当前位示图函数
void view_table()
{
int i,j;
cout<<"当前位示图"<<endl;
for(i=0;i<WORDNUM;i++){
for(j=0;j<WORD;j++){
cout<<table[i][j]<<" ";
}
cout<<endl;
}
cout<<"总空闲块数:"<<freenum<<endl;
}
//显示所有页表函数
void view_pages()
{
jobs *p;
int i;
p=head->next;
if(p==NULL)cout<<"当前没有用户作业"<<endl;
else
cout<<"当前所有的用户作业页表情况"<<endl;
while(p!=NULL){
cout<<"作业名:"<<p->jobname<<" 所用块数:"<<p->num<<endl;
cout<<"本作业所点块的序列是:"<<endl;
for(i=0;i<p->num;i++){
cout<<p->nums[i]<<" ";
}
cout<<endl;
p=p->next;
}
}
//显示版权信息函数
void version()
{
cout<<endl<<endl;
cout<<" ┏━━━━━━━━━━━━━━━━━━━━━━━┓"<<endl;
cout<<" ┃ 页式内存管理系统模拟程序 ┃"<<endl;
cout<<" ┠───────────────────────┨"<<endl;
cout<<" ┃ (c)All Right Reserved Neo ┃"<<endl;
cout<<" ┃ sony006@163.com ┃"<<endl;
cout<<" ┃ version 2004 build 1122 ┃"<<endl;
cout<<" ┗━━━━━━━━━━━━━━━━━━━━━━━┛"<<endl;
cout<<endl<<endl;
}
void main()
{
int t=1,chioce;
version();
initial();
readData();
while(t==1){
cout<<endl<<"==========================================="<<endl;
cout<<" 页式内存管理系统模拟程序"<<endl;
cout<<"==========================================="<<endl;
cout<<"1.加入新作业 2.完成作业 3.显示当前内存位示图 4.显示所有作业页表 0.退出"<<endl;
cout<<"请选择:";
cin>>chioce;
switch(chioce){
case 1:
add();
break;
case 2:
finish();
break;
case 3:
view_table();
break;
case 4:
view_pages();
break;
case 0:
t=0;
break;
default:
cout<<"选择错误"<<endl;
}
}
}