(三)页式存储管理方案

页式存储管理方案
位示图
内存被划分成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;
}
}
}

 

转载于:https://my.oschina.net/garyun/blog/602904

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
假设每个面中可存放10条指令,分配给作业的内存块数为4。 用C语言语言模拟一个作业的执行过程,该作业共有320条指令, 即它的地址空间为32,目前它的所有都还未调入内存。在模拟过程中,如果所访问的指令已在内存,则显示其物理地址,并转下一条指令。如果所访问的指令还未装入内存,则发生缺,此时需要记录缺的次数,并将相应调入内存。如果4个内存块均已装入该作业,则需要进行面置换,最后显示其物理地址,并转向下一条指令。在所有320条指令执行完毕后,请计算并显示作业运行过程中发生的缺率。 置换算法:请分别考虑最佳置换算法(OPT)、先进先出(FIFO)算法和最近最久未使用算法(LRU)。 作业中指令的访问次序按下述原则生成: 50%的指令是顺序执行的; 25%的指令是均匀分布在前地址部分; 25%的指令是均匀分布在后地址部分; 具体的实施方法是:    在[0,319]的指令地址之间随机选取一起点m;    顺序执行下一条指令,即执行地址序号为m+1的指令;    通过随机数,跳转到前地址部分[0,m+1]中的某条指令处,其序号为m1;    顺序执行下一条指令,其地址序号为m1+1的指令;    通过随机数,跳转到后地址部分[m1+2,319]中的某条指令处,其序号为m2;    顺序执行下一条指令,其地址序号为m2+1的指令; 重复跳转到前地址部分,顺序执行,跳转到后地址部分,顺序执行的过程直至执行320条指令。
【实验目的】 1. 通过编写和调试存储管理的模拟程序以加深对存储管理方案的理解; 2. 熟悉虚存管理的各种面淘汰算法; 3. 通过编写和调试地址转换过程的模拟程序以加强对地址转换过程的了解。 【实验准备】 1.虚拟存储器的管理方  段管理  管理  段管理 2.面置换算法  先进先出置换算法  最近最久未使用置换算法  Clock置换算法  其他置换算法 【实验内容】 1. 实验题目 设计一个请求存储管理方案。并编写模拟程序实现之。产生一个需要访问的指令地址流。它是一系列需要访问的指令的地址。为不失一般性,你可以适当地(用人工指定地方法或用随机数产生器)生成这个序列,使得 50%的指令是顺序执行的。25%的指令均匀地散布在前地址部分,25%的地址是均匀地散布在后地址部分。为简单起见。面淘汰算法采用 FIFO面淘汰算法,并且在淘汰一时,只将该表中抹去。而不再判断它是否被改写过,也不将它写回到辅存。 2. 具体做法 产生一个需要访问的指令地址流;指令合适的面尺寸(例如以 1K或2K为1);指定内存表的最大长度,并对表进行初始化;每访问一个地址时,首先要计算该地址所在的号,然后查表,判断该是否在主存——如果该已在主存,则打印表情况;如果该不在主存且表未满,则调入一并打印表情况;如果该不足主存且表已满,则按 FIFO面淘汰算法淘汰一后调入所需的,打印表情况;逐个地址访问,直到所有地址访问完毕。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值