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

  • Post author:
  • Post category:其他


#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++


代码我也采取的是如上图所 示的结构。 值得注意的是,我在查询操作的时候,并不是采用的查找表的方式,而是采用计算的方式。



版权声明:本文为qq_42181309原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。