#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 版权协议,转载请附上原文出处链接和本声明。