发信人: tcpip (俺的昵称改了), 信区: cnunix
标 题: [转载] 好书共赏-《Unix Internels》(一)
发信站: 哈工大紫丁香 (Sun Sep 26 15:23:10 1999), 转信
寄信人: NTMD.bbs@bbs.net.tsinghua.edu.cn
发信站: 华南理工大学 BBS木棉站
日 期: Wed Aug 5 20:59:58 1998
发信人: BlueOcean (Blue), 信区: Unix
标 题: [转载] 好书共赏-《Unix Internels》(一)
发信站: BBS 水木清华站 (Mon Apr 27 12:59:09 1998) WWW-POST
有幸从师兄那里借来这本红宝书,真正是Bible级的好书。
从台湾精华区里看到对这本好书的介绍,现在转贴如下。
这本是我看见的第一本详细讲解thread技术的书,而且是从实现的角度,COOL!
Unix, I love you!
发信人: syc@cc.ntu.edu.tw (Shiau Yong-Ching), 看板: Linux
标 题: [转载] 好书共赏-《Unix Internels》(一)
发信站: National Taiwan University (Wed Jul 9 23:23:08 1997)
转信站: sobee!netnews.ntu!not-for-mail
在出国前, 送给陪伴我大学四年的TAnet & UNIX...
UNIX Internals
The New Fronters
导读
"UNIX系统的安装数已经成长到10个,
预料此数字会持续增加中"
-- Ken Thompson和Dennis Ritchie
於UNIX程式设计师手册第二版
1972年6月12日
讨论UNIX的书籍很多,但是绝大部分都只是讨论如何使用,讨论UNIX程式设计的书不
多,而介绍UNIX系统核心的书则是更少了..以下是几本有名的书:
* Bach的The Design of the UNIX Operating System, 1986 --讨论System V
Release 2
* Leffler等人, The Design and Implementation of the 4.3BSD UNIX
Operating System, 1988 -- 讨论4.3BSD UNIX
* Goodheart和Cox, The Magic Garden Explained, 1994 -- 讨论System V
Release 4.0
然而,这些书都只是针对单独的/特定的UNIX系统所写的,很少给读者一个整体的
观点. 而Uresh Vahalia的UNIX Internals -- The New Frontiers这本书
则是从一个宏观的角度来看Unix系统.在本书中,作者讨论了商业界,学术界
的各种UNIX系统,详细的介绍了各系统的演算法,并对各系统的优缺点作了
详细而且客观的比较,实在是系统管理员,程式设计师,电脑玩家认识各家
UNIX核心最好的读物.
本书是以介绍UNIX System V Release 4.2为主,并旁徵博引其他各家的UNIX,
以讨论其中利弊得失.出版日期是1996,是介绍UNIX核心的最新参考资料.
我的读後感是没有基础会读起来很辛苦.有UNIX的使用,管理以及程式设计的经验
是必须的,建议Bach的The Design of the UNIX Operating
System也先读过,那麽读这本
书就驾轻就熟了.
本文依序介绍本书中精采的部分,也就是大部分UNIX爱好者想要了解的部分,以飨宴
那些无法读原文书,或者没有时间专研Unix核心者.对於读者的程度没有特定的假设.
介绍的深度也是随兴的,请各位多多包涵.
Chapter 1 Introduction
失落的UNIX
本书对各家的UNIX皆有涉猎,唯独IBM的AIX则是几乎支字未提.如果你
是AIX的支持者,那麽本书可能会让你失望,因为AIX好像对UNIX核心的
发展不具影响力.同样的, HP-UX也是一样. 唯一你会知道的,大概是
这两个UNIX皆属於System V家族的著名UNIX.
本书写作应在1995年左右,然而1995,1996是UNIX变动最大的一年,有许
多的UNIX厂商更新了他们陈旧的UNIX系统,几乎都是向SVR4看齐,所以
没有提到他们, 应该影响不大吧, 或许他们没有什麽特殊的技术,也就是
比较平庸:p, 也可能是因为他们比较不开放,跟学术界不太打交道的缘故吧...
本章最重要的内容是UNIX的历史,不过由於1995/96变化太大了,有些东西
来不及走进历史 :)
本书常常提到的UNIX系统有正宗的UNIX System V Release 4.x,
UNIX最大的非主流派BSD UNIX 4.x (基本上是4.3, 4.4)以及UNIX的传人,
Carnegie-Mellon大学的Mach (ch发k的音,念Mac).再来就是占有率最高的
UNIX--Sun的SunOS以及Solaris. Digital Equipment Corporation(简称
Digital,或DEC) 的OSF/1,现在改名叫Digital UNIX,则是因为
使用了Mach核心而沾了不少光,曝光率大增.
综观全书, Sun 可以说是最有研发实力的UNIX厂商,实在不可轻忽.
历史课
1960年代末期,Bell Telephone Laboratories, General Electric 和
Massachusetts Institude of Technlogy合作研发一个多使用者的作
业系统, Multics.此计划於1969年三月取消. 取消後的故事大家有点
熟,又有点不熟,这里把key part点出来:
* Ken Thompson在DEC PDP-7上写了个叫Space Travel的电玩.
* PDP-7欠缺程式发展环境,so, Ken Thompson + Dennis Ritchie写了UNIX出来.
* Ken Thompson写了B语言(由BCPL演化而来的直译语言)
* Dennis Ritchie把B改成了著名的C语言.
* 1973年11月Unix version 4,使用C语言改写而成.
Unix的第一篇Paper "The UNIX Time Sharing System"由Ken Thompson和Dennis
Ritchie
提出,在1973年十月the ACM Symposium on OS (SOSP)中提出来.而在次年七月的
the Communications of the ACM发表.这是UNIX与外界的第一次接触.
UNIX免费流传的原因
1956年AT&T受到反托拉斯法调查.调查期间AT&T与联邦政府签订了一个协议,
不能经营与电话电报无关之业务.BTL隶属於AT&T.
UNIX在SOSP发表後,学术界对UNIX及其原始码索求不断,所以AT&T便免费的
提供原始码给学术界,此举造成了UNIX的广泛流传.
Berkeley的Computer Science Research Group, CSRG对UNIX的发展做了很多的贡献.
Berkeley的UNIX称为BSD UNIX. BSD对UNIX的贡献有virtual memory, TCP/IP, Fast
File System(FFS), reliable signals, socket介面.
4.4BSD把原来的VM换成Mach的VM,并引进了Logged File System. (LFS).
CSRG做完BSD4.4之後就关门大吉了.原因有:
* 补助的不足
* BSD的特色已经可以在商业系统上见到了(所以不用DIY了)
* 系统已经大到不是一个小组可以维护的程度了
有一家公司Berkeley Software Design, Inc.(BSDI)成立来继续行销4.4BSD,
从事商业行为.他们的BSD叫做BSD/386. BSDI宣称BSD/386经过了Berkeley
的改写,已经没有AT&T的原始码了.不过AT&T还是对Berkeley和BSDI提出告诉.
导火线是BSDI的电话: 1-800-ITS-UNIX.此一诉讼延後了4.4BSD的发表.
终於1994年二月四日,双方达成和解,撤销告诉. BSDI发表了不含AT&T宣称
的原始码的4.4BSD原始码,称为4.4BSD-Lite. 接下来的故事就是在网路上
的传奇,你可以在386BSD的讨论区看到.
UNIX System #
反拖拉司法调查结束後将AT&T拆成数个子公司, BTL改名为AT&T Bell Laboratories.
并且AT&T被允许进入电脑市场. AT&T发表的商业版UNIX计有System III,
System V, System V Release 2 (SVR2) System V Release 3, System V Release
4/4.2
System V引进了许多新的特色(相对於旧的UNIX),如regions架构的虚拟记忆体(和
BSD的不太相同), IPC, remote file sharing, shared libraries,
STREAMS架构等等.
UNIX的商业化
商业化的UNIX也为UNIX争添不少特色,如SunOS的Network File System (NFS),
vnode/vfs interface支援多重档案系统,一个新的VM架构(为SVR4所采用)
AIX是第一个支援journaling file system的商业UNIX. ULTRIX (DEC的旧UNIX)
是支援multiprocessor UNIX的先趋之一.
Mach
Mach是Carnegie-Mellon大学(CMU)的microkernel(微核心)作业系统.(1980年代)
随著功能越来越多,UNIX也日渐庞大复杂而难以掌握, microkernel的概念就是
把Kernel去芜存菁,仅留下重要的部分,其馀的功能都用user阶层的程式(称作
server)来达成就好了,藉此减低kernel的复杂度.
Mach设计目标有
* 与UNIX相容
* 在单处理器,多处理器上都能执行
* 适合分散式运算环境
最普遍的版本是Mach2.5,是许多商业UNIX如DEC OSF/1, NextStep的基础.
Mach3.0才是真正纯粹的完全Microkernel化版本.
标准何在
UNIX的标准就像他的版本一样多.本小节仔细的介绍了各个标准与其命运.
讨论到最新的资讯为Novell将UNIX商标卖给了X/Open,以及Sun Solaris 2.5版.
1986年IEEE指定了一个委员会制定了一个一个开放作业系统的标准,称为
POSIX (Portable Operating Systems Interface,最後加上个X,为了好听,也是因为
本质上是UNIX的标准).<-这是我听说的,不是书上写的.
X/Open是一个由国际性电脑厂商组成的机构,成立於1984.其目的比较务实,
不是为众多的UNIX标准再添加一个.而是把重心放在汇集现有的标准,
整理出一个共通的环境.XPG (X/Open Portability Guide)就是他的大作.
目前UNIX这个商标应该是由X/Open所拥有.
除了标准以外,UNIX厂商也有合纵联盟.
UI, Unix International,是AT&T和Sun为主的联盟.主要的产物有SVR4和OpenLook.
OSF, Open Software Foundation为以IBM,DEC,HP为首的公司投资的子公司.
OSF对UNIX的贡献有Motif标准,DCE (Distributed Computing Environment).
在NT出来搅局後,UI瓦解了,AT&T不要UNIX了(专心於他的plan9作业系统?),
SVR4的传人变成了Sun的Solaris,不过Sun也不再坚持OpenLook,同时支援CDE
(Common Desktop Environment,讲白话一点就是Motif).
Chapter 2 The Process and the Kernel
介绍Prcoess的各种资料结构与执行态,没什麽特别的.等於是Unix Progarmming
的小复习.
比较特别的是vfork的描述.有些书会让我们有在现代的UNIX下, vfork = fork with
copy on write的错觉.实际上vfork後, child是和parent共用一块定址空间(比较像
multi-threading), child可以修改parent的资料.
可能目前unix的语意和原始的vfork
不一样了吧..
Chapter 3 Threads and Lightweight Processes
这里提到Modern UNIX的特性之一: threads. 在Win95/NT, OS2的吹捧之下
大家应该有点耳濡目染了吧.这边定义了Threads和Lightweight processes.
有些系统, threads = LWP,不过为了讨论的需要,本书threads != LWP.
thread是一个最小的执行单元, 代表一个process在系统里面的活动状态.传统的
process就是仅有一个thread的程式.一个程式有5个thread就是说同一个程式里面
有五个工作同时在进行,也就是五个小程式独立互不干扰的一起跑的意思.(这
句话有语病,姑且当作对的好了) 比较低阶一点的看法是一个process有5个
instruction flow和五个stack.如果还是很模糊,看看Mach的定义九比较清楚了.
Thread有三种:kernel threads, lightweight processes, user threads.
kernel threads就是kernel有好几个分身,一个分身可以处理一件事的意思.
这用来处理非同步事件很有用, kernel可以对每个非同步事件生个分身来处理.
kernel threads的操作非常轻便,几乎没有负担,而且对Kernel的结构有帮助.
支援kernel threads的kernel称作multithreaded kernel.
Lightweight Process是有Kernel支援的user thread.也就是说,每个LWP,kernel
皆使用一个thread来处理/支援.於是LWP可以看成是kernel thread的延伸.操
作LWP的代价是很大的,因为他牵扯到Kernel的context switching.
user threads是在使用者空间,透过library模拟的thread,不需要或仅需要极少的
kernel支援,context switching比较快,因为不用更改page table等等东西,
使用起来较为轻便快速.user threads提供操控视窗系统的绝佳解决方案.
kernel基本上可以完全不知道user threads的存在, 而一个系统可以
提供数个不同的 library来提供不同policy. user threads才是一般应用程式
需要的multi-threading的形式, 因为此方式没有kernel参与, 所以最轻盈,
最有效率. 提到这里,你是否对广告上, OS2和Win95/NT争multithreading支援
感到迷惑呢?他们真的不晓得在争哪个mulitthreading的功能耶...
最有名的thread library有Mach's C threads,和POSIX pthreads.
SunOS4.x所称的LWP指的是user threas,而不是本书的LWP.
Solaris是由一组Kernel threads所构成,有一些用来执行LWP,有些负责一些系统的
任务.
kernel thread比较有创意的应用是取代interrupt
handler.有interrupt产生时,kernel可以产
生一个thread(分身)用来处理该interrupt.一口气解决掉re-entrant的问题
thread的scheduling有些意思,不过不方便以三言两语描述,也不甚有趣,就算了.
Mach的Threads
Mach kernel有两个基本观念: task和thread.
Task是静态的物件,由定址空间和系统资源(port rights)构成.
task提供了一个thread的执行环境.
thread是Mach的基本执行单元.
Mach提供了cthread函式库用来操作threads.
Mach 3.0 Continuation
Mach3.0对threads的改进颇有意思,名为continuation,其出发点是为了
节省stack的使用,在一个multi-threaded kernel下, thread越多(滥用:)
则stack space也消耗越多,亟待解决.
以下的程式片断很常见,也是一般kernel thread会block的原因(也就是
需要stack的时候.
syscall(args) {
... /* 比如说,安排DMA传输一块disk block....*/
thread_block(); /* wait until completed */
process(args1);
return;
}
如果 syscall block住的话,就要保留一个stack下来.要是可以让process()不需要
用到stack里面的资料的话,那就不用保留stack.当然事先要把tail所需的
参数存在static variable里.
所以原程式就变成这样:
syscall() {
...
thread_block(process);
/* not reached */
}
process() { /* 最终处理*/
...
thread_syscall_return(status);
}
省下来的stack则要是下一个被wake up的thread刚好也是个continuation,
可以直接给他用,省下一点cache/TLB misses.
Digital UNIX
讨论了OSF/1如何在Mach上利用tasks&threads实做出合UNIX语意的Process出来.
--
Buck barks in the darkness
※ 修改:.trueip 于 Sep 26 15:26:55 修改本文.[FROM: dns.mtlab.hit.ed]
--
※ 转寄:.华南网木棉站 bbs.gznet.edu.cn.[FROM: dns.mtlab.hit.ed]
--
☆ 来源:.哈工大紫丁香 bbs.hit.edu.cn.[FROM: trueip.bbs@melon.gzn]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:209.339毫秒