混合索引的模拟实现

一.混合索引

    混合索引的索引节点中设有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.习题


猜你喜欢

转载自blog.csdn.net/Sirius_hly/article/details/80823170