一.混合索引
混合索引的索引节点中设有13个地址项
1.直接地址:前10个地址项用来存放直接地址
2.一次间接地址:第11个地址项提供第一次间接寻址
3.多次间接地址:第12个地址项提供第二次间接寻址,第13个地址项提供第三次间接寻址
二.混合索引的模拟思路
假设每个盘块16个字节大小,每个盘块号占2字节,模拟混合索引
1.每个盘块16个字节大小,每个盘块号占2个字节,那么一个盘块可以放16/2=8个盘块号
2.当文件不大于160B时,我们可以通过直接索引的方式读出该文件的全部盘块号;当文件不大于160+16*8=288B时,可以通过第11个地址项读出全部盘块号,也就是一次间接寻址;当文件不大于160+16*8+16*8*8=1312B时,可以通过第12个地址项读出全部盘块号,也就是二次间接寻址;当文件不大于160+16*8+16*8*8+16*8*8*8=9504B时,可以通过第13个地址项读出全部盘块号,也就是三次间接寻址.
三.Java代码分析与实现
double[] blocks = new double[13]; for (int i = 0; i < 13; i++) { if (i >= 0 && i < 10) //存放直接地址 blocks[i] = blockSize; //间接地址,文件最大可分配大小 else if (i == 10) blocks[i] = (int) Math.pow((blockSize / blockNumSpaceSize), 1) * blockSize; else if (i == 11) blocks[i] = (int) Math.pow((blockSize / blockNumSpaceSize), 2) * blockSize; else blocks[i] = (int) Math.pow((blockSize / blockNumSpaceSize), 3) * blockSize; }
3.1.首先,前十个盘块存放的是直接地址,10-12分别对应后三个盘块所能容纳的盘块号数目,存放间接地址。
3.2.输入文件
//文件最大大小 int maxSize = 0; for (double j : blocks) maxSize += j; if (fileSize > maxSize) { System.out.println("对不起,您输入的文件大于" + maxSize + "B"); } else { if (fileSize <= (blockSize * 10)) { System.out.println("该文件启动了直接索引"); System.out.println("该文件占据了第一块到第" + Math.ceil(fileSize / blockSize) + "块"); } else if (fileSize > (blockSize * 10) && fileSize < (blockSize * 10) + blocks[10]) { System.out.println("该文件启动了直接索引和一级索引"); System.out.println("该文件占据了直接索引和以及一级索引的第一块到第" + Math.ceil((fileSize - (blockSize * 10)) / blocks[10]*8) + "块"); System.out.println("若为地址则该地址所在盘块号为第0块到第" + (9 + Math.ceil((fileSize - (blockSize * 10)) / blockSize)) + "块"); System.out.println(Math.ceil((fileSize - (blockSize * 10)) / blockSize)); } else if (fileSize >= (blockSize * 10) + blocks[10] && fileSize < (blockSize * 10) + blocks[10] + blocks[11]) { System.out.println("该文件启动了直接索引和一级索引,二级索引"); System.out.println("该文件占据了直接索引,一级索引和二级索引的第1块到第" + Math.ceil((fileSize - (blockSize * 10) - blocks[10]) / blocks[11]*8) + "块"); System.out.println("若为地址则该地址所在的盘块号为第0块到第:" + (9 + Math.pow(blockSize / blockNumSpaceSize, 1) + Math.ceil((fileSize - (blockSize * 10) - blocks[10])) / blockSize)+"块"); } else { System.out.println("该文件启动了直接索引和一级索引二级索引,三级索引"); System.out.println("该文件占据了直接索引,一级索引,二级索引和三级索引的第1块到第" + (Math.ceil((fileSize - blockSize * 10 - blocks[10] - blocks[11]) / blocks[12]*8)) + "块"); System.out.println("若为地址则该地址所在的盘块号为第0块到第:" + (9 + Math.pow(blockSize / blockNumSpaceSize, 1) + Math.pow(blockSize / blockNumSpaceSize, 2) + (Math.ceil((fileSize - (blockSize * 10) - blocks[10] - blocks[11]) / blockSize)))+"块"); } } }
3.3.根据输入的文件大小判断所占用的磁盘快状态,比如该文件的大小为222B,则该文件占据了直接索引和和一级索引的1到4块,222-160=62,所占的比例,62/(128/8)=4(向上取整),128B分为了8份,62占了3块多也就是到了第四块。其他的同理。
3.4.所占据的盘块号:前十个直接地址+一次间接地址+2次间接地址+文件大小减去三次间接地址/盘块大小.
3.5.习题