📄 00000004.htm
字号:
<BR>SVR4的VM Architecture源自於SunOS 4.0引进的VM技术(Virtual <BR>Memory之意).SunOS发展VM的用途在於提供memory sharing, <BR>shared libraries, memory-mapped files. 又因为SunOS可以在 <BR>M68K, I386, SPARC上执行, 所以VM架构十分的portable. <BR> <BR>之後, 在Sun和AT&T合力之下, 以VM为基础, 设计了SVR4的virtual <BR>memory系统.取代SVR3以前使用的regions架构. regions架构在Bach <BR>的书上有提到. <BR> <BR>Memory-Mapped Files是透过virtual memory技术, 把档案的内 <BR>容映到程式的定址空间, 使得程式可以直接以存取记忆体的方 <BR>法存取档案. kernel提供了mmap() 系统呼叫来作为此机制的介面. <BR> <BR>SVR4 VM的设计概念, 可以说是颠覆了传统对记忆体的观念. <BR>在VM里面,physical memory变成是virtual address space的 <BR>cache而已. 怎麽说呢? 一个程式的位址空间可以被VM赋予不同 <BR>的意义, 比如说某一段表示 text, 指向硬碟上可执行档的text区段, <BR>某一段表示data, 指向swap area, 某段指向某个档案, 为memory <BR>mapped file的空间等等, VM的工作就是把这些实体的资料根据page <BR>fault把他载入"cache" -- 主记忆体(以 page 为单位),好让cpu可以 <BR>存取.在主记忆体上的资料都是暂时的, 他们都有个实体的贮存装置 <BR>作为长时间记录资料的地方.(这里的长时间指的是process block著, <BR>sleep时, 或者被swap out的意思). <BR> <BR>前一段提到data区段指向swap area是为了说明方便起见瞎掰的. 真正的 <BR>作法是使用anonymous page来收容这些无家可归的小孩. data区段本来 <BR>指向档案, 但是设下一个flag, 只要一被修改, 就变成 anonymous page, <BR>anonymous page就会自动使用swap area当作回存的装置. <BR> <BR>一个记忆体空间映到不同的东西, 就应该有不同的程式来处理. SVR4把 <BR>一段空间称为一个segment. 处理这种segment的程式就是segment driver. <BR>本节并提到vnode和paging系统的相互作用. <BR> <BR>Solaris 2.x对SVR4的改进为提出virtual swap space的方法, 把 <BR>swap space扩展成swap area + physical memory (所以swap大小 <BR>可以小於physicalmem了?!)并且可以动态的重新分配swap区. 之前 <BR>的作法是某块swap区只要配给哪个page, 那整个process的生命周 <BR>期内, 这块swap就是许配给这个process的特定page,不会再换了, <BR>这样的缺点是不能动态的移除swap disk/file.为了达到这个 <BR>功效, Sloaris设计了swapfs, 用来管理swap space. anonymous <BR>page从此就回存到swapfs上, 而不是直接pass过filesystem, <BR>存到swap上了. <BR> <BR>当VM从SunOS移植到SVR4上时, 效能和regions架构相比很不理想. 经过 <BR>分析SVR4的fault rate太高了, 所以可以作些改善. <BR> <BR>因为VM太懒了, 所有的东西都是page fault之後再作, 而page fault <BR>的代价甚高.所以optimization朝向将一些显然会发生的page fault <BR>减少. 比如说在fork和exec中间一般程式都会做一些事, 所以把 <BR>paging table initialize完整是件好事.exec时, 也把新的paging <BR>table initialize好,省得一执行又产生page fault. <BR>exec也会检查新执行的程式是否有text page在主记忆体里, <BR>有的话就顺便include进来. <BR> <BR>最後一个改进则是改进copy-on-write. 在fork後, kernel检查parent在 <BR>主记忆体内的anonymous page, 把他们都先拷贝起来. 前面提到, <BR>会变成anonymous page的资料,都是有被修改过的, 而此page会在 <BR>主记忆体里,没有被swap out,表示最近曾被修改过.事先将这些 <BR>page复制的理由就是基於最近被修改的资料, 可能child也会修改之. <BR>这种情况在shell下面最常发生. shell常常自己fork很多次. <BR>而每次fork後都会以相同的pattern来修改变数. <BR> <BR>最後本章提了一个测量结果, page fault次数有了明显的改进, 已经改善到 <BR>比SVR3时好了. <BR> <BR> <BR>Chapter 15 More Memory Management Topics <BR> <BR>本章提了Mach的virtual memory管理. 虽然是不同的设计, 术语也不同, <BR>但是和SVR4的VM架构有许多地方都是相同的. Mach的设计比较清楚易懂, <BR>如果Chapter 14看不懂,可以先看本章. 4.4BSD VM架构就是基於Mach的. <BR>不过4.4BSD的系统管理比较向SVR4. <BR> <BR>本章另一个重点是TLB一致性的处理. 这是在多处理器下发生的问题. <BR>如果kernel改了某个page的资料, 他怎麽让其他的处理器知道并且更正 <BR>TLB的内容. 基本上这是一件很麻烦的问题, 尤其是CPU没什麽支援的状况下. <BR>Mach的方法最简单,也最通用(不需要cpu支援,只要有个inter-processor lock), <BR>但是浪费许多时间在synchronize上, 没什麽效率. 处理TLB应该算是 <BR>multiprocessor support内最麻烦的问题了, 处理不好,一堆processor <BR>都会浪费时间在synchronize上. <BR> <BR>盲目的synchronize造成不少的浪费, 比较聪明的作法是分析什麽时候会修改TLB. <BR>如果是发生在kernel的定址空间, 那麽kernel可以透过谨慎的设计来避开TLB的修改, <BR>那麽需要修改TLB的时机就只剩kernel所无法掌握的user processes了. 而剩下的 <BR>这些状况也不是每种都要马上更改其他processor的tlb不可. 因此可以省下了许多 <BR>不必要的麻烦. <BR> <BR> <BR>Chapter 16 Device Drivers and I/O <BR> <BR>介绍与device driver, io 相关的课题. 以及device driver 与file system <BR>间的互相配合, dynamic loading unloading等等. 基本上就是device driver <BR>必须提供哪些介面给kernel, 可以使用kernel的哪些function call,和变数. <BR>随Unix版本而异... <BR> <BR>Chapter 17 STREAMS <BR> <BR>STREAMS架构本来是为了解决character devices重复发展太多程式码和 <BR>buffering的问题, 不过STREAMS设计得太强悍了, 使得terminal driver, <BR>pipe和网路driver都利用他来完成. STREAMS已被大多数的UNIX厂商所支持, <BR>成为广为接受的标准, 也是用来写网路driver较受欢迎的架构. <BR> <BR>STREAMS使用模组化的方式, 让使用者可以依堆叠的方式循序推入处理模组, <BR>而资料流则是通过一层层的模组达到驱动程式. 反之亦然. terminal driver <BR>就可以专心的处理与terminal沟通的细节, 而与Unix系统其他的部份,以及使 <BR>用者介面,可以丢给上层的模组处理就好了. STREAMS架构详细的订定各模组间 <BR>要如何沟通和应有的"举止". <BR> <BR>System V也定义了一个Transport Provider Interface及Transport Layer <BR>Interface(TPI/TLI), 功用类似BSD的socket介面,用来提供高阶程式设计 <BR>的标准介面. <BR> <BR>虽然STREAMS/TLI在本书写作之时好像颇具潜力,但是socket介面实在太强势了, <BR>又有winsock助长声势, 显然STREAMS在网路上没成气候, 但是在其他方面 <BR>则发展得十分良好. <BR> <BR> <BR>後记 <BR> <BR>就这样把这本书有趣的内容整理完了. 希望我的取材可以让那些略懂 <BR>Unix的人有更深入的空间,提高层次. 其中我省略了许多Unix Kernel基 <BR>础的概念,希望不会让人不知所云才好. 反倒是对Unix的简介好像写的 <BR>太详细了, 这是因为我发现有很多中文书在这方面写错了.... <BR> <BR>前言提到的那几本书(含本书)都很值得想了解Unix者阅读. 有许多的细 <BR>节都是要仔细的整篇阅读才会了解的, 像这样的摘要并不能完整的表达. <BR> <BR>书中对4.4BSD, Mach, SVR4/Solaris的描述, 我都尽量提及了. 希望对 <BR>Linux/FreeBSD/Solaris以及未来的GNU Hurd 以及苹果的狂想曲的了解 <BR>有所帮助. 另外你是否也跟我一样发现Sun真的不是一盏省油的灯, 确 <BR>实有两三把刷子呢? <BR> <BR>本书有个缺点就是校正不太完整. 内文reference到Section 0好几次, 但是 <BR>并没有Section 0. 应该是美中不足的地方吧! <BR> <BR>本书没有提到tcp/ip网路的部份, 应参考Stevens, TCP/IP Illustrated <BR>Volumne 1,2,3. <BR> <BR>本书对shared library以及执行档的结构没有作深入的讨论, 也是一个 <BR>遗憾... <BR> <BR><CENTER><H1>BBS水木清华站∶精华区</H1></CENTER></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -