• 大小: 7KB
    文件类型: .cpp
    金币: 1
    下载: 0 次
    发布日期: 2021-05-22
  • 语言: C/C++
  • 标签:

资源简介

标准的成组链接法。30个盘块,五个一组,

资源截图

代码片段和文件信息

#include 
#include      //用来分配内存的头文件
//******************************************************************************
const int BlockSize=512;//盘块的大小
const int GroupSize=5;  //盘块分组数量,初始化时用
//******************************************************************************
typedef struct 
{
   int *top;  //指向盘块号栈的顶部,也就是栈的最上面(不是书上画的视觉的最上面)的元素的下一个地址
   int *base; //指向栈底,也就是装有盘块号栈的盘块的首地址
}Block;
Block DiskBlock[30];  //定义全局的系统盘块数组,用来模拟30个盘块的磁盘
Block MemoryBlock;    //定义内存盘块的堆栈,模拟运行在内存中的堆栈这里为了直观,所以将内存盘块栈和系统盘块分别定义,但是这样增加了代码的长度
int GroupNumber;      //盘块分组的数量,和GroupSize不一样,它是随着分配和回收而可能发生动态变化的
bool CopyPattern;     //这里的CopyPattern的设置是为了后面分配和回收的算法共享Copy()函数。
int SpareBlockNumber; //系统现有的空闲盘块数量(计数)
//******************************************************************************
bool InitBlock() //为盘块(包括内存盘块)分配空间,并进行部分初始化工作。
{
for(int i=0;i<30;i++)
{
        DiskBlock[i].base=(int *)malloc(BlockSize*sizeof(int));
if(!DiskBlock[i].base)
{
cout<<“存储分配失败“< return false;
}
DiskBlock[i].top = DiskBlock[i].base+1;
*(DiskBlock[i].base)=0;  //B.base指向的地址存放盘块数量,这里是初始化。
}
MemoryBlock.base=(int *)malloc(BlockSize*sizeof(int));
if(!MemoryBlock.base)
{
cout<<“存储分配失败“<     return false;
}
MemoryBlock.top = MemoryBlock.base+1;
*(MemoryBlock.base)=0;  //B.base指向的地址存放盘块数量,这里是初始化。
return true;
}
//******************************************************************************
static void InitialAllocation()//初始化系统磁盘的盘块的成组链接情况,这里为了简单直观起见,先按盘块号由小到大的顺序进行连接
{                              //程序运行中可以动态从控制台进行修改(分配或者回收)。
GroupNumber=0;
SpareBlockNumber=0;  //空闲盘块的数目初始置为0
for(int j=0;j<30/GroupSize;j++)
{
for(int i = 0;i {
if(j==0)
{
*(MemoryBlock.top++)  = i;
(*MemoryBlock.base)++;
SpareBlockNumber++; //空闲盘块的数目加一
}
else
{  
*((DiskBlock[(j-1)*GroupSize].top++))  = j*GroupSize+i;
(*DiskBlock[(j-1)*GroupSize].base)++;
SpareBlockNumber++; //空闲盘块的数目加一
}
}
GroupNumber++;
}
}
//******************************************************************************
bool Show()

int FirstBlockID;
int GroupID=0;  //用来标识当前盘块组的序号
bool IsFirstGroup=true;
    cout<< “***************************************************************\n“;
for(int i=0;i {  
if(IsFirstGroup)
{
MemoryBlock.top=MemoryBlock.base+1;
FirstBlockID=*(MemoryBlock.top);
cout<< “---|------------------------Group “<< GroupID <<“ has “<< *(MemoryBlock.base)<<“ Block(s) as follows:\n“;
cout<< “--->“;
for(int i=0;i<*(MemoryBlock.base);i++)
cout<<*(MemoryBlock.top++)<< “   “;
cout<< endl;
IsFirstGroup=false;
GroupID++;
}
else
{   
            DiskBlock[FirstBlockID].top=DiskBlock[FirstBlockID].base+1;
cout<< “---|------------------------Group “<< GroupID<<“ has “<< *(DiskBlock[FirstBlockID].base)<<“ Block(s) as follows:\n“;
cout<< “--->“;
for(int i=0;i<*(

评论

共有 条评论

相关资源