第 8章 分布式操作系统引言计算机技术及通信技术的飞速发展。各种类型的区域网,广域网不断出现大量的计算机通过网络被连结在一起,从而获得极高的运算能力及广泛的数据共享用高速通信联结起来的大量的计算机系统,通常称作为分布式系统而这是针对以往集中式系统(即,单处理机系统,
包含一个处理机,存储器,外设及一些终端)而言的分布式系统,所需用的软件同集中式系统是不同的,
对于操作系统的需求也是不同的机群类操作系统向广域化发展
NOW与 GLUnix
加州大学伯克利分校开发的机群操作系统
NOW,使廉价工作站以机群方式达到分布式超级计算机的效能 。 其规模为 100台 Ultra
SPARC-I处理机机群,巳投入正常运行 。 排名于世界最快的 200台超级计算机之内
构筑了 GLUnix,在现有 OS上的一层 。 策略是可移植,可跟踪销售商软件升级 。 能够管理实际的 100台处理机系统当代操作系统的发展趋势之一 (1)
在 NOW于 1998年完成之后,加州大学伯克利分校的一个更大规模的机群项目
Millennium( 千年 ) 开始启动
其目的是在校园范围完成内一个,机群的机群 (Cluster of Clusters)”
Millennium
机群类操作系统向广域化发展当代操作系统的发展趋势之一 (2)
Millennium由五层构成:
第 1层,计算机分布在十七个校园区内
第 2层,多处理机服务器,提供计算服务
第 3层,NOW组,每一个 NOW都是个机群
第 4层,一个大规模的 NOW,供全校园共享
第 5层,整体计算层,在 NOW组上构造,用于提供 NOW组和校园 NOW的共享机群类操作系统向广域化发展当代操作系统的发展趋势之一 (3)
Vineyard项目:加州大学伯克利分校又一个面向未来的研究项目
目标:超越一个伯克利分校校园范围内的机群,要通过高速网络连接其它工作站机群
构成一个协同工作站机群联合体
( a federation of cooperating workstation
clusters)
机群类操作系统向广域化发展当代操作系统的发展趋势之一 (4)
Beowulf项目
开始于 1994年,由 NASA的 Goddard空间飞行中心 (GSFC)研制
吸收了 NOW和其它机群的设计思想
用微型计算机,Linux和以太网设备等产品构造了机群
现在已有分布在全世界各地的约六十个大 学 和 研 究 机 构 在 使 用 它 。 目前
Beowulf还在继续发展机群类操作系统向广域化发展当代操作系统的发展趋势之一 (5)
8.1 什么是分布式系统? (1)
– 分布式系统的定义,尚不存在一致性的,普遍接受的定义,我们定义:
– 分布式系统是若干台独立计算机的一种联合体,在该联合体的用户看来,这个联合体就是一台单独的计算机
– 在这个定义中,前半句说明是对计算机硬件的要求,后半句是对计算机软件的要求,这两项都是对分布式系统基本的要求
另一个角度:
分布式系统是这样的一个系统,它运行在不具有共享内存的多台计算机上,但在用户眼里它却象是一台计算机
8.1 什么是分布式系统? (2)
实质思想,用户不必去关心系统中的多台计算机的存在 。
尽管目前不存在完全满足该条件的系统,
但已经有一些原型机开始出现
8.1 什么是分布式系统? (3)
8.2 分布式系统的作用
– 分布式系统是可以构造的。能构造的物品,不等于就是一个好主意
– 比如,可在一台 PC机上安装 8台软磁盘机。但有什么作用呢?
– 因此有必要讨论分布式系统有何优点及缺点
8.2.1 分布式系统相对于集中式系统的优势 (1)
1.它的分布式
举例,一个连锁商店集团,每一个商店有计算机系统处理当地业务,总部需要掌握各商店业务
一种解决方案就是使所有的计算机联网工作,象一台单独的计算机,并运行相关的应用软件,构成了一个商用分布式系统
8.2.1 分布式系统相对于集中式系统的优势 (2)
2,经济是分布式系统发展上的主要动力
80年代后期 CPU成本的大下降,用便宜的 CPU,组成一个高性能,低成本的计算机系统
构造有 10,000个芯片的计算机,每一
CPU 芯 片 为 1,000MIPS,可 以 获 得
10,000,000MIPS的运算性能
3,同样的性能在集中式系统中可能极高成本,
或者干脆实现不了
8.2.1 分布式系统相对于集中式系统的优势 (3)
4,它的可靠性
对于单个 CPU系统而言,CPU故障意味系统的垮台
分布式系统有多个 CPU,当一个 CPU系统发生故障时,整个系统仍旧能够工作
对于高可靠的环境,如核电站等,分布式系统是有其用武之地的
分布式系统的主要优点是,分布式系统可以以较低的成本获得较高的运算性能
5,可扩展性
8.2.1 分布式系统相对于独立
PC机的优势数据共享 例,多用户共享一个数据库外设共享 例,多用户共享高档外设通信 用户间通信方便灵活性 可均衡分配负载
8.2.2 分布式系统的弱点 (1)
1,缺乏设计、实现和使用分布式软件的经验
对于分布式系统,如何设计它的操作系统呢? 如何设计语言? 什么样的应用软件较适合分布式系统呢?
对于这些问题,许多答案还不清楚
8.2.2 分布式系统的弱点 (2)
2,有关分布式系统中的通信问题
因为信息在通信传送中可以丢失,
这是分布式系统中的大问题 。
没有可靠的通信手段,就不存在分布式系统
8.2.2 分布式系统的弱点 (3)
3.分布式系统共享数据但是:
易于共享,也就容易出现安全上的问题分布式系统的前途分布式系统的优点比缺点更为重要,而且缺点可以通过种种技术手段来加以弥补有迹象表明:
在今后的年代中,孤立的中、大型计算机系统将不复存在并行和分布式
MIMD
总线型 总线型交换型 交换型多处理机
(共享内存)
多计算机
(私有内存)
紧耦合 松耦合
8.3 按硬件特点分类 (1)
8.3 按硬件特点分类 (2)
不同的分类方法
1.根据指令流的数目和数据流的数目
2,根据是否有共享内存作为依据
3,根据连接方式分类
4,考察系统中机器是紧耦合的还是松耦合的
8.3按共享内存分类
一组具有共享内存的计算机,通常称为多处理机
另一组计算机则没有共享内存,称为多计算机
多计算机的一个实例:由网络连接起来的一组个人计算机群
8.3按连接方式分类
基于总线:基于总线是指用单一的媒介,如网络、总线、电缆等将所有机器连接起来。
基于总线的例子有,有线电视公司用一根电缆将所有用户连接在一起
基于交换:基于交换的系统中,机器与机器之间有单独的线相连,但没有单一总线的存在。机器间传递的消息需要在每一步传输路径上进行显式的交换。公用电话系统就是一种交换系统
8.3按耦合方式分类 (1)
按紧耦合的还是松耦合方式分类
在紧耦合系统中,消息在机器之间传输的时延很短,数据传输率很高
在松耦合系统中,情况正好相反,传输时延大,数据传输率低例子:
同一印刷电路板上的两个 CPU就属于紧耦合型通过电话用调制解调器连接起来的两台计算机就属于松耦合型
8.3按耦合方式分类 (2)
紧耦合型系统趋向于用作并行系统,
用于解决同一个问题松耦合型系统趋向于作为分布式系统,
用于解决多个不相关的问题
8.3按耦合方式分类 (3)
一个反例:一项利用成千上万台分布在全世界范围内的个人计算机,共同寻找分析宇宙中可能的外星人智能信号的项目
(SETI,The Search for Extraterrestrial Intelligence
at Home)
参加项目的每一台计算机都分配了一个独立分析范围,在空闲的时间里机器做分析信号的工作,
并在工作完成时用电子邮件汇报结果
8.3.1 总线型多处理机 (1)
总线型多处理机由用一根总线连接起来的多个 CPU和存储模块组成
只有一个共享内存,所以,如果 CPU
A往内存中写一个数据,CPU B随后读取该字的话,B将读到 A写入的值。具有这种性质的主存被称为具有一致性
一致性在分布式操作系统中是一个重要的概念
8.3.1 总线型多处理机 (2)
– 总线型多处理机的问题
通常当 CPU增加到 4,5个以上时,总线就有可能过载,系统的总体性能可能急剧下降
一种解决的方法,在 CPU与总线之间增加高速缓存 。 存放 CPU最近访问过的内容 。 如果高速缓存足够大,那么高速缓存命中率就会比较高,
这样由 CPU引起的总线传输就将少得多,从而使系统中能容纳更多的 CPU
通常,当高速缓存的大小在 64k到 1M之间时,
命中率会高达 90% 以上
8.3.1 总线型多处理机 (3)
– 高速缓存也带来了一致性问题
比如两个 CPU,A和 B,每个都将同一个字读入到各自的高速缓存中。然后 A
改写了该字。当 B随后读该字时,它读到的是原来的值,而不是 A新写入的值。
这样内存就不再一致了
8.3.1 总线型多处理机 (4)
一种解决方案:高速缓存被设计成写通过
(write-through)的
当一个字被写入高速缓存时,它也同时被写入内存当中
高速缓存读命中不引起总线传输,但所有的写操作都将引起总线传输
8.3.1 总线型多处理机 (5)
此外,所有的高速缓存都要监听总线传输。
当发现总线上的一个写操作所写的单元是在自己缓存的单元中时,它要么将自己缓存的单元清除,要么用写入的值更新该单元 ——
称作监听型高速缓存
– 方案符合一致性的要求。几乎所有的总线型多处理机都采用了写通过策略的监听型高速缓存这样的方案或类似的方案
8.3.2 交换型多处理机 (1)
用多于 64个的处理机来构造多处理机,就需要采用另一种不同的方式来连接 CPU与存储器
可能的方案是将主存分成多个模块,然后用交叉开关将它们与 CPU连接起来。每个 CPU和每个存储模块都有连线引出来。在每一个交叉点处都有一个小的交叉开关,它能打开或者合上。
当一个 CPU要访问某个存储模块时,相应的开关合上,访问就可以进行
8.3.2 交换型多处理机 (2)
优点:
在同一时刻可以有多个 CPU分别访问不同的存储模块
但是当两个 CPU要同时访问同一存储模块时,其中一个必须等待
8.3.2 交换型多处理机 (3)
8.3.2 交换型多处理机 (4)
缺点:
在要连接 n个 CPU与 n个存储模块时,
需要 n2个开关。当 n很大时,交叉开关方案就变得不太可行了
但只要恰当地设置开关,每个 CPU都能访问到任何一个存储单元
8.3.2 交换型多处理机 (5)
例,omega网
在该网络中包含 4个 2× 2的开关,每个开关有 2个输入和 2个输出,它能接通任何一对输入与输出 。
一般而言,要连接 n个 CPU与 n个存储单元,每一级要 n/2个开关
总共要 (nlog2n)/ 2个开关 。 它比 n2要好,
但仍然很大
8.3.2 交换型多处理机 (6)
C
C
C
C
M
M
M
M
2 X 2开关CPU 存储模块
OMEGA网
8.3.2 交换型多处理机 (7)
– 时延问题
例如 n=1024时,从 CPU到存储单元要经过 10个交换级,回过来也要 10级。假设 CPU是用
100MHz的蕊片,那么它每 10ns执行一个指令
一个存储访问请求要在 10ns内走过 20级,每个开关的时延只能是 0.5ns
整个多处理机需要 5120个 0.5ns的开关。这么多短时延的开关不会是很容易就能做到的
8.3.3 总线型多计算机 (1)
多计算机系统比较容易构造成功 。 在这种系统中每个 CPU都有自身的主存,不能直接访问其它 CPU的存储器
多计算机系统的问题,如何解决 CPU之间的通信
由于在多计算机中,通信是在 CPU与 CPU之间进行的,通信量要比多处理机那种从 CPU到主存之间的通信量少几个数量级 。 所以不需要非常高速的总线 。 实际上,它可以使用低速的局域网进行 CPU与 CPU之间的通信
8.3.3 总线型多计算机 (2)
总线型多计算机,它是由局域网连接的一群工作站
8.3.4 交换型多计算机 (1)
所有的多计算机都使用一种网络交换器,实现计算机与计间的通信
网络交换器是一种能接收计算机发来的信息包,
加以暂时存储,然后发到另一端计算机的网络部件
8.3.4 交换型多计算机 (2)
网络交换器能暂时存放发来的信息,用它可分割局域网、连接不同的局域网及扩展局域网的应用直径,从而高效地实现不同类型计算机之间和不同拓扑结构的计算机网络之间的通信
特点,每个 CPU只能直接访问它私有的主存,
并且这种访问是独享的,不允许其它 CPU访问
8.4 不同软硬件组合的系统讨论针对多处理机和多计算机的操作系统多 CPU的操作系统,大致可分出两类:
紧耦合型与松耦合型
松耦合型,允许系统中的机器和用户独立于其它机器和用户工作,但又有交互例一群个人机,每台都有 CPU、主存、硬盘和操作系统,又通过网共享资源
紧耦合型例,一台专门运行象棋程序的多处理机,
每个 CPU都分配有一个棋局进行推理,推理结束返回结果
8.4.1 网络操作系统 (1)
典型的网络操作系统,一个通过局域网连接的微型计算机网络
每个用户有自己的微机工作站,可能有硬盘,
也可能没有,但必定有自己的操作系统
操作系统管理单个的工作站,文件服务器,还要关心它们之间的通信
有可能所有的机器都运行同样的操作系统,但这不是必须的 。 每台机器都有高度的自治权,
除了网络通信之外,没有多少对整个系统范围的要求
8.4.1 网络操作系统 (2)
每个用户都在各自的网络工作站上工作,用户是否需要访问网络上其它工作站,是用户自主的决定
用户可以依据权限,使用整个网络中的各项资源,
但任何时候用户也不会认为他好象就工作在一台计算机上
如果出现了这种想法并试图这样去做,那么网络操作系统会明白地告诉他,这是一个错误
比如,用户自己的工作站上只有 C,D两个硬盘,他想访问另一台机器上的 F中的文件,如果用户不指定
F盘在哪台机器上,系统一定会告诉他,本机上没有
F盘
8.4.1 网络操作系统 (3)
典型的网络操作系统
- Sun 公司网络文件系统
Network File System,NFS
讨论 NFS的三个方面体系结构协议实现
NFS体系结构 (1)
基本的思想:让任意多的客户与服务器共享同一个文件系统客户与服务器在同一个局域网上 ( 多数情况 ) 或在广域网上假定:客户与服务器运行在不同的机器上,
( NFS允许一台机器可以同时既是客户又是服务器 )
NFS体系结构 (2)
每台 NFS服务器:将自己的一个或多个目录共享,以便让远程的客户能访问 。
一个目录被共享时,其所有子目录就被共享
/etc/exports文件列出了一台服务器上要被共享的目录 。 当服务器启动时,这些目录就自动被共享
NFS体系结构 (3)
客户通过 mount共享目录来访问它们 。 当客户
mount一个远程目录时,该目录就成为本地目录树中的一部分 。 许多 Sun工作站是无盘站 。
一台无盘站可以将一个远程的目录 mount成它的根目录,它的整个文件系统就完全由远程的服务器来支持 。 而有本地硬盘的工作站则可以将远程的目录 mount到本地目录树中,形成一个部分是本地,部分是远程的文件系统 。 对于在客户机上运行的程序来说,文件是在本地还是在远程服务器上是没有关系的 。
NFS体系结构 (4)
NFS基本的体系结构:服务器将自己的目录共享,客户机 mount它们
当两个或多个客户 mount同一个目录时,
它们就能通过共享文件进行通讯 。 某个客户机的程序创建一个文件后,另一个客户机上的程序就可以读该文件 。 共享文件就象通常的文件一样被使用,这种简单性是 NFS具有吸引力的一个重要方面
NFS协议 (1)
NFS的一个目标就是支持异构系统,客户与服务器能运行在不同的操作系统和不同的硬件上,这样就需要在客户与服务器之间定义一个清晰的接口
NFS定义了两个客户-服务器协议
NFS协议 (2)
协议是由客户发往服务器的请求,以及服务器返回给客户的响应组成的集合 。
服务器只需要能辨别和处理协议中定义的请求,它无需了解有关客户的更多信息 。 同样地,客户也可以将服务器当成一个接受并处理一定请求的黑盒子
NFS协议 (3)
第一条 NFS协议是关于 mount的 。 客户将一个路径名发给服务器,请求将该路径所说明的目录
mount到客户的目录树中 。 消息中不需要包含目录将被 mount的位置,因为服务器不需要关心这点 。 如果路径合法,并且该目录在共享目录集中,服务器就将返回一个文件指针给客户 。
这个指针唯一地确定了文件系统的类型,硬盘,
该目录对应的 I节点号 (索引节点号 ),以及安全信息 。 随后对该目录的读写操作就可以通过该文件指针来进行 。
NFS协议 (4)
有许多客户端可以静态 mount某些远程目录 。 一般这些客户端都有了一个名叫
/etc/rc的文件 。 该文件是一个包含了
mount命令的 shell脚本 。 当客户机启动时,这个 shell脚本会自动执行
NFS协议 (5)
另一种情况是 Sun版本的 Unix支持的自动
mount。 它将本地的一个目录与一群远程的目录联系起来,在客户机启动时远程目录并没有被 mount到客户机上,而是等到远程文件被首次打开时,操作系统才向每个指定的服务器发送一条消息,然后选择第一条响应的服务器,mount相应的目录 。
NFS协议 (6)
自动 mount相对于使用 /etc/rc文件的静态 mount有两个好处:
第一,在客户机启动时,如果 /etc/rc文件中指明的某个 NFS服务器没有启动,则客户机就启动不了,或者至少也要经过一定的延时,并显示出错信息 。 如果用户当时并不需要用到 NFS服务器,那么所有这些工作都是浪费的 。
NFS协议 (7)
第二,自动 mount允许客户机并行地与多个 NFS服务器联系,这样达到了一定程度的容错性,只要有一台 NFS服务器启动就够了,而且响应速度也得到一定的改善
(通过选择最先到的响应 )。
NFS协议 (8)
自动 mount假定:与某个目录相关连的所有远程目录是等效的 。
因为 NFS没有提供对文件和目录复制的自动支持,必须由用户自己来保证文件系统的一致性 。 因此自动 mount大部分情况下针对的是只读文件系统
NFS协议 (9)
第二条 NFS协议是关于目录和文件访问的 。
客户可以发送消息给服务器,以操作目录,或读写文件 。 另外,它们也可以访问到文件的属性,诸如文件的模式,大小,和最后一次修改的时间 。
NFS支持大部分 UNIX有关文件的系统调用,
但 OPEN和 CLOSE例外 。
NFS协议 (10)
因为在读写文件之前无需打开文件,读写完后也不需要关闭文件 。
客户如果要读一个文件,它向服务器发送一条包含文件名字的消息,请求服务器查看该文件,并返回对应的文件指针 。
查看文件与打开文件不同,查看操作并不将信息拷贝到系统内部表中 。
NFS协议 (11)
READ系统调用包含了文件指针,读的偏移地址和读取的字节数 。 采用这种方式的好处是服务器不需要记住任何打开的文件 。 当服务器崩溃再恢复时,没有丢失任何有关打开文件的信息,因为本来就没有这样的信息 。 这样一种不包含有关打开文件状态信息的服务器被称为是无状态的 。
NFS协议 (12)
相反,在 UNIX系统 V中,使用了远程文件系统 RFS。 它要求读写文件之前必须先打开文件 。 服务器记录所有被打开文件的信息,如当前读写头的位置,这样不需要每条请求都带上偏移地址 。 这种方式的缺点是一旦服务器崩溃再重启时,所有打开了文件的连接都丢失了,客户程序将随之失败 。 NFS则不存在这个问题 。
NFS协议 (13)
然而,NFS难以达到和 UNIX完全一致的语义 。
例如,在 UNIX中,一个文件可以被打开,
并且被锁住,这样其它进程就不能再访问它 。 当文件关闭时,锁也同时被解开 。
而在 NFS这样无状态的服务器中,锁是不能与打开的文件联系起来的,因为服务器不知道哪些文件被打开了 。 NFS需要另外一种机制来实现锁的功能 。
NFS协议 (14)
NFS使用 UNIX的保护机制,对所有者,同组人员和其他用户分别有 rwx位来记录他们的权力 。 早期的 NFS中,每个请求只是简单地包含调用者的用户标识和组标识,
服务器用它们来进行权限检查 。 但实际上,这是基于所有客户都是可信的这一假设 。
NFS协议 (15)
目前公开密钥机制可以用于客户与服务器之间的相互认证 。 当使用这个选项时,
一个恶意的客户就无法伪装成另一个客户,因为它不知道后者的私有密钥 。 不过,现在密码只用作认证,数据本身还是没有加密的 。
NFS的实现 (1)
客户与服务器的实现与 NFS协议之间是独立的,它包含三层 。
顶层是系统调用层 。 它负责处理象 OPEN、
READ,CLOSE这样的系统调用 。 在分析完调用和所带的参数后,它进激发第二层,
虚拟文件系统层 (VFS)。
NFS的实现 (2)
VFS层的任务是维护一个打开文件表,类似于 UNIX中的打开文件的 I节点表 。 在
UNIX中,一个 I节点用一个 (设备,I节点号 )对唯一标识 。 VFS中打开文件表的表项称为 V节点 (虚拟 I节点 ),每个打开的文件都对应有一个 V节点 。 V节点用于指明文件是本地的还是远程的 。 对于远程的文件,还记录了足够的信息以便访问它们 。
NFS的实现 (3)
例子:一个调用 MOUNT,OPEN,和 READ的序列 。
要 mount一个远程文件系统时,系统管理员调用 mount程序,指明远程的目录名,将要 mount
到的本地目录位置,以及其他信息 。 Mount程序分析远程目录的名字,从中提取它所在的机器名,然后与该机器联系 。 如果该目录存在,
并且可以被远程 mount,服务器就返回该目录的文件指针 。 最后 mount程序调用 mount系统调用,将文件指针传给内核 。
NFS的实现 (4)
接着内核为远程目录建立一个 V节点,并让 NFS客户代码在它内部创建一个 R节点
(远程 I节点 )存放这个文件指针 。 V节点指向 R节点 。 这样 VFS层中的每个 V节点要么存放了指向 NFS客户代码中 R节点的指针,要么存放了指向本地操作系统中 I节点的指针 。 从该 V节点可知一个文件或目录是本地的或是远程的 。 如果是远程的,
它能知道该文件的文件指针 。
NFS的分层结构系统调用层虚拟文件系统层本地操作系统 NFS客户发送消息给服务器本地硬盘虚拟文件系统层
NFS服务器来自客户的消息本地操作系统本地硬盘
NFS的实现 (5)
当一个远程文件被打开时,内核先分析该文件的文件名,得到它所在的远程文件系统所被
mount到的本地目录名 。 它看到该目录是远程目录,并且通过 V节点表找到该目录所对应的
R节点的指针 。 它接着就让 NFS客户代码去打开这个远程文件 。 NFS客户代码请求相应的服务器查看该文件,并返回该文件的指针 。 客户代码接着在自己的内部表中为该远程文件添加一个 R节点,并将结果返回给 VFS层 。 VFS层在 V节点表中为该远程文件构造一个 V节点,存放指向 R节点的指针 。 这里,我们又看到每个打开的文件或目录都有一个 V节点,它指向一个 R节点或一个 I节点 。
NFS的实现 (5)
调用者能得到远程文件的文件描述符 。 这个描述符通过在 VFS层的 V节点表映射到相应的 V节点 。 请注意,在服务器端是不存在对客户打开文件的记录 。 尽管当接到请求时,服务器需要提供文件指针,但它不保存哪些文件被客户打开 (在客户端有它的文件指针 )。 当一个文件指针发给服务器用于访问文件时,服务器只是检查该指针是否有效,有效的话,就使用它去访问文件 。 如果要求安全检查时,服务器会确认在 RPC头中的认证密钥是否有效 。
NFS的实现 (6)
当文件描述符用于随后的系统调用时,
例如 READ调用,VFS层将找到相应的 V节点,由此判定它是在本地还是在远程,
是用 I节点还是用 R节点描述 。
NFS的实现 (7)
提高性能的技术 ( 1)
客户与服务器之间传输的是大粒度的数据,通常是 8192个字节 。
客户端的 VFS层得到 8K数据后,它会自动请求读下一个 8K数据块,这样,当它需要该数据块时,数据已经到达了 。 这种技术称为预取,它在一定程度上能改善性能 。
NFS的实现 (8)
对于写也采取了类似的策略 。
当一个写操作写的数据少于 8K时,数据先在本地积累下来 。 只有当数据积累到 8K
时,才真正发送给服务器 。 当文件关闭时,所有的数据被立即发送给服务器 。
NFS的实现 (9)
提高性能的技术 ( 2)
caching(高速缓存 )
服务器缓存数据可以减少磁盘访问次数,
而这对客户是透明的 。 客户维护两类高速缓存,一类是针对文件属性 (I节点 )的,
另一类是针对文件数据的 。 当需要 I节点或文件数据块时,首先检查它们是否在客户的高速缓存中,如果在,就不需要网络传输了 。
NFS的实现 (10)
尽管高速缓存能显著地改善性能,它也引入了非常讨厌的问题 。 假设两个客户都缓存了同一个文件数据块,其中的一个更新该数据块后,
另一个客户随后读该数据块时,得到的将是老的数据块 。 这时出现了高速缓存的不一致性 。
介绍多处理机时也遇到了同样的问题 。 但在多处理机中可以通过让高速缓存监听总线来解决,
而这里却不可能这样做 。 因为更新位于客户高速缓存中的文件块不会产生任何的网络通讯,
即便是产生网络通讯,现有的硬件也无法监听所有的网络通讯 。
NFS的实现 (11)
考虑到这个问题的严重性,在 NFS的实现中通常采取若干办法来减轻它的不利影响 。 一个办法是给每个高速缓存块附加一个计时器 。 当计时器超时时,丢弃该缓存块 。 通常数据块的超时是 3秒,目录块的超时是 30秒 。 这样作可以缓和问题 。 另外,当一个被高速缓存的文件打开时,客户会发一条消息给服务器,看该文件最近一次被修改的时间 。 如果修改发生在缓存之后,缓存块将被丢弃,客户重新从服务器读取新的拷贝 。 最后,每隔 30秒,时钟都会超时,
所有的 dirty缓存块 (修改过的块 )都将被写回服务器 。
NFS的实现 (12)
NFS因为没有严格地实现 UNIX的语义而受到广泛地批评 。 一个客户对某个文件的写操作能否影响到随后另一个客户对同一个文件的读操作,是与时间相关的 。
而且,一个文件被创建后,外界可能要等到 30秒后才知道 。 还存在其它类似的问题 。
NFS的实现 (13)
尽管 NFS提供了共享文件系统,它的效果就象一个打了补丁的 UNIX,它没有完全定义好文件访问的语义 。 一群合作的程序运行的结果与时间相关 。 另外,NFS只涉及到文件系统,其它诸如进程这样重要的问题都没有涉及 。 尽管如此,NFS还是得到广泛的使用 。
NFS是运行在松耦合硬件上的松耦合软件
8.4.2 真正的分布式操作系统 (1)
分布式操作系统的思想,是让用户不关心系统中多
CPU的存在 。 目前尚不存在真正的符合条件的系统,
但有原型机出现分布式的特征:
进程管理应该处处一致 。 当一个进程开始时,所有内核将协调工作,以便找到运行该进程的最佳位置
在所有机器上有单一的系统调用集合,这些调用还必须适合分布式的环境 。 既然在所有地方系统调用都一样,那么在所有 CPU上运行同样的内核也就是自然的结果了
8.4.2 真正的分布式操作系统 (2)
本地通信与远程通信有相同的机制
有全局的保护机制
需要一个全局的文件系统
当然,每个内核对本地的资源还是有较大的控制权例如,既然没有共享内存,那么让各个内核管理自己的内存是很自然的事
需要页面交换时,本地的内核是决定怎样做的最佳人选 。 没有必要全局化
8.4.3 多处理机分时系统 (1)
常见的多处理机分时系统是运行 UNIX分时系统的机器 。 它们与传统机器的区别仅仅是用多个 CPU取代了单 CPU
对于外界而言,一个由 32个速度为 3 MIPS的
CPU组成的多处理机就象一个速度为 96 MIPS
的 CPU
这类系统的特点是存在进程运行队列:即由系统中处于就绪态的进程组成的队列 。 一个保存在共享内存中的数据结构描述了这个单一的运行队列
8.4.2 多处理机分时系统 (2)
因为没有 CPU私有内存,所有程序都存放在全局共享内存中。对于一个在结束前被调度很多次的长进程而言,它在每个 CPU上运行的时间将是平均的
多处理机分时系统与分布式系统之间不同点的另一个方面是文件系统。多处理机上的操作系统通常有传统的文件系统,与单处理机系统几乎没有任何差别,还包括一个单一、统一的文件块高速缓存系统。
8.5 分布式操作系统的特征
8.5.1 透明性 (1)
怎样让人相信在所谓的分布式系统中这样一群机器和一台普通的单处理机系统会一样呢? 能达到这样目标的系统被称为是透明的
8.5.1 透明性 (2)
透明性有两种层次含义
一种含义是对用户隐藏了分布性
例如,当一个 UNIX用户敲入 make时,从终端发出命令,再将结果显示到终端上,
分布式系统可以跟单处理机系统的表现完全一样。唯一不寻常的事情是,系统的性能似乎快了很多。用户不知道诸如编译一类的工作是在多台机器上执行的
8.5.1 透明性 (3)
系统对程序透明是透明性含义的更低一个层次。也就是说从系统调用的接口看不出有多个处理器存在
如果在一个系统中,访问远程文件是通过显式地建立一条与远程服务器的连接,再将消息发送给它,那么这样的系统显然不是透明的
8.5.1 透明性 (4)
– 透明性的各种含义
在一个真正的分布式系统中,用户不清楚
CPU,打印机,文件,数据库等等资源到底在哪里,位置透明性
如果资源可以自由地从一处迁移到另一处,
无需改变它们的名字,这就是迁移透明性
8.5.1 透明性 (5)
如果操作系统可以任意复制文件和其它资源,形成多个拷贝,而用户却不用关心这点,那么系统是复制透明性的
如果用户注意不到其它用户的存在,那么系统是并发透明的
在用户眼里分布式系统应该象一台传统的、
单处理器系统
8.5.1 透明性 (6)
如果一个程序员知道某个分布式系统中有 10,000
个 CPU,并且想利用其中的一部分 CPU运行象棋程序,系统该怎么办?
理论上的答案是,操作系统及其它系统软件如编译器、运行系统应该能知道怎样利用程序中潜在的并行性,程序员不需要知道这点。这是最困难的一种透明性,并行透明性
目前还没有人能做到这点。如果能实现并行透明性,那么有关分布式系统的研究将进入新的层次
8.5.2 灵活性 (1)
设计第二个关键性问题是灵活性
涉及到灵活性的关键,
分布式系统的结构设计
8.5.2 灵活性 (2)
对于分布式系统的结构有两种不同的观点
认为每台机器上应该运行一个传统的内核,
自身提供大部分的服务,这种方式称为单内核
认为每台机器上的内核应该提供尽可能少的服务,大部分操作系统的服务应该通过用户级的服务器来实现,这种方式称为微内核
8.5.2 灵活性 (3)
通常在集中式操作系统加上网络设施,再集成上远程服务就构成了单内核。系统调用是传统的,即通过执行陷井指令,转入到核心状态,由内核完成,结果再返回给用户进程
8.5.2 灵活性 (4)
在这种分布式系统中,大部分机器都有硬盘,并有本地的文件系统。许多通过
UNIX扩展或仿真的分布式系统都使用这种方法
8.5.2 灵活性 (5)
新设计的分布式系统一般使用了微内核设计方法
– 微内核通常只提供如下 4种服务:
进程间通信机制
内存管理
少量的低级进程管理和调度
底层的输入 /输出
8.5.2 灵活性 (6)
一般认为,微内核更加灵活,因为它只做非做不可的事情
它不提供文件系统、目录系统、大部的进程管理和多数系统调用。它仅仅提供那些在别处无法提供或者开销很大的服务
设计的总体目标是微内核应尽可能地小
8.5.2 灵活性 (7)
在由微内核实现的系统中,其它的系统服务都通过用户级的服务器实现每个服务都有一个的接口;每个客户都能访问到各项服务,而与位置无关
8.5.2 灵活性 (8)
微内核好处是高度模块化,也比较容易实现、
安装和调试新的服务,因为添加或更改服务不要求停止现有的系统
微内核具有更强的灵活性。任何需要特定系统服务的用户还可以编写自己定义的服务
8.5.2 灵活性 (9)
图 (a)单内核的系统 (b)微内核实现的系统
8.5.3 可靠性 (1)
理论上,在分布式系统中,当某个机器停止工作时,其它机器能接替它的工作所以分布式系统比单处理机系统更加可靠
8.5.3 可靠性 (2)
实际上,运行的分布式系统往往依赖于能同时正常工作的多个服务器系统的可靠性更取决于各个主要部件可靠性的布尔“与”,而不是布尔“或”
8.5.3 可靠性 (3)
– 可靠性有不同的含义
可用性 (availability)指的是系统可以正常工作的时间比例。高可靠性必须有很高的可用性。
一般而言,系统中文件拷贝的数目越多,
可用性会越好,但文件之间不一致的概率也越高,这是一种矛盾
8.5.3 可靠性 (4)
– 容错性与可靠性也有关联
一台服务器的崩溃会让整个系统都不能正常工作吗?
一般而言,在分布式系统中用户注意不到一两台服务器崩溃的事实,能察觉的顶多是性能上慢下来而已
8.5.3 可靠性 (5)
– 可靠性的另一层面是安全性
在分布式系统中,不能简单的相信消息中的名字或身份,因为发送过程中可能有欺骗
8.5.4 性能 (1)
– 一个分布式系统速度慢得出奇,那么它的透明、灵活和可靠的特性又有什么意义呢?
响应时间性能是评价的标准之一,系统利用率,吞吐率(每小时完成的作业数),
以及网络资源利用率也是评价的标准
当然,基准程序的测试结果是与基准程序本身的性质密切相关的
8.5.4 性能 (2)
– 在分布式系统中,性能受通信的影响极大
有时发一条消息并得到响应就要要花 1个毫秒。有关的绝大部分时间花在了必需的协议处理上,而不是电缆本身传播上
但为了提高性能,就要求发送很多消息。
在通信上时间开销就大,这又是一个矛盾
8.5.4 性能 (3)
– 可扩展性
在现有规模上采用的方法技术对于将来大规模的系统还适用吗?
现有的多数分布式系统中顶多有上百个
CPU
但是今天适合 200个 CPU系统的解决方案可能根本不适合未来有 2万个 CPU的系统