⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 (三)页式存储管理方案.txt

📁 主要集成了操作系统的主要算法
💻 TXT
字号:
(三)页式存储管理方案

页式存储管理方案 

位示图 

2002(?)的北京大学主考的上机试题 

内存被划分成2048块(页)。用32位字长的字存放位示图,为0的位表示该块尚未分配,为1的位表示该块已分配? 
实习检查: 

1、运行程序,由检查教师给出文件名,该文件中存有内存目前状况的位示图的数据(0和1的文件)。(程序应做提示,界面友好)。 
2、你所编制的程序应读入数据,存放在相应的数据结构中。 
3、显示友好的用户界面,由检查教师输入内存申请(总块数)。 
4、根据申请和位示图状态,为用户分配内存,并建立页表。 
5、输出位示图和页表。 


本程序包括主要实现位示图算法,比较简单 

VC++调试通过 

(C)copyright by Neo 

欢迎大家测试 请问题请Email:sony006@163.com 
*/ 

#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[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[j]); 
if(table[j]==1) 
freenum++; 
} 
} 
cout<<"初始位示图"<<endl; 
for(i=0;i<WORDNUM;i++){ 
for(j=0;j<WORD;j++){ 
cout<<table[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[j]==1){ 
j=0; 
while(table[j]==1)j++; 
if(table[j]==1) 
i++; 
} 
p->nums[k]=i*WORD+j; 
table[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[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[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<<" "; 
} 
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; 
} 
} 
} 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -