nachos 扩展文件长度

本文分享了在文件系统中实现一级和二级索引的过程,包括对FileHeader类的修改,如添加索引属性、调整分配策略等。通过具体代码展示了如何在文件过大时采用索引来提高寻址效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前段时间又忙着投各种简历,面试,结果纷纷悲剧。只能当时锻炼胆量和总结经验了,结果也发现了自己很多不足,决定闭关一阵子好好巩固巩固再说。

Lab2 实在是没怎么认真做,基本都是参考上一些学长学姐做过的东西。也留下了很多BUG没有解决,所以也不敢放上来都。

Lab3 过几天又要交了,这今天又有的忙活了,这两天会写一些实验中的过程方出来,仅供参考,当然我也都是参考别人的做的。

攒人品,求过~


1. 首先,为FileHeader添加属性,一级索引和二级索引,同时减小NumDirect的大小

    int inDirectSector1;         // 一级索引

    int inDirectSector2;        // 二级索引

2. 修改FileHeader::Allocate(BitMap *freeMap, int fileSize)方法。

在这里只做了一级索引的方法,二级索引的方法类似。

bool FileHeader::Allocate(BitMap *freeMap, int fileSize)
{	      
    numBytes = fileSize;	     	   //文件大小
    numSectors  = divRoundUp(fileSize, SectorSize);   //根据文件大小计算所需块数
   if(NumDirect >= numSectors) 	    //如果直接索引的数据块足够
   { 
        if (freeMap->NumClear() < numSectors)	       //如果位图中空间块不足
return FALSE;	     	// not enough space
    for (int i = 0; i < numSectors; i++)	     	 //找到一个空间块并分配
dataSectors[i] = freeMap->Find();
   }
   else  	   //如果直接索引的数据块不够  
    {
    if(freeMap->NumClear() < numSectors +1) return FALSE; //多一块用来存索引
    for (int i = 0; i< NumDirect; i++)
dataSectors[i] = freeMap->Find();
     inDirectSector1 = freeMap->Find();	    //分配一块用来存索引
     int index[numSectors-NumDirect];
     for (int i = 0; i< numSectors - NumDirect;i++)
     {
index[i] = freeMap->Find();
     }
   	 synchDisk->WriteSector(inDirectSector1,(char *)index);  
    }
    return TRUE;
}


3. 修改ByteToSector 方法。

int FileHeader::ByteToSector(int offset)
{
    int sector = offset / SectorSize;
    if( sector < NumDirect)	 	 //如果只用到了直接索引
    return (dataSectors[sector]);
    else
    {     	 //如果还用到了一级索引
sector -=NumDirect;
int index[numSectors - NumDirect];
synchDisk->ReadSector(inDirectSector1,(char *)index);
return (index[sector]);
    }
}

4. 删除文件时也需要判断,如果用到了一级索引,还需要将一级索引中的块号释放掉。

5. 修改Print方法。当文件用到了一级索引时,需要先读取存储间接索引的块内容,然后打开一级索中用到的块,读取块内容。

实验结果如下,可以看到直接索引指向的块号为7-31一级索引所保存的块号为33-55






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值