📄 00000001.htm
字号:
商业化的UNIX也为UNIX争添不少特色,如SunOS的Network File System (NFS), <BR>vnode/vfs interface支援多重档案系统,一个新的VM架构(为SVR4所采用) <BR>AIX是第一个支援journaling file system的商业UNIX. ULTRIX (DEC的旧UNIX) <BR>是支援multiprocessor UNIX的先趋之一. <BR> <BR>Mach <BR> <BR>Mach是Carnegie-Mellon大学(CMU)的microkernel(微核心)作业系统.(1980年代) <BR> <BR>随著功能越来越多,UNIX也日渐庞大复杂而难以掌握, microkernel的概念就是 <BR>把Kernel去芜存菁,仅留下重要的部分,其馀的功能都用user阶层的程式(称作 <BR>server)来达成就好了,藉此减低kernel的复杂度. <BR> <BR>Mach设计目标有 <BR> <BR> * 与UNIX相容 <BR> * 在单处理器,多处理器上都能执行 <BR> * 适合分散式运算环境 <BR> <BR>最普遍的版本是Mach2.5,是许多商业UNIX如DEC OSF/1, NextStep的基础. <BR>Mach3.0才是真正纯粹的完全Microkernel化版本. <BR> <BR>标准何在 <BR> <BR>UNIX的标准就像他的版本一样多.本小节仔细的介绍了各个标准与其命运. <BR>讨论到最新的资讯为Novell将UNIX商标卖给了X/Open,以及Sun Solaris 2.5版. <BR> <BR>1986年IEEE指定了一个委员会制定了一个一个开放作业系统的标准,称为 <BR>POSIX (Portable Operating Systems Interface,最後加上个X,为了好听,也是因为 <BR>本质上是UNIX的标准).<-这是我听说的,不是书上写的. <BR> <BR>X/Open是一个由国际性电脑厂商组成的机构,成立於1984.其目的比较务实, <BR>不是为众多的UNIX标准再添加一个.而是把重心放在汇集现有的标准, <BR>整理出一个共通的环境.XPG (X/Open Portability Guide)就是他的大作. <BR>目前UNIX这个商标应该是由X/Open所拥有. <BR> <BR>除了标准以外,UNIX厂商也有合纵联盟. <BR> <BR>UI, Unix International,是AT&T和Sun为主的联盟.主要的产物有SVR4和OpenLook. <BR>OSF, Open Software Foundation为以IBM,DEC,HP为首的公司投资的子公司. <BR>OSF对UNIX的贡献有Motif标准,DCE (Distributed Computing Environment). <BR> <BR>在NT出来搅局後,UI瓦解了,AT&T不要UNIX了(专心於他的plan9作业系统?), <BR>SVR4的传人变成了Sun的Solaris,不过Sun也不再坚持OpenLook,同时支援CDE <BR>(Common Desktop Environment,讲白话一点就是Motif). <BR> <BR>Chapter 2 The Process and the Kernel <BR> <BR>介绍Prcoess的各种资料结构与执行态,没什麽特别的.等於是Unix Progarmming <BR>的小复习. <BR> <BR>比较特别的是vfork的描述.有些书会让我们有在现代的UNIX下, vfork = fork with <BR>copy on write的错觉.实际上vfork後, child是和parent共用一块定址空间(比较像 <BR>multi-threading), child可以修改parent的资料. <BR>可能目前unix的语意和原始的vfork <BR>不一样了吧.. <BR> <BR>Chapter 3 Threads and Lightweight Processes <BR> <BR>这里提到Modern UNIX的特性之一: threads. 在Win95/NT, OS2的吹捧之下 <BR>大家应该有点耳濡目染了吧.这边定义了Threads和Lightweight processes. <BR>有些系统, threads = LWP,不过为了讨论的需要,本书threads != LWP. <BR> <BR>thread是一个最小的执行单元, 代表一个process在系统里面的活动状态.传统的 <BR>process就是仅有一个thread的程式.一个程式有5个thread就是说同一个程式里面 <BR>有五个工作同时在进行,也就是五个小程式独立互不干扰的一起跑的意思.(这 <BR>句话有语病,姑且当作对的好了) 比较低阶一点的看法是一个process有5个 <BR>instruction flow和五个stack.如果还是很模糊,看看Mach的定义九比较清楚了. <BR> <BR>Thread有三种:kernel threads, lightweight processes, user threads. <BR> <BR>kernel threads就是kernel有好几个分身,一个分身可以处理一件事的意思. <BR>这用来处理非同步事件很有用, kernel可以对每个非同步事件生个分身来处理. <BR>kernel threads的操作非常轻便,几乎没有负担,而且对Kernel的结构有帮助. <BR>支援kernel threads的kernel称作multithreaded kernel. <BR> <BR>Lightweight Process是有Kernel支援的user thread.也就是说,每个LWP,kernel <BR>皆使用一个thread来处理/支援.於是LWP可以看成是kernel thread的延伸.操 <BR>作LWP的代价是很大的,因为他牵扯到Kernel的context switching. <BR> <BR>user threads是在使用者空间,透过library模拟的thread,不需要或仅需要极少的 <BR>kernel支援,context switching比较快,因为不用更改page table等等东西, <BR>使用起来较为轻便快速.user threads提供操控视窗系统的绝佳解决方案. <BR> <BR>kernel基本上可以完全不知道user threads的存在, 而一个系统可以 <BR>提供数个不同的 library来提供不同policy. user threads才是一般应用程式 <BR>需要的multi-threading的形式, 因为此方式没有kernel参与, 所以最轻盈, <BR>最有效率. 提到这里,你是否对广告上, OS2和Win95/NT争multithreading支援 <BR>感到迷惑呢?他们真的不晓得在争哪个mulitthreading的功能耶... <BR> <BR>最有名的thread library有Mach's C threads,和POSIX pthreads. <BR> <BR>SunOS4.x所称的LWP指的是user threas,而不是本书的LWP. <BR> <BR>Solaris是由一组Kernel threads所构成,有一些用来执行LWP,有些负责一些系统的 <BR>任务. <BR> <BR>kernel thread比较有创意的应用是取代interrupt <BR>handler.有interrupt产生时,kernel可以产 <BR>生一个thread(分身)用来处理该interrupt.一口气解决掉re-entrant的问题 <BR> <BR>thread的scheduling有些意思,不过不方便以三言两语描述,也不甚有趣,就算了. <BR> <BR>Mach的Threads <BR> <BR>Mach kernel有两个基本观念: task和thread. <BR>Task是静态的物件,由定址空间和系统资源(port rights)构成. <BR>task提供了一个thread的执行环境. <BR>thread是Mach的基本执行单元. <BR>Mach提供了cthread函式库用来操作threads. <BR> <BR>Mach 3.0 Continuation <BR> <BR>Mach3.0对threads的改进颇有意思,名为continuation,其出发点是为了 <BR>节省stack的使用,在一个multi-threaded kernel下, thread越多(滥用:) <BR>则stack space也消耗越多,亟待解决. <BR> <BR>以下的程式片断很常见,也是一般kernel thread会block的原因(也就是 <BR>需要stack的时候. <BR> syscall(args) { <BR> ... /* 比如说,安排DMA传输一块disk block....*/ <BR> thread_block(); /* wait until completed */ <BR> process(args1); <BR> return; <BR> } <BR>如果 syscall block住的话,就要保留一个stack下来.要是可以让process()不需要 <BR>用到stack里面的资料的话,那就不用保留stack.当然事先要把tail所需的 <BR>参数存在static variable里. <BR>所以原程式就变成这样: <BR> syscall() { <BR> ... <BR> thread_block(process); <BR> /* not reached */ <BR> } <BR> process() { /* 最终处理*/ <BR> ... <BR> thread_syscall_return(status); <BR> } <BR> <BR>省下来的stack则要是下一个被wake up的thread刚好也是个continuation, <BR>可以直接给他用,省下一点cache/TLB misses. <BR> <BR> <BR>Digital UNIX <BR> <BR>讨论了OSF/1如何在Mach上利用tasks&threads实做出合UNIX语意的Process出来. <BR> <BR><CENTER><H1>BBS水木清华站∶精华区</H1></CENTER></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -