物理块与逻辑块地址转换(C++)

#include <iostream>
#include <random>

int logic_block_to__phy_block(int logic_block_num)
{
    /*初始化物理块的内容*/
    struct phy_block
    {
        int data[2];
    };
    phy_block phy_block_s[22];

    /* 直接索引文件内容,随机初始化 */
    for (int i = 0; i < 12; ++i)
        for (auto &it : phy_block_s[i].data)
            it = rand();

    /*一级索引初始化*/
    phy_block_s[12].data[0] = 13;
    phy_block_s[12].data[1] = 14;

    for (int i = 13; i < 15; ++i)
        for (auto &it : phy_block_s[i].data)
            it = rand();

    /*二级索引初始化*/
    /* 一级目录 */
    phy_block_s[15].data[0] = 16;
    phy_block_s[15].data[1] = 17;
    /* 二级目录 */
    phy_block_s[16].data[0] = 18;
    phy_block_s[16].data[1] = 19;
    phy_block_s[17].data[0] = 20;
    phy_block_s[17].data[1] = 21;
    for (int i = 18; i < 22; ++i)
        for (auto &it : phy_block_s[i].data)
            it = rand();

    /*i节点表初始化*/
    int i_blcok[15];
    for (int i = 0; i < 12; ++i)
        i_blcok[i] = i; //直接
    i_blcok[12] = 12;   //一级
    i_blcok[13] = 15;   //二级

    /*查询*/
    if (logic_block_num < 12)
        return i_blcok[logic_block_num];
    else
    {
        if (logic_block_num - 12 < 2) //属于一级索引的情况
        {
            phy_block index_block_1 = phy_block_s[i_blcok[12]]; //取出一级索引块
            return index_block_1.data[logic_block_num - 12];
        }
        else //属于二级索引的情况
        {
            phy_block index_block_1 = phy_block_s[i_blcok[13]]; //取出一级索引块

            /*根据判断取出二级索引块,并返回对应物理块号*/
            phy_block index_block_2;
            if (logic_block_num - 12 < 4)
            {
                index_block_2 = phy_block_s[index_block_1.data[0]];
                return index_block_2.data[logic_block_num - 14];
            }
            else
            {
                index_block_2 = phy_block_s[index_block_1.data[1]];
                return index_block_2.data[logic_block_num - 16];
            }
        }
    }
}

void test()
{
    for (int i = 0; i < 18; ++i)
        std::cout << "逻辑块号 : " << i << " 所对应的物理块号为 : " << logic_block_to__phy_block(i) << '\n';
}

int main()
{
    test();
    return 0;
}

Linux 支持的三级文件索引从原理性实验的角度来说实在是很麻烦,也不好描述。所以 我将其简化成了二级索引。整个设计图如下,非常的清晰,C++ 代码我也采取的是如上图所 示的结构。 值得注意的是,我在查询操作的时候,并不是采用的查找表的方式,而是采用计算的方式。
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值