用分页管理,使用位示图实现主存的分配与回收
一、实验目的:
采用分页管理,使用位示图实现主存的分配与回收
二、实验内容:
主存是中央处理机能直接存取指令和数据的存储器。能否合理而有效地使用主存,在很大程度上将影响到整个计算机系统的性能。实现主存空间的分配与回收。
三、试验环境:
VC++
四、实验原理及试验步骤:
(1)主存的分页管理是把主存分成大小相等的若干块,作业的信息按块的大小分成若干页。作业装入主存时,可把作业的信息按页分散在主存的若干块中。为了标识主存中哪些块空闲,哪些块占用,可用一张位示图指示。位示图是由若干主存单元构成。其中每一位与一个主存块对应。分别用0和1表示对应块是空闲还是占用。
(2)假定某系统的主存被分成大小相等的64块,则位示图可用8个字节构成。再用一个变量记录当前可用的空闲块总数。如果已有第0、1、2、3、4、5、9、11、13、24、31共11块被占用,其位示图描述如图3-3所示。
(3)当要装入一个作业时,根据作业对主存的需求量,先查记录当前空闲块数变量的值是否满足作业的需求量。若不满足,则给出分配不成功的信息,且作业等待;若满足,则查位示图,按作业需求量找出为零的一些位,且置上占用标志1,并从当前空闲块变量中减去本次分配的块数。
按找到的位计算对应的块号。计算公式:块号=J*8+I。其中,J表示找到的字节号,I表示找到的位号。
根据分配给作业的块号,为作业建立一张页表,格式如图3-4所示。
位号
字节号 0 1 2 3 4 5 6 7
0 1 1 1 1 1 1 0 0
页号 块号
1
2
3
1 0 1 0 1 0 1 0 0
2 0 0 0 0 0 0 0 0
3 1 0 0 0 0 0 0 1
4 0 0 0 0 0 0 0 0
5 0 0 0 0 0 0 0 0
6 0 0 0 0 0 0 0 0
7 0 0 0 0 0 0 0 0
当前空闲块总数:53
图3-3 主存某时刻的位示图
(4)当一个作业执行结束时,释放主存。根据页表可知要释放的块号和块数。由块号计算其在位示图中的位置,将对应位的标志置0,以此表示该块已空闲。之后,再将释放的块数累加到当前空闲块变量中。
由块号计算字节号和位号的公式如下:
字节号=int(块号/8) 位号=mod(块号/8)
(5)设计和实现主存分配和回收的程序
五、实验代码:
#include<iostream>
#include<string>
#include<math.h>
using namespace std;
#define N 8 //将主存分为大小相等的NxN块
#define LENGTH 8 //主存每块大小
int MAP[N][N];//位示图
int FREE=0; //当前空闲的块数
int NUMBER; //分割后文件的块数
www.751com.cn
struct FileTest
{
string FileName; //装入的文件名
int FileSize; //装入的文件大小
int FilePageNumber; //页号
int FileKuaiNumber[40]; //块号
};
struct FileTest file;
void Filecin()//文件输入
{
cout<<"请输入要装入文件的文件名:";
cin>>file.FileName;
cout<<"请输入要装入文件的大小:";
cin>>file.FileSize;
cout<<"文件名:"<<file.FileName<<" "<<"文件大小:"<<file.FileSize<<endl;
}
void map_state()//输出位示图状态
{
cout<<"当前主存位示图状态如下(1表示占用,0表示空闲):"<<endl;
cout<<"-----------------------------------"<<endl;
for(int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
{
cout<<MAP[i][j]<<" ";//初始化位示图420