⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 00000001.htm

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

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -