说明:blog 中写到的这几个实验,不全面而且也不是上交实验报告的最终版本(是自己实验过程中用typora简单记录的笔记),完整内容(含代码+实验报告)可以通过(山东大学软件学院操作系统课设)下载,或者微信公众号关注“陌兮blog”免费获取
一、二级索引
1、问题分析
在 …/lab4 中,改进了 Nachos 文件系统的功能使它具有了扩展文件长度的功能,但文件扩展后文件的最大长度不能超出 3840 这个最大容量,也就是只能使用一级索引,所以本实验要实现的功能为nachos的二级索引。
在实验指导书中有关于nachos二级索引的相关讲解。在 Nachos 当前的设计中,文件数据空间的分配采用了一级索引方式。文件头(inode)仅能记录 NumDirect(这个值等于 30)个扇号。因此一个 Nachos 文件的最大容量仅有 NumDirect*SectorSize=3840 字节。现在我们的任务就是要在 Nachos 文件系统中增加类似 Unix 文件系统的多级索引方式,扩充 Nachos 能够记录的扇号,从而增大 Nachos 文件的最大容量。
查看源码文件 filehdr.h,可以看到定义了两个变量 NumDirect 和 MaxFileSize,分别表示nachos中,原有的一级索引能记录的扇区号数量与文件大小的最大值。
大概的思路是,首先定义dataSector2数组存储二级索引的扇区地址,一级索引数组的最后一项标记是否使用二级索引,以及存储二级索引数组的地址。如果未使用二级索引,则将一级索引数组中dataSector[numDirect]赋值为-1,如果使用二级索引,dataSector[numDirect]存储二级索引dataSector2所在的块号。当判断出文件大小超过一级索引的容量时,通过bitmap为文件头的dataSectors2分配空间,返回的Sector号存在一级索引数组的最后一项中。在读取文件数据时,同样先通过一级索引读取数据,然后通过一级索引最后一项获取二级索引的地址,然后访问二级索引读取文件数据。
需要修改 lab4 实现的ExtendSpace方法,使其可以扩展的空间更大,可处理二级索引;修改Allocate方法,使其在创建文件时可分配二级索引;修改Deallocate方法,使其在释放空间时,可对二级索引进行处理;修改ByteToSector方法,使其可以查询二级索引下的数据;最后再修改Print方法,增加二级索引相关内容的打印,便于调试输出,验证结果正确性。
2、实现二级索引
首先在filehdr.h文件中定义二级索引机制下,文件的最大扇区数和二级索引能够记录的扇号数量
#define MaxNumSector ((SectorSize*2 - 3 * sizeof(int)) / sizeof(int))
#define NumDirect2 (SectorSize / sizeof(int)) //二级索引
修改filehdr.cc文件中ExtendSpace方法,增加二级索引的创建
//lab5 changed+++++++++++++++++++++++++++++++
bool
FileHeader::ExtendSpace(OpenFile *bitmapfile,int newSize)
{
int newNumSectors = divRoundUp(newSize, SectorSize);
if(newNumSectors == numSectors){
numBytes = newSize;
return true;
}
//需要扩展的扇区
int diffSector = newNumSectors - numSectors;
BitMap *freeMap = new BitMap(NumSectors);
freeMap->FetchFrom(bitmapfile);
//文件过大(超过二级索引)|| 磁盘空间不足
if(newNumSectors>MaxNumSector||freeMap->NumClear()< diffSector){
return false;
}
//分配扇区,修改文件头信息
int i;
//不需要二级索引
if (newNumSectors<NumDirect){
for(i = numSectors; i<newNumSectors; i++)
{
dataSectors[i] = freeMap->Find();
}
//需要二级索引
}else{
//二级索引
int dataSectors2 [NumDirect2];
//扩展前未使用二级索引
if(numSectors<NumDirect){
for(i = numSectors; i<NumDirect; i++)
{
dataSectors[i] = freeMap->Find();
}
//二级索引部分
for (i=0; i < newNumSectors-NumDirect+1; i++)
dataSectors2[i] = freeMap->Find();
}else{
//扩展前已经使用二级索引
//读取二级索引
synchDisk->ReadSector(dataSectors[NumDirect-1], (char *)dataSectors2);
for (i=numSectors-NumDirect+1; i < newNumSectors-NumDirect+1; i++)
dataSectors2[i] = freeMap->Find();
}
//二级索引地址保存在一级索引的最后一项dataSectors[NumDirect-1]
synchDisk->WriteSector(dataSectors[NumDirect-1], (char *)dataSectors2);
}
//更新文件头信息
numBytes = newSize;
numSectors = newNumSectors;
freeMap->WriteBack(bitmapfile);
return true;
}
//lab5 changed+++++++++++++++++++++++++++++++
修改filehdr.cc文件中Allocate方法,增加可分配文件的大小,可创建二级索引
修改filehdr.cc文件中Deallocate方法,增加对二级索引空间的释放
修改filehdr.cc文件中ByteToSector方法,增加二级索引下扇区号的返回
修改filehdr.cc文件中Print方法,打印输出二级索引相关数据
3、测试
(更详细的内容以及代码部分见分享的资料吧,文章开头部分说明了获取方式)