📄 00000001.htm
字号:
<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> <BR>Chapter 4 Signals and Session Management <BR> <BR>本节对UNIX的signal和session( &controlling terminals...) 作了详细的描述, <BR>不只是详细而已,而且把各版本的一同都写清楚了,一般的书没有这麽清楚的. <BR> <BR>Mach对signal的策略也是焦点之一,更可以看出mach不全是Unix. <BR>在Unix下我们安装一个signal handler来处理signal.而Mach则是使用 <BR>IPC来处理signal (正式的名字叫exception). Mach的每个thread都有对应的 <BR>exception port.如果要处理exception,就是再用另外一个thread去listen这个 <BR>exception port.这是per-thread exception port.另外还有一个per-task <BR>exception port. 如果thread的exception port没人听,就会转到task <BR>exception port,在没有人听当然就让他死啦! task exception port给 <BR>谁用的呢? debugger是也! <BR> <BR>Unix的debugger有个缺点,就是没办法debug fork出去的child.而透过IPC, <BR>mach debugger就没有这个问题,只要mach debugger可以listen他的exception <BR>port就行了. 使用IPC也让remote debugging变成一件容易的事.(mach有个 <BR>proxy server,可以把local port的message route到remote去,seeminglessly!) <BR> <BR>Unix的debugger从前只能debug自己fork出去的child,如果是一个已经执行的 <BR>程式就没法度了. Mach则是如前面所说的,只要能够listen人家的exception <BR>port即可. UNIX这方面也改进了,使用/proc file system也可以达到相同的作用. <BR> <BR>你学过UNIX一定了解什麽是process group,可是你不一定清楚session是什麽. <BR>session的概念是在SVR4和4.4BSD内成型的,因为以往只用process group的概念 <BR>没办法分清楚一个login session和一个session的某个job的不同. session的观念 <BR>算是蛮新的..在SVR3和4.3BSD以前都和process group混在一起. <BR> <BR> <BR>Chapter 5 Process Scheduling <BR> <BR>process scheduling的核心是clock interrupt,算是多工系统的心脏吧! <BR>Kernel以callout的形式来使用之. <BR> int id = timeout(void (*callout)(), caddr_t arg, long delta); <BR>向注册一个callout function,於delta tick後启动. <BR>许多kernel的机制都是这样子向timer注册达成的,包括scheduler. <BR> <BR>一个系统的ap可分为三类: <BR> <BR> * interactive - io intensive, 如shell, editor, GUI <BR> * batch - cpu intensive,如software buil;ds, scientific compuutations. <BR> * real-time - time critical,如放映影片, ap的需求是固定的放映速率, <BR> 如每秒20 frames. 一个系统如果只能提供一个不确定的速率,在 <BR> 15-40间变化,而平均值为30,那是难以接受的. <BR> <BR>Unix对前两项(i.e., time-sharing)都很在行,本章也对各种Unix的 <BR>run queue的处理做了深入的讨论.当然比较值得注意的还是Unix <BR>对real time的支援. <BR> <BR>以前, Unix Kernel不能支援realtime的原因是non-preemptive的缘故, <BR>有时候kernel会作某件事太久,让process饿死. SVR4解决的方法是 <BR>把耗时的演算法切成几节,中间放入几个preemption point.在这些点 <BR>kernel就可以preempt,使得支援real-time成为可能. <BR> <BR>Solaris kernel则更进一步,把大部分的data-structure都用适当的方法 <BR>保护起来(synchronize,如mutex lock, samaphore),让kernel变成真正的 <BR>preemptive.可见Solaris真的还不错. <BR> <BR>传统的Unix则是利用non-preemptive kernel的特性省去了这些lock. <BR> <BR>mach的scheduling policy有一点有趣的地方,在一个thread msg_send() <BR>後,一般可能会把他block住,把message enqueue起来, 到run queue内找 <BR>一个thread来跑. 但是如果已经有人在等这个message, <BR>mach则是直接scheduling receiver出来跑, message也不enqueue了,直接 <BR>copy到user-level address space.这样子增加IPC的效能, <BR>因为省却了搜寻run queue的时间, 以及IPC enqueue/dequeue的时间. <BR> <BR>Mach特别的地方是processor set的概念.一个task可以要求kernel配给他 <BR>n颗(a set,一组) CPU来跑. <BR> <BR>Digital UNIX源自於mach,但是却没有使用mach的scheduler. <BR>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -