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

📄 00000004.htm

📁 一份很好的linux入门资料
💻 HTM
📖 第 1 页 / 共 3 页
字号:
要是你可以拦截使用者对某些目录的存取,然後偷天换日一下,&nbsp;那一定可以&nbsp;<BR>让系统更有趣.&nbsp;比如说Mail来的时候通知使用者(不用一直polling),&nbsp;使用者&nbsp;<BR>读某个档时就把目前时间印出来,&nbsp;使用者open&nbsp;/tcp/&lt;service&gt;/&lt;hostname&gt;时,&nbsp;<BR>就产生对&lt;sevice:hostname&gt;的连线,让没有网路知觉的shell,awk程式也可以&nbsp;<BR>轻松处理网路上的资料.&nbsp;<BR>&nbsp;<BR>本章讨论了两个这样的系统,第一个是watchdogs,这是学生的研究作品,&nbsp;<BR>整合性不足.&nbsp;4.4&nbsp;BSD&nbsp;Portal&nbsp;file&nbsp;system才可以算完整解决方案.&nbsp;<BR>&nbsp;<BR>一个新的File&nbsp;System写起来很复杂,&nbsp;而一般人可能只想在file&nbsp;system&nbsp;<BR>上加点小功能,比如说on-line&nbsp;compression等等.&nbsp;4.4BSD和SunSoft皆&nbsp;<BR>提出了Stackable&nbsp;file&nbsp;system的模组化机制,以达到这个目的.&nbsp;<BR>SunSoft的版本在本书写作的时候还在草稿阶段而已.BSD的则是已经放&nbsp;<BR>入4.4BSD原始码内了.&nbsp;<BR>&nbsp;<BR>&nbsp;<BR>Chapter&nbsp;12&nbsp;Kernel&nbsp;Memory&nbsp;Allocation&nbsp;<BR>&nbsp;<BR>本章以後开始讨论到记忆体管理的问题了.&nbsp;Chapter&nbsp;12讨论kernel&nbsp;<BR>如何管理自己所用的资料结构所使用的记忆体,如&nbsp;inode的配置等问&nbsp;<BR>题.&nbsp;Chapter&nbsp;13,13,15则是讨论kernel的virtual&nbsp;memory管理.&nbsp;被&nbsp;<BR>kernel用来放自己的资料结构的记忆体就不能给paging&nbsp;system用,&nbsp;<BR>所以两者之间如何平衡是很重要的.&nbsp;<BR>&nbsp;<BR>本章提了好几个memory&nbsp;allocator.&nbsp;其中提到C&nbsp;Library的malloc所&nbsp;<BR>使用的方法值得提出来和大家分享.&nbsp;malloc配置记忆体是所谓的power&nbsp;<BR>of&nbsp;two&nbsp;free&nbsp;lists.把记忆体分成不同的2的次方的大小&nbsp;<BR>(32,64,128...1024bytes)来管理.&nbsp;不过allocator保留这些block&nbsp;<BR>的最前面几个byte当作header,&nbsp;当这块记忆体不用时(free),&nbsp;<BR>则header指向下一个free&nbsp;block,&nbsp;彼此间是一个list.&nbsp;而使用中&nbsp;<BR>时header则指向他所属的list.&nbsp;(比如说大小是32的list),&nbsp;这样&nbsp;<BR>子free()才会知道怎麽归还记忆体.如果你有K&amp;R这本书的话,&nbsp;可&nbsp;<BR>以翻翻看书上的□例是不是这样子作的.&nbsp;<BR>&nbsp;<BR>power-of-two的配置方式有个致命的缺点,&nbsp;就是可使用的空间只有&nbsp;<BR>sizeof(block)-sizeof(header),也就是略小於(32,64,128,...1024).&nbsp;<BR>如果应用程式要一个比如说64bytes的记忆体,&nbsp;那麽64-block就装不下,&nbsp;<BR>要分配一个128-block才行,&nbsp;造成浪费.回想一下,你写程式是不是很喜欢&nbsp;<BR>malloc(128),&nbsp;malloc(512),&nbsp;malloc(1024)呢?&nbsp;是不是感觉上&nbsp;<BR>应该对performance比较好呢?&nbsp;看完这段描述,&nbsp;那你可能就不会&nbsp;<BR>这麽想了.&nbsp;我想,这也是许多人评论不同的c&nbsp;compiler记忆体管&nbsp;<BR>理优劣的一个地方吧!如果你常自己抓一些source&nbsp;code来安装,&nbsp;<BR>就可以了解为什麽很多作者都弃系统的library不用,&nbsp;<BR>自己提供malloc了吧.&nbsp;<BR>&nbsp;<BR>书上提到power&nbsp;of&nbsp;two的改进法,&nbsp;称为McKusic-Karels&nbsp;Allocator.&nbsp;<BR>获得4.4BSD和Digital&nbsp;UNIX采用.&nbsp;McKusic-Karels&nbsp;配置法把一段连&nbsp;<BR>续的记忆体都切成固定的大小,&nbsp;比如说32bytes,&nbsp;那麽使用中的header&nbsp;<BR>就不用指回他所属的list了,&nbsp;因为由他的位置kernel就可以知道他属&nbsp;<BR>於哪一国的.&nbsp;<BR>&nbsp;<BR>皆下来提到Buddy&nbsp;System,&nbsp;这是和power&nbsp;of&nbsp;two不太一样的配置法,&nbsp;<BR>优点是free()之後的临接空间可以聚合起来成为较大的可用空间.&nbsp;<BR>(power-of-two这方面作的并不好).&nbsp;这个优点称为coalescing.并&nbsp;<BR>且Buddy&nbsp;System可以简易的和paging&nbsp;system交换记忆体空间,&nbsp;<BR>使的kernel占用的记忆体空间可以动态的调整.&nbsp;不过他的performance&nbsp;<BR>不太好,&nbsp;因为每次release&nbsp;momory,allocator就很贪心的把所有&nbsp;<BR>临接的记忆体空间并起来,&nbsp;浪费许多时间.&nbsp;<BR>&nbsp;<BR>SVR4使用了修改过的Buddy演算法&nbsp;-&nbsp;Lazy&nbsp;Buddy&nbsp;作为配置kernel&nbsp;<BR>objects的方法.&nbsp;<BR>&nbsp;<BR>Buddy系统和power&nbsp;of&nbsp;two一样,&nbsp;都是以2^n作为配置记忆体的单位.&nbsp;<BR>&nbsp;<BR>Mach,&nbsp;OSF/1使用了另一种方法,&nbsp;Zone&nbsp;Allocator.&nbsp;这个配置法不&nbsp;<BR>再以2^n作为配置单位,&nbsp;而是以物件为导向来配置.也就是说allocator&nbsp;<BR>从paging系统要来一块记忆体,把他按照object的大小切成n份,&nbsp;<BR>比如说,&nbsp;port资料结构为104&nbsp;bytes,&nbsp;那麽mach会把要来的记忆体&nbsp;<BR>(比如说1KB),分成1024/104块来使用.&nbsp;这很明显提高了记忆体&nbsp;<BR>的利用率.&nbsp;给一个object用的记忆体称为一个zone,&nbsp;比如说zone&nbsp;<BR>of&nbsp;ports,&nbsp;zone&nbsp;of&nbsp;inodes等等.&nbsp;不同的object使用不同的zone,&nbsp;<BR>即使他们的大小一样.&nbsp;<BR>&nbsp;<BR>Zone&nbsp;Allocator使用背景的garbage&nbsp;collection程式来回收记忆体.&nbsp;<BR>&nbsp;<BR>本章最令人拍案叫绝的是Solaris&nbsp;2.4的Slab&nbsp;Allocator.&nbsp;<BR>&nbsp;<BR>Slab&nbsp;allocator和zone&nbsp;allocator&nbsp;方向差不多,&nbsp;以object&nbsp;size&nbsp;<BR>当成配置单位,但是他更进一步分析记忆体的使用情形.&nbsp;比如说&nbsp;<BR>inode好了.首先我们要一块记忆体&nbsp;-&nbsp;malloc(sizeof(inode)),&nbsp;<BR>然後initialize&nbsp;inode,接著是正常的使用,&nbsp;使用完毕後便用free()&nbsp;<BR>归还记忆体.&nbsp;Slab&nbsp;allocator注意到free()之後的记忆体的资料&nbsp;<BR>和刚刚initialize时差不多,&nbsp;比如说inode的reference&nbsp;count&nbsp;<BR>一定是降为零等等.&nbsp;Kernel有许多资料结构都是还原到和initialize时&nbsp;<BR>一样的时候才会free掉.再说一个例子,&nbsp;一个mutex&nbsp;lock&nbsp;initalize时&nbsp;<BR>是unlock的状态,&nbsp;free时也是unlock的.&nbsp;<BR>&nbsp;<BR>Slab&nbsp;allocator利用这项特性,&nbsp;事先把所有的(用Mach的语言是zone)初始化,&nbsp;<BR>那麽就可以省下不少initialize的时间.&nbsp;<BR>&nbsp;<BR>另一个slab&nbsp;allocator注意到的问题是cpu&nbsp;cache的使用率.一般的cache演算法是&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cache&nbsp;location&nbsp;=&nbsp;address&nbsp;%&nbsp;cache_size&nbsp;<BR>&nbsp;<BR>一般的power&nbsp;of&nbsp;two配置法配置的记忆体都会经过align,&nbsp;并且大多数程式&nbsp;<BR>的习惯会把最常用的资料栏位放在一个结构的最前面.&nbsp;这两个效应合在一起,&nbsp;<BR>造成这些栏位互相的清掉彼此的cache.&nbsp;512kb的cache可能只有部分有作用.&nbsp;<BR>更甚者,&nbsp;如果主记忆体使用interleave的方式,&nbsp;比如说SPARC&nbsp;center&nbsp;2000&nbsp;<BR>使用两个bus,&nbsp;较低的256byte使用第一个bus,较高的256byte使用第二个bus,&nbsp;<BR>那麽所有的data可能会集中在第一个bus上,&nbsp;造成不平衡现象.&nbsp;<BR>&nbsp;<BR>Slab的解决方法是在向paging系统取得一块block之後,&nbsp;(假设为1KB),&nbsp;<BR>Slab把他要用的资料摆在这个block最後面,&nbsp;假设占y&nbsp;bytes.&nbsp;假设所&nbsp;<BR>要配置的是inode,&nbsp;大小跟前面Mach的例子一样皆是104.&nbsp;那麽这块记&nbsp;<BR>忆体可以提供(1024-y)/104个inode.&nbsp;并且有一些馀数,&nbsp;也就是剩下&nbsp;<BR>一些多馀的记忆体.Slab善用这些记忆体,&nbsp;将之二等分,&nbsp;一份摆在这&nbsp;<BR>块记忆体的最前面,一块摆在最後面.&nbsp;最前面那块称为coloring&nbsp;area.&nbsp;<BR>Slab设法在每次配置的page上使用不同大小的coloring&nbsp;area,&nbsp;以有效的&nbsp;<BR>分散资料map到cache中的位置,增加cache&nbsp;rate.&nbsp;<BR>&nbsp;<BR>Allocator&nbsp;Footprint指的是Allocator在配置记忆体的时候将自己,&nbsp;<BR>以及所参考到的资料写到cpu&nbsp;cache/&nbsp;TLB&nbsp;(translation&nbsp;lookaside&nbsp;<BR>buffer),&nbsp;在cache/TLB上面产生的&quot;脚印&quot;.&nbsp;Allocator在cache/TLB内&nbsp;<BR>所留下的资料基本上是没有用的,&nbsp;并且妨碍真正有用的资料留在cache&nbsp;<BR>上.&nbsp;buddy演算法需要参考许多资料才能配置记忆体,&nbsp;会产生大量的&nbsp;<BR>&quot;footprint&quot;,&nbsp;导致cache&nbsp;miss增加.&nbsp;McKusick-Karels和zone&nbsp;allocator&nbsp;<BR>的足迹皆很小,&nbsp;原因是配置记忆体的时候直接从free&nbsp;list上把第一个&nbsp;<BR>element抓出来而已.&nbsp;所以一个好的配置法应该使用简单的演算来配置&nbsp;<BR>物件.&nbsp;Slab也是使用相同的原则,&nbsp;不论是配置或者是释放,都是简单的&nbsp;<BR>一两行运算而已,所以foot&nbsp;print也很小.&nbsp;<BR>&nbsp;<BR>&nbsp;<BR>Chapter&nbsp;13&nbsp;Virtual&nbsp;Memory&nbsp;<BR>&nbsp;<BR>本章对virtual&nbsp;memory作个通论,&nbsp;如paging,&nbsp;segmentation,&nbsp;swaping,&nbsp;<BR>virtual&nbsp;memory等等作个介绍,&nbsp;跟作业系统的书讲的差不多.&nbsp;然後个案&nbsp;<BR>讨论了几个热门的CPU的MMU.&nbsp;MIPS&nbsp;R3000比较特别,&nbsp;CPU没有自动处理&nbsp;<BR>TLB,&nbsp;而是提供了一堆TLB暂存器让kernel自己玩.&nbsp;<BR>&nbsp;<BR>现代Unix皆使用paging的机制来提供虚拟记忆体.&nbsp;不过通常CPU对&nbsp;<BR>paging的机制都不完全.&nbsp;kernel除了维护cpu所需的paging&nbsp;table&nbsp;<BR>之外,&nbsp;自己还需要维护一份相对应的表格,&nbsp;以满足所需.&nbsp;<BR>&nbsp;<BR>本章最後讨论了4.3BSD的Virtual&nbsp;Memory系统.&nbsp;4.3BSD使用cmap[]&nbsp;<BR>的资料结构来辅助paging管理.&nbsp;cmap的方式是在VAX-11的架构下设&nbsp;<BR>计的,&nbsp;没有shared&nbsp;memory也没有shared&nbsp;library,&nbsp;没有memory&nbsp;&nbsp;<BR>mapped&nbsp;file,&nbsp;没有copy-on-write等等的支援,不胜枚举,&nbsp;在现代&nbsp;<BR>已经可以作古了.&nbsp;不过4.3BSD的架构仍然为日後的发展奠立的良好&nbsp;<BR>的基础.&nbsp;<BR>&nbsp;<BR>BSD对swap&nbsp;space的处理颇为保守.&nbsp;要求所有在主记忆体的page&nbsp;<BR>在配置前都必须要先有一块swap&nbsp;space.&nbsp;所以swap&nbsp;space的大&nbsp;<BR>小限制了可以执行的程式数量.不过这也保证程式只有在fork或&nbsp;<BR>exec时才会发生记忆体不足的现象,&nbsp;而不会执行到一半要被swap&nbsp;<BR>出去,&nbsp;却找不到swap&nbsp;space可用的窘况.也就是说如果你的电脑有&nbsp;<BR>64MB的记忆体,但是只划了16MB的记忆体,这样的系统只愿意让你使&nbsp;<BR>用16MB而已,&nbsp;这也是有些系统管理的书籍建议你swap&nbsp;space不要比&nbsp;<BR>main&nbsp;memory小的原因.&nbsp;<BR>&nbsp;<BR>&nbsp;<BR>Chapter&nbsp;14&nbsp;The&nbsp;SVR4&nbsp;VM&nbsp;Architecture&nbsp;<BR>

⌨️ 快捷键说明

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