发信人: 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毫秒