Unix文件管理

来源:互联网 发布:淘宝秒杀笔记本电脑 编辑:程序博客网 时间:2024/05/03 05:49

磁盘上文件存储

inode tree

  1. 将文件名从文件的属性中分离,【文件名,inode号】为一项,组成了inode树
    1. 根目录没有名字,只有一个固定的inode,据对路径的文件查找都自动从这个inode开始
      /不是名字(null/);
      考虑bin/是
    2. 如果文件是目录,那么它会指向下一个由【文件名,inode号】项组成的数组(作为一个目录文件)
  2. 根据inode可以查找到文件属性,在属性中有一项char di_addr[40],储存着文件在磁盘上的存储位置

文件的三级索引(结合直接索引)

char di_addr[40]
1. 每三个字节表示一个物理块号,因此分为13块,余一块是为了凑40方便对齐,

1.  0-9直接索引物理块号,2. 10一级索引11-二级索引3. 12-三级索引
  1. 每一个物理块是1KB,
    直接索引10k大小,加上三级索引,每级索引1000/3(1KB,每个块号用3B表示),
    计算得到最大索引为10k(1000/3)3=32GB
    即最大能够表示32GB的文件

满足其他条件下,保证了较理想的查找效率

内存中文件管理

当文件调入内存中时,会建立三级的文件管理

进程PCB->控制方式->内存索引点

内存索引点:

    存储着inode号,以便文件的写回,与二次读取

控制方式:

    f_flag    f_inode //存贮其中的控制方式(o_WONLY,O_RDONLY etc)    f_count //共享的进程数,当为0时,进程索引点就可以被清理了 

进程PCB:

    int u_ofile //指向不同控制方式的指针数组

1. 内存索引点可以被不同的控制方式共享(同时以不同方式打开文件)
2. 控制方式可以被不同的PCB共享(相同的方式打开同一个文件)
3. PCB通过u_ofile数组,同时拥有不同的控制方式

磁盘空闲空间管理

成组链表构成的索引表

索引表:每一百个顺序排列的纪录位为一组,第一个纪录位指向下一组所在的物理块号,块0表示null

具体过程是这样的:
(特殊的头插法)
每当一个块被设为空闲,判断一下索引表的头一组的记录的空闲块数,<100就顺序添加到头一组的尾部添加空闲的块号,如果==100,则复制索引表到刚设为空闲的块中,同时原来块的索引表的记录数置1,并在第一个纪录位时写入刚空闲的块号

  1. 一个物理块有至多有一个索引表,所有索引从一个专用块上的索引表开始
  2. 一个索引表有效记录100个块,同时记录下一个索引表所在的物理块,第一块既是空块又是指针
0 0
原创粉丝点击