山东大学软件学院操作系统课程设计Nachos-实验五-具有二级索引的文件系统

说明:blog 中写到的这几个实验,不全面而且也不是上交实验报告的最终版本(是自己实验过程中用typora简单记录的笔记),完整内容(含代码+实验报告)可以通过(山东大学软件学院操作系统课设)下载,或者微信公众号关注“陌兮blog”免费获取

文章目录

  • 一、二级索引
    • 1、问题分析
    • 2、实现二级索引
    • 3、测试

一、二级索引

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方法,增加可分配文件的大小,可创建二级索引

山东大学软件学院操作系统课程设计Nachos-实验五-具有二级索引的文件系统_第1张图片

修改filehdr.cc文件中Deallocate方法,增加对二级索引空间的释放

山东大学软件学院操作系统课程设计Nachos-实验五-具有二级索引的文件系统_第2张图片

修改filehdr.cc文件中ByteToSector方法,增加二级索引下扇区号的返回

山东大学软件学院操作系统课程设计Nachos-实验五-具有二级索引的文件系统_第3张图片

修改filehdr.cc文件中Print方法,打印输出二级索引相关数据

山东大学软件学院操作系统课程设计Nachos-实验五-具有二级索引的文件系统_第4张图片

山东大学软件学院操作系统课程设计Nachos-实验五-具有二级索引的文件系统_第5张图片

3、测试

山东大学软件学院操作系统课程设计Nachos-实验五-具有二级索引的文件系统_第6张图片

山东大学软件学院操作系统课程设计Nachos-实验五-具有二级索引的文件系统_第7张图片

山东大学软件学院操作系统课程设计Nachos-实验五-具有二级索引的文件系统_第8张图片

山东大学软件学院操作系统课程设计Nachos-实验五-具有二级索引的文件系统_第9张图片

山东大学软件学院操作系统课程设计Nachos-实验五-具有二级索引的文件系统_第10张图片

山东大学软件学院操作系统课程设计Nachos-实验五-具有二级索引的文件系统_第11张图片

山东大学软件学院操作系统课程设计Nachos-实验五-具有二级索引的文件系统_第12张图片

山东大学软件学院操作系统课程设计Nachos-实验五-具有二级索引的文件系统_第13张图片

山东大学软件学院操作系统课程设计Nachos-实验五-具有二级索引的文件系统_第14张图片

(更详细的内容以及代码部分见分享的资料吧,文章开头部分说明了获取方式)

你可能感兴趣的:(山东大学软件学院课程设计,操作系统,os,山东大学软件学院,nachos)