1、Linux文件系统中的索引节点和目录项?

索引节点和目录项是Linux文件系统分配给Linux文件的两个数据结构。

索引节点,index node,它是用来记录文件的元信息的。例如文件的index node编号,文件大小,数据在磁盘的位置等等。索引是文件的唯一识别,在Linux中,不是根据文件名字来查找文件的,而是通过索引来进行文件的查找。索引节点跟文件一样会被存储在磁盘中,所以索引节点也会占用磁盘空间。

目录项,directory entry,用来存储文件的名字、索引节点指针以及与其他目录项的一个层级关联关系。多个目录项关联起来就会形成目录结构。目录项是缓存在内存中的,不存放在磁盘中。

2、数据是怎样存储在磁盘中的?

磁盘格式化之后会分成三个存储区域:超级块、索引节点区、数据块区。超级块中存储文件系统的详细信息,例如块个数、块大小等。而索引节点区就是用来存储索引节点的。数据块区则是存储文件和目录的数据。

读取磁盘中文件里的数据大概流程:根据文件中目录项存储的索引节点指针,在磁盘的索引节点区找到相对应的索引节点,索引节点再根据存储的信息,在磁盘中的数据块区中查找用户所需要的数据。

在获取数据的过程中,为了加快文件的访问速度,会把索引节点加载到内存中。所以当文件被访问的时候,索引节点区就会加载到内存中。

3、Linux文件系统的结构?

文件索引节点法 例子 索引节点内容_链表

4、文件系统的基本操作单位是数据块?

在用户进程从文件中读取数据时,首先获得数据所在的数据块,然后再返回数据块对应用户所需要的数据部分。

当用户进程将数据写进文件时,首先先找到写入数据的数据块位置,然后修改数据块中相对应的部分,最后再把数据块写回磁盘。

由此来看,数据块是文件系统操作的基本单位。

5、文件存储的方式有哪些?

首先,文件存储的方式分为连续空间存储方式、非连续空间存储方式。(个人觉得这里可以类比到Java中的数组,以及链表来理解)。非连续空间存储还分为链表方式、索引方式。

连续空间存储方式:文件是存放在磁盘中一个连续的物理空间中。这种情况下读写效率很高,只需要一次磁盘寻道就可以读出整个文件。(就像获取数组值不需要遍历,只需要使用index一次直接获取);存储文件的时候需要先知道文件的一个大小,那么文件头里指定起始块的位置长度即可。(Java中new int[]需要提前开辟空间,指定数组长度)。

        缺点:连续空间存储会产生磁盘空间碎片文件长度不易扩展的问题。对于改善上述问题,只能进行文件存储的一个位置挪动,但是这样效率非常低。(数组长度扩展需要创建新数组)

非连续空间存储方式-链表方式:链表是非连续的,可以有效的消除磁盘碎片,同时文件的长度可以动态扩展。

        隐式链表:文件头中需要存储第一块和最后一块的位置,并且其中的数据块需要留出一个指针空间,用来存放下一个数据块的位置。(head,tail,next)

        缺点:它无法直接访问数据块,需要进行遍历访问;并且数据块消耗了一定的存储空间用来存储指针;隐式链接分配的稳定性比较差,有可能会导致链表中的指针丢失或损坏,会导致文件数据的丢失

        显式链表:指针不存在数据块中。将所有数据块中的指针都存储在内存的一个表中。整个磁盘中只有一张这样的表,每个表项中存放链接指针,指向下一个数据块。这样进行数据的查找,是直接在内存里面进行的,大大的减少了访问磁盘的次数。

        缺点:它不适用于大磁盘。整个磁盘中只有一张这样的表(文件分配表 File Allocation Table),如果磁盘容量足够大,存储的项非常多,那么这张表占用的内存也是非常大的。

非连续空间存储方式-索引方式:索引的实现就是为每个文件创建一个索引数据块,在这个数据块里面存储指向文件数据块的指针列表(像一个目录,需要哪个部分的数据,就通过目录查找)。那么文件头中就需要存储指向这个索引数据块的指针

        优点:不会产生空间碎片;文件的拓展很方便;支持顺序读写和随机读写。

        缺点:需要在磁盘中专门存储索引。

链表+索引:在索引数据块中存放下一个索引数据块的指针。将一个索引数据块中的数据通过链表的形式分散到其他索引数据块。但是指针有可能丢失或者损坏。

索引+索引:在一个索引块中存储多个索引块,进行嵌套存储。同样也是分散索引数据块中的数据。