📄 00000001.htm
字号:
透过vnode所定义的虚拟函式来达成. 一个vnode 初始化後,就 <BR>会有个指标指向file system dependant part.所以不管底下的档案 <BR>系统格式为何, kernel皆能呼叫到正确的函数. VFS的架构使得 <BR>Unix可以支援多重档案系统, kernel经由vnode提供档案系统的 <BR>发展者一个标准的介面. 七月号的InfoMac介绍狂想曲的 <BR>一篇文章说VFS可以有档案压缩,解压缩,线上防毒的功能, <BR>真的是颇为奇怪.. <BR> <BR>比较特别的是Unix的实作和定义有点不太一样. <BR>定义说: <BR> <BR> struct vnode { <BR> <BR> public_data1,2,3,.... <BR> <BR> caddr_t v_data; <BR> <BR> } vnode; <BR> <BR> vnode.v_data = (caddr_t *)&ffs_data; <BR> <BR>而实作作成这样,把interface和file system dependant data放在一起: <BR> <BR> struct ffs_node { <BR> <BR> public_data1,2,3,... /*和struct vnode顺序一样*/ <BR> <BR> caddr_t v_data; <BR> <BR> private_data1,2,3.... /* ffs private data */ <BR> <BR> } vnode; <BR> <BR> vnode.v_data = (caddr_t *)&vnode; <BR> <BR>Understand?不懂就去看书吧!书上是用图示法的,见图知意. <BR> <BR>vnode/vfs有个地方和原本的unix不一样,会导致race condition.我想这是 <BR>许多security hole的泉源.就是file name lookup不一样.以前只有一个 <BR>filesystem的时候(看Bach的书) Unix是传一个路径给namei(),就可以找到 <BR>inode. vnode的方法要把一个路径切碎,一段一段找.这也使performance <BR>降低不少. (unix filesystem瓶颈之一在file name lookup,每次lookup都会 <BR>碰到路径上每一个目录的inode....4.4BSD和OSF/1都有提出解决的对策. <BR>(自己看书,太琐碎了) <BR> <BR>有了vnode/vfs, 则可以鼓励出更多的创意, 更多的档案系统可以被提出来. <BR>比较有趣的有NFS, specfs, fifofs, /proc fs.这里顺便提一下後三者.本书是在 <BR>稍後的章节才提到. <BR> <BR>specfs在干什麽的呢?以前s5fs的时代,有些特别的inode不表示实体的档案, <BR>而是用来表示周边装置.现在假设我们的ffs上有个/dev/tty1的档案. 利用 <BR>刚刚提到的vnode/vfs的方式, kernel会去呼叫到ffs的函式,而这些函式并不能 <BR>知道怎样驱动tty driver.解决的方式是设计一个specfs.只要kernel发现 <BR>inode是个device file的话,就不去呼叫vnode的open,而是呼叫specvp(),把 <BR>该vnode传给他.specvp就会把适当的virtual function和指标填到vnode去, <BR>而得到所希望的操作.这就是specfs存在的目的. Chapter 16有更详细的资料. <BR>并讨论到不同device file major/minor device number都一样,也就是指到 <BR>相同device的问题解法. <BR> <BR>fifofs和specfs一样.用来把ffs的某个vnode换成有fifo作用的named pipe. <BR> <BR>/proc file system则是把process在记忆体中的状态,转换为file system的方式 <BR>方便存取.这样子debugger得以更方便的控制process,提供更多的功能, <BR>也可以debugger执行到一半的process. (前面提到在旧的Unix下,这是不可行的) <BR> <BR> <BR>Chapter 9 File System Implementations <BR> <BR>本章主要讨论on disk file system layout, 和一些其他的file system. <BR>前面没有提到vnode在kernel如何组织,所以这章也补齐. <BR> <BR>首先是s5fs.其实这还是自己看比较快,看图说故事就对了. <BR> <BR>比较特别的是file system如何处理free block. s5fs用free block <BR>list来管理free block.这个list会很占空间吗?不会的,因为此 <BR>list在free block上,也就是借用没有用的的空间.free block list <BR>的大小和所剩的空间成正比.如果没有空间了,也不需要 <BR>free block list了; free block list原先占用的空间就 <BR>会释出来当作free block用. <BR> <BR>其实前面没说清楚. free block list分成两部份.在super block <BR>内有一小节,剩下的才放在free data block上. super block的 <BR>free list用完了就会从free data block上的list调借. 所以 <BR>free block list占用data block的空间会在data block用完前释出. <BR> <BR> <BR>Berkeley Fast File System <BR> <BR>s5fs有许多限制, performance是一个问题.比如说ls -l dir,就会在inode和dir <BR>的档案间来回奔跑. (inode才有file attribute.) s5fs把inode table放在disk <BR>空间的最前面, 其他的地方放data block.导致浪费掉许多seek time. <BR> <BR>s5fs fragmentation的问题也没有处理得很好.用free block list的方法只能 <BR>在档案系统刚建立的时候拥有良好的连续配置,用久了fragmentation就严重了. <BR> <BR>block size也有问题. block size大会增加效率,但是浪费空间,反之减少效率, <BR>但是空间利用率较高. <BR> <BR>s5fs单一的super block也很危险, super block 毁了整个filesystem就完了. <BR> <BR>s5fs还有一个缺点是14个字的档名限制. <BR> <BR>FFS的出现就是解决这些问题的. How? s5fs把disk看成是一个磁带般处理, <BR>没有考虑实体结构, FFS设计的时候就面对现实,把实体结构考虑进去,也就是 <BR>考虑了disk的head, track, cylinder等性质. hard disk由好几片platter <BR>(硬碟片)组成.cylinder就是不同platter下相同track所组成的圆柱体. <BR> <BR>FFS把一个disk划成好几个cylinder group. 一个cylinder group <BR>由相邻的cylinder组成.简单的说,FFS就是把一个disk划成几个小 <BR>disk (cylinder group),每个cylinder group (disk)上面放个s5fs <BR>就是了. 这样子作可以让某个cylinder group内的资料限制在几个 <BR>cylinder的□围内,减少seek time. <BR> <BR>针对fragmentation的问题则是使用bitmap来解决. FFS使用超大 <BR>的data block以降低fragmentation带来的影响. <BR> <BR>但是对於小的档案(和大档案的尾巴,不满一个block的部份),则是把data block <BR>切成几个小块,存放好几个小档来节省浪费掉的空间.存放在fragmented <BR>block的资料一定要是一个档案的最尾端,而且在此block内的资料必须 <BR>连续存放,不可以说A档的tail住在一block的第1/4, 3/4块, B档比较小, <BR>住在同一 block的第2/4块.这种情形要把A档的block移到另一个新的block <BR>上,让A的最後一个block连续存放. <BR> <BR>为了避免因为一个档案慢慢的成长导致不必要的搬移, FFS限制只有direct <BR>block可以用fragmentation.也就是档案超过一定大小就不用fragmentation block <BR>了. <BR> <BR>除了架构上的改变, allocation policy也很重要. FFS这样配置硬碟空间: <BR> <BR> * 同一个目录的档案(inode)都放在同一个cylinder group上. (localizing <BR> policy) <BR> * 每个新的目录都和其parent位於不同的cylinder group上. (distributing <BR> policy) <BR> * 档案的data block放在和其inode相同的cylinder group上(localizing policy) <BR> * 档案超过48kb,以及以後每增加1MB,就要换跑道,喔是cylinder <BR> group.免得某个档案灌爆一个cylinder. <BR> * 配置data block时考虑disk的interleave factor.(不懂?那你一定没有 <BR> 用过MS-DOS的floppy加速程式:) 没关系, 本书有图解) <BR> <BR>s5fs的super block被分成两部份. FFS4每个cylinder group都有记录 <BR>自己的空间使用状况. 而整个disk的super block只记录整体性的资料, <BR>如cylinder的大小位置, block的大小位置等等资料.每个cylinder group <BR>都有一个super block的备份. FFS把这些备份分散开来, 使得没有单一的 <BR>磁头,磁轨,磁柱或碟片存放这些备份. (没有把所有的鸡蛋放在同一篮子 <BR>上的意思.) <BR> <BR>即使目前的SCSI硬碟并不区分head, cylinder, sector,制造商提供的资料只是 <BR>让他乘起来和硬碟的大小相同而已, 但是实验显示FFS的方式还是可以得到 <BR>良好的效能. <BR> <BR>FFS还有很多chache的改进可以提高他的效能,不过要自己看书:) <BR> <BR>Temporary File System <BR> <BR>temporary file system对於需要暂时使用档案的场合可以增进效率. <BR>以前的方式是把一块ram划下来作ram disk.这样子浪费记忆体. BSD用memory file <BR>system (mfs)的方式, 让一个io server用他的address space当作空间来提供 <BR>temporary file system的暂存空间,不过最大的缺点是context switch使 <BR>performance不好. Sun的方式最好, tmpfs整合了vnode/vfs介面和VM介面, <BR>让整个virtual memory来提供tmpfs的空间. 整个存取的方法和一般的filesystem <BR>没有两样,是最理想的方法. 另外一个方法是设定file system write back的时间, <BR>以企图延後所有档案系统的资料写入disk来达到temp file system的目的. (期望 <BR>他没被写入前就杀掉了). <BR> <BR>Unix用到暂时档的地方很多(如cc).所以temporary file system的发展 <BR>是很有价值的. <BR> <BR>Chapter 9结束的时候提到了Buffer Cache.这个东西在Bach的书里是重点,但是 <BR>目前的Unix已经不用Buffer Cache,改采整合file system和virtual memory的方式, <BR>更为有效的运用记忆体. <BR> <BR> <BR>Chapter 10 Distributed File Systems <BR> <BR>本章介绍..NFS/RFS/AFS/DFS. <BR>NFS其实算蛮简单的,他只是把kernel往disk写回的动作(& reading),换成 <BR>network packet送出去而已.对kernel的介面则是藏在vnode/vfs下. <BR> <BR>NFS performance bottleneck在於NFS要求每次的write()不能够cache,一定要 <BR>马上写回,而档案属性必须一个一个档询问,使得ls -l产生大量的traffic. <BR>当然现在已有方法改进. <BR> <BR>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -