操作系统之文件系统

2 篇文章 0 订阅

        主要是最近因为换了SSD,又重装了一次双系统,win7+ubuntu16.10,过程也没什么可说的,网上教程一堆,小白看了也用不了几分钟就能搞定。关键是我在用easyBCD改grub为mbr引导时, 搞得进不了grub的引导界面,又搞不定grub手动引导,被命令和文件系统弄得焦头烂额,最后还是重新再来了几遍,依然被迫采用grub引导,很不甘心被整(因为 之前是搞成功过的),又没有足够时间去深入解决 问题,只是觉得之前看过的操作系统知识又交给大脑几十公里深的潜意识了,有点可惜,趁有个需求还是重新梳理和温习下吧。

        我们知道,进程是对CPU的抽象,进程地址空间是对物理存储器的的抽象,而每个文件可以看作是地址空间。
        首先讲面上的,在装ubuntu分区时要设置挂载点和选择文件系统类型,一开始还以为每个分区像windows一样能看到独立的盘符啊什么的,后来发现所有的分区都是在一个以/为根目录的树形结构下,在查看主分区(挂载点为/)大小时,也只能看到在安装主分区时设置的大小,而具体一个逻辑分区挂载点的分区(挂载点为/boot、/home)大小之类的信息是不会被算到该主分区内的。所以虽然在ubuntu的文件管理器UI中会看到boot和home文件夹在主分区目录下(linux也只有这一个主目录),但主分区的大小你在查看属性时并不会是/、/boot、/home大小之和。
        问题来了,一个系统怎么能容忍你选择不同的文件系统类型呢?其实不单单FAT、NTFS、ext2等,连CD-ROM和DVD也是一种FS。这就引出了虚拟文件系统VFS的概念,VFS是SUN公司做的工作(其本来的目的是为了使用网络文件系统NFS),其关键就是抽象出所有FS共有的部分,将这部分代码放在单独的一层,该层再调用底层的实际FS来管理数据。当一个文件系统被装载时,它必须在VFS中注册,最基本的工作就是提供一个包含VFS所需要的函数地址的列表。VFS设计是只要实际的FS提供VFS所需的功能,VFS就不关心也不需知道数据具体存储在什么地方或者底层的FS是什么样子。
        先说常见的FAT文件系统,FAT(文件分配符)其实是对文件采用在内存中采用表的链表分配实现文件的记录(即每个文件使用了那些块),其实就是每个块指出下一块所在的编号,以此类推,这样文件可以不用连续存储,但有一个问题就是,磁盘对应的表必须整个放在内存中,比如200G快大小1kB有近2亿项块,那么每个块的编号至少要用3个字节(其实2^24〈2亿),将至少占用600M内存,崩溃了吧!FAT12是2^12*512=2MB,内存表项2^12*2B=8KB,对于软盘够用了。后来磁盘来了,块大小最大变成4KB,当时MS-DOS系统最大支持4个分区,那么FAT12系统最大支持16M*4=64M的磁盘空间。然后FAT16(2^16B*32K*4=8GB,内存表现128KB)、FAT32(2^32*512B=2TB,内存表项orz,有些特殊,具体自己查吧,不是32KB*2^32)类似。
        而针对FAT表项吃内存的缺点,一种解放方案的FS是采用i(information)节点的数据结构来存储文件的信息,而只有文件在打开时,i节点才会被读进内存,这样就可以支持大存储磁盘了。采用这种机制的如unix的V7,还是很有效率的。
        接下来就是日志结构文件系统了,所谓的NTFS和ext等都是这种文件系统。LFS为了解决磁盘较大的寻道时间(频繁零碎读写很小的数据时尤其头疼),如要在unix系统中创建一个新文件,要写该文件目录的i节点、目录块以及文件的i节点、目录块和文件本身,这些写操作一旦中途碰到死机,那么FS中就会出现严重的不一致性,LFS基本思想就是将整个磁盘结构化为一个日志,每隔一段时间或特殊需要时将缓存在内存中的未决的写操作放到一个单独的段中,作为在日志末尾的一个邻接段写入磁盘。控制段的大小就可以充分的利用磁盘的完整带宽。总而言之,所有写操作最初都被缓存在内存中,然后周期的写作一个单独的段,在日志末尾写入磁盘。这个过程中许多已有的段包含了很多不再需要的块,因此LFS有一个清理线程周期扫描日志进行磁盘压缩,具体及时读取日志段的摘要,检查有那些i节点和文件,产看i节点图判断该i节点是否有效及文件块是否在使用,否的话就丢弃该信息,如果仍在使用,就将i节点和块进入内存等待写回下一个段,原来段标记为空闲,日志就可以用它存放新的数据。清理现场便利日志,从后面移走旧的段,将有效的数据放入内存等待写到下一个段中,整个磁盘就成为一个大的环形缓冲区,写线程把新的段写到前面,而清理线程将旧的段从后面移走。LFS还是有点复杂,管理i节点(定位、更新、维护i节点图等),LFS处理大量零碎写操作时是优于unix的,在读和大块写的性能上也不必unix差。
         NTFS意思是WinNT的FS,linux第一个LFS功能的FS是RegisterFS,标准化的ext2(RegisterFS和它不兼容),ext3等都是LFS。
         在看现代操作系统时,文件系统FS是一个很关键的章节,细节都忘了,只是记得相比windows,linux的系统简直是简洁、清晰的不要不要的,以至于在看完linux后,对于windows的复杂、繁琐实在是看不下去了,当然不是说windows就是渣,毕竟全世界都在乐滋滋的用的很爽。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值