第 10章 分布式文件系统分布式系统的关键部分:文件系统
文件服务和文件服务器
分布式文件系统设计
目录服务器
设计分布式文件系统的关键问题
系统结构
复制性
分布式文件系统发展趋势
分布式文件系统 - 示例,NFS体系结构文件服务和文件服务器文件服务:为客户所提供的内容的一种规范说明,
描述了可用的原语,使用参数以及执行的操作文件服务确定了文件系统对客户的界面文件服务器:运行于某些机器上的进程并帮助实现文件服务良好的文件服务:用户不知道文件系统如何实现系统会有多个文件服务器,提供不同的文件服务
10.1分布式文件系统设计两个不同的部件:文件服务和目录服务
文件服务:与单个文件上的操作相关,
诸如读、写和添加
目录服务:与维护目录有关,在目录上加、删文件等等文件服务的接口
什么是文件?有两种文件的逻辑结构
流式文件文件是一个不加解释的字节序列文件信息的意义与结构全部由应用程序来决定操作系统对之无兴趣
记录式文件文件可被组织成一串记录可使用操作系统的调用读写某个记录
大多支持把文件视作字节序列的概念而不是关键记录的序列文件属性
不包括在文件内容中的
有关文件的若干条信息
常见的属性:所有者,文件大小,建立日期和访问许可
文件服务通常会提供一些对属性进行读写操作的原语文件可否修改
文件被创建之后,是否可被修改通常可以
,不可改变的 (immutable)” 文件仅有 CREATE和 READ文件操作一个文件一旦创建,它就不能改变易于支持文件缓存和复制消除了由于文件改变而要更新所有副本所引起的问题文件保护
存取能力表每个用户持有一张称作存取能力表的票据用于它访问的每一个对象存取能力指定了哪种形式的访问是被允许的
存取控制表一个文件对应一个隐式或显式的用户表指明可能访问的用户及可能的访问形式两种类型文件服务
文件的上载 /下载模式
远程访问模式文件上载 /下载模式
只提供两种操作:读文件和写文件
读操作,将整个文件从服务器送到申请的客户
写操作,将整个文件从客户传递到服务器
在服务器和客户之间移动整个文件文件可以按需要而保存在内存或本地磁盘上只提供了物理存储和传输
优点,概念上的简洁性没有复杂的文件服务接口整体文件传送效率很高
缺点,客户端必须有足够的存储空间只需文件一小部分,传整个文件浪费
(a) 上载 /下载模式
(b) 远程访问模式远程访问模式
文件服务提供:
打开和关闭文件、文件读和写、文件内的移动( LSEEK)
考察和修改文件属性等等操作
文件系统运行在服务器上,不是客户机上
优点:在客户机上无须太多的空间,
消除零碎空间中放入整个文件的问题
10,2 目录服务器
提供创建和删除目录、对文件命名和改名把文件从一个目录移向另一个目录
文件命名规则:
可以是从 1到某个大的数字,字符或特殊字符
扩展名文件名划分为两部分,通常用一个,.”分开名字第二部分,称为文件扩展名,标识了文件的类型目录和子目录
目录下包含子目录,可把相关文件放在一起
系统提供创建、删除、进入以及移动子目录和从子目录中查找文件的功能
层次型文件系统:
子目录可再包含子目录从而形成树型目录
目录的链接:
某些系统中,能创建到任一目录的链接或指针不仅构建树,而且构建任意目录图,功能更强
10.3 设计分布式文件系统关键问题
所有机器和进程都应该对目录层次有相同的认识
应有一个全局性的并为所有机器所确认的根目录
(a) 两个文件服务器。矩形是目录,而圆环是文件
(b) 所有客户机对某文件系统都有相同认识的系统
(c) 不同的客户机对某文件系统有不同认识的系统名称解析透明性
定位透明性服务器可以在网络中随意移动,其路径名也无需改动文件在移动时无需改变其名称时,称为定位独立性
在路径名中嵌入了服务器名称显然不是定位独立的
定位透明性 不易实现名称解析三个处理方式:
机器+路径解析,诸如 /machine/path或
machine:path
把远程文件系统安装到本地文件层次中
对所有机器都视同一致的单一名称空间前两项容易实现后者较困难,需要仔细地设计两级名称解析 (1)
二级命名法对用户:文件(及其它对象)有符号名对机器:有系统内部使用二进制名要提供这两个名字解析间的一种映射在一个有多个自含文件服务器的系统中二进制名实质上就是一个本地的I -结点数
通用名称解析方案:
二进制名指向服务器和里面的某个特定文件两级名称解析 (2)
符号链符号链是一个目录项,映射到一个(服务器,文件名)中的字符串上通过字符串,可通过命名的服务器找到二进制名符号链本身实际上就是路径名两级名称解析 (3)
利用二进制名能力查找一个 ASCII码名字包括物理的或逻辑的机器号或适当的服务器网络地址物理地址就可用来向服务器发消息通过通过广播或者在名字服务器上查找能够定位一个虚拟地址文件共享的语义
多用户文件共享要严格定义读与写语义
UNIX语义学当 READ操作接着 WRITE操作时
READ所返回的值正是刚写入的
类似地,当两个 WRITE操作连续出现后跟一个 READ操作读的值是最后一次写的值
系统按绝对的时间序列执行所有操作且总是返回最后一次操作的值单一服务器文件系统单一服务器文件系统性能,通常很差改进:允许客户机在其私有空间中维护文件本地副本客户在本地修改缓存区文件接着另一个客户从服务器读取该文件第二个客户会得到一个陈旧的文件解决方法:向服务器播送对缓存区文件的全部修改概念尽管简单,但处理是低效率的
(a) 单处理器上,当 READ跟随 WRITE,返回值是刚才写入的值
(b)有缓存区的分布式系统中,可能被返回的是陈旧值替代解法:会话语义( session
semantics)
放松文件共享的语义学要求新的规则:“对打开文件的修改,仅对修改该文件的进程是初始可见的”
重新定义了正确的操作的实际行为当A关闭文件时,它送一个副本给服务器所以后续的 READ得到了所需要的新值会话语义的问题更多的客户同时在同一个缓存区上修改会怎样?
一种解决方法:
当每个文件依次关闭时,其值回送给服务器最后的结果取决于谁最后关闭
不可更改文件:
操作只有 CREATE与 READ
虽然文件不能更新,但可以更新目录问题就不存在了
共享文件的第四个方法 - 原子事务:
确保在事务中的所有调用都会按序执行不会被任何其它的、并发的事务所干扰方式 评论
UN I X 语义 在文件上的每一操作对所有进程均是立即可见的会话语义 在文件关闭之前,
变化对其它进程是不可见的不可变 文件 不能更新,简化了共享和复制处理原子事务 所有修改有,全是 - 或 - 全不是的性质文件的实际使用 模式 多数文件较小 (低于 1 0 k )
读比写要多得多读和写是顺序的,很少随机访问多数文件寿命很短文件共享是不寻常的平均看进程只使用少量文件存在不同特性的显然不同的文件类型
10.4 系统结构
,客户机和服务器有差别吗?”
在一些系统中(比如,NFS)
客户机和服务器之间没有差别
另一个极端客户机和服务器在软硬件上是完全不同的服务器甚至可以运行不同的操作系统怎样构造文件和目录服务一种方法:两种服务组织到单独的服务器里用户送一个符号名给目录服务器目录服务器返回服务器可以识别的二进制文件名
a
b
c
文件客户机查找 a/b/c
查找 b/c
查找 c
回应 c
目录在服务器 1
目录在服务器 2
目录在服务器 3
a
b
c
文件客户机 查找 b/c
查找 c
回应 c
查找 a/b/c
层次化目录
层次化目录有可能分段处在多个服务器上经常地寻找路径名,特别是多重目录服务器费用会很昂贵
采用提示快捷栈保存最近查找的名字以及查找的结果
另一种方法:把它们分隔开
拥有两个服务器将需要更多的通讯客户机的状态
一派认为服务器应是无状态 (stateless)的当客户机向服务器发出请求,服务器执行了这个请求,发送回答信息,在请求之间,没有保留客户机状态信息每个请求必须自我包含信息,包含全文件名及文件内的偏移量,以允许服务器完成工作信息增加了消息的长度
另一派认为保留客户机请求间的状态信息是完全有必要的服务器状态容错 较短的请求消息无需 OP E N /C L O SE 调用 较好的性能不在表上浪费服务器空间 有可能预读打开文件数量无限制 较易实现客户机失效时不受影响 文件加锁有可能缓存区处理 (Caching)
四个地方存放文件:
服务器硬盘服务器主存客户机硬盘(若存在的话)
客户机主存
3 421
网络客户机主内存客户机磁盘(可选) 服务器主内存服务器磁盘可存放文件的四个地方
服务器硬盘:
所有文件在服务器的硬盘上文件可被所有客户机所访问一个文件只有一套拷贝,不存在一致性问题
服务器主存:
在服务器主存上缓存最近使用过的文件可使性能获得高的提升主存一般都比磁盘小需要算法决定文件的哪部分留在缓存区
客户机的主存:
运用缓存区的不同方式
( a)无缓存区
( b)在每一进程中设缓存区
( c)在内核中设缓存区
( d)视作用户进程的缓存区管理器方案 b最简单:把缓存文件直接放在用户进程自有地址空间中大多数进程只读一个文件一项所以在库中设缓存区并没有多大的价值
方案 c:客户机缓存区是内核缺点,需要内核的调用这种缓存区比在进程中设缓存区效果为好
方案 d:缓存区在不同的用户缓存区管理器中优点:内核同文件系统代码无关容易编程,因为它它完全隔离且更具灵活性缓存区一致性
客户机把不一致性引入了系统方法 评价遍写 工作,但不影响写的操作延迟写 更好的性能,但可能带来二义性闭写 满足会话语义要求集中控制 U N I X 语义,但鲁棒性和可伸缩性差不可改变的文件
具有吸引力,有在机器上进行缓存处理的能力
不用担心机器会有改变它的可能性
10.5 复制性 (replication)
分布式系统常常提供文件复制服务给客户主要原因:
可靠性:每一文件各自独立的副本增强可靠性
有效性:即使服务器关闭时,也允许访问文件
性能:
所有文件在一台服务器会造成性能瓶颈多服务器上复制文件,最轻载的将被使用
C
S1
S2
S3
1
2
3
S1
S2C
S3
S1
S2C
S3
客户机服务器当前稍后稍后文件
Prog.c
1.14
1.21
2.16
2.43
3.19
3.41
符号名 多重二进制地址
(a)
(b) (c)
(a) 显式文件复制
(b) 空闲复制
(c) 使用组的文件复制三种复制
复制关键问题是透明度问题
三种复制,显式文件复制;空闲复制;组通讯
显式文件复制程序员控制整个复制进程进程在某服务器上创建个文件如果需要的话,可以在其他服务器上备份多份如果目录服务器允许文件的多份拷贝同时存在那么备份的网上地址都与文件名相关只要给出文件名,所有的备份都能被找到
空闲复制( Lazy replication)
每个文件只在一服务器中建立在服务器空闲时自动复制到另外的服务器中复制过程对用户透明在后台复制文件时,注意原文件是否已被修改过
组通讯方式全部“写”调用同时发往所有服务器后备文件与原件同时产生空闲复制与组通讯方式的两个区别:
在空闲复制方式中只须一个服务器地址,
而不是一个组
空闲复制空闲时在后台进行而组通讯方式中,所有文件同时产生如何更新
原本复制 (primary copy replication)
一台服务器被指定为主机,其它的当作辅机已复制文件需要更新时,首先告诉主机,把主机文件修改然后主机命令辅机,要求它们修改缺点:一旦被指定主机不能工作,对文件的修改不能进行
复制更可靠的方法:“投票表决法 (voting)”
基本思想:无论读或写已复制文件时,用户应向多台服务器提出请求并获得同意
“幽灵表决法 (voting with ghost)”
在多数的应用中,读比写要更为多一般 N r 很小,而 N W几乎和 N一样一些服务器崩溃,法定写票权就不可能得到一台服务器崩溃就建立一个没有存储器的哑服务器幽灵不允许有读票权(它根本没有任何文件)
但可以参与写票权,它只是把写入的文件扔掉存在至少一台真实的服务器时,写操作才会成功
分布式文件系统上的经验工作站有周期可用只要有可能就使用缓存区考察使用特性减小系统范围和变化只对最少的实体加以信任有可能时进行批处理
10.6 分布式文件系统发展趋势 (1)
新的硬件
存储器便宜文件系统可以永久地常驻内存性能上的较大改进,极大的简化文件系统约结构
对文件系统可能会产生影响的技术是光盘
快速光纤网络少量的,设计良好的硬件就可以解决用软件难于克服的困难很有可能,未来的分布式系统会得到各种专门化硬件的支持分布式文件系统发展趋势 (2)
可伸缩性
广域网在未来各大洲的透明的分布式操作系统什么样的文件系统将为全世界呢?现在,没有人能知道现在的部分解是 Internet
分布式系统必须处理庞杂机种的情况 - 异构网电子邮件、电子银行、电子娱乐活动等将改变文件应用、访问模式以及许多我们尚不知晓使用方式分布式文件系统发展趋势 (3)
移动用户发展最迅速的一个领域设计全球的、全透明的分布式文件系统供成百万移动的并且经常断开连接的用户使用分布式文件系统发展趋势 (4)
容错系统将在数据不完全情况下,仍可运行随着计算机普及到非专业人群中系统会瘫痪,难以被接受
10.7分布式文件 - 示例,NFS体系结构
基本的思想:让任意多的客户与服务器共享同一个文件系统客户与服务器在同一个局域网上(多数情况)或在广域网上假定:客户与服务器运行在不同的机器上,
( NFS允许一台机器可以同时既是客户又是服务器)
NFS体系结构
每台 NFS服务器:将自己的一个或多个目录共享,以便让远程的客户能访问。
一个目录被共享时,其所有子目录就被共享
/etc/exports文件列出了一台服务器上要被共享的目录。当服务器启动时,这些目录就自动被共享
NFS体系结构
客户通过 mount共享目录来访问它们。当客户
mount一个远程目录时,该目录就成为本地目录树中的一部分。许多 Sun工作站是无盘站。
一台无盘站可以将一个远程的目录 mount成它的根目录,它的整个文件系统就完全由远程的服务器来支持。而有本地硬盘的工作站则可以将远程的目录 mount到本地目录树中,形成一个部分是本地、部分是远程的文件系统。对于在客户机上运行的程序来说,文件是在本地还是在远程服务器上是没有关系的。
NFS体系结构
NFS基本的体系结构:服务器将自己的目录共享,客户机 mount它们
当两个或多个客户 mount同一个目录时,它们就能通过共享文件进行通讯。某个客户机的程序创建一个文件后,另一个客户机上的程序就可以读该文件。共享文件就象通常的文件一样被使用,这种简单性是 NFS具有吸引力的一个重要方面
NFS协议
NFS的一个目标就是支持异构系统,客户与服务器能运行在不同的操作系统和不同的硬件上,这样就需要在客户与服务器之间定义一个清晰的接口
NFS定义了两个客户-服务器协议
NFS协议
协议是由客户发往服务器的请求、以及服务器返回给客户的响应组成的集合。
服务器只需要能辨别和处理协议中定义的请求,它无需了解有关客户的更多信息。同样地,客户也可以将服务器当成一个接受并处理一定请求的黑盒子
NFS协议
第一条 NFS协议是关于 mount的。客户将一个路径名发给服务器,请求将该路径所说明的目录 mount到客户的目录树中。消息中不需要包含目录将被 mount的位置,因为服务器不需要关心这点。如果路径合法,并且该目录在共享目录集中,服务器就将返回一个文件指针给客户。这个指针唯一地确定了文件系统的类型、
硬盘、该目录对应的 I节点号 (索引节点号 ),以及安全信息。随后对该目录的读写操作就可以通过该文件指针来进行。
NFS协议
有许多客户端可以静态 mount某些远程目录。一般这些客户端都有了一个名叫
/etc/rc的文件。该文件是一个包含了
mount命令的 shell脚本。当客户机启动时,
这个 shell脚本会自动执行
NFS协议
另一种情况是 Sun版本的 Unix支持的自动
mount。它将本地的一个目录与一群远程的目录联系起来,在客户机启动时远程目录并没有被 mount到客户机上,而是等到远程文件被首次打开时,操作系统才向每个指定的服务器发送一条消息,
然后选择第一条响应的服务器,mount
相应的目录。
NFS协议
自动 mount相对于使用 /etc/rc文件的静态
mount有两个好处:
第一,在客户机启动时,如果 /etc/rc文件中指明的某个 NFS服务器没有启动,则客户机就启动不了,或者至少也要经过一定的延时,并显示出错信息。如果用户当时并不需要用到 NFS服务器,那么所有这些工作都是浪费的。
NFS协议第二,自动 mount允许客户机并行地与多个 NFS服务器联系,这样达到了一定程度的容错性,只要有一台 NFS服务器启动就够了,而且响应速度也得到一定的改善 (通过选择最先到的响应 )。
NFS协议
自动 mount假定:与某个目录相关连的所有远程目录是等效的。
因为 NFS没有提供对文件和目录复制的自动支持,必须由用户自己来保证文件系统的一致性。因此自动 mount大部分情况下针对的是只读文件系统
NFS协议
第二条 NFS协议是关于目录和文件访问的。客户可以发送消息给服务器,以操作目录,或读写文件。另外,它们也可以访问到文件的属性,诸如文件的模式、
大小、和最后一次修改的时间。
NFS支持大部分 UNIX有关文件的系统调用,但 OPEN和 CLOSE例外。
NFS协议因为在读写文件之前无需打开文件,读写完后也不需要关闭文件。
客户如果要读一个文件,它向服务器发送一条包含文件名字的消息,请求服务器查看该文件,并返回对应的文件指针。
查看文件与打开文件不同,查看操作并不将信息拷贝到系统内部表中。
NFS协议
READ系统调用包含了文件指针、读的偏移地址和读取的字节数。采用这种方式的好处是服务器不需要记住任何打开的文件。当服务器崩溃再恢复时,没有丢失任何有关打开文件的信息,因为本来就没有这样的信息。这样一种不包含有关打开文件状态信息的服务器被称为是无状态的。
NFS协议
相反,在 UNIX系统 V中,使用了远程文件系统 RFS。它要求读写文件之前必须先打开文件。服务器记录所有被打开文件的信息,如当前读写头的位置,这样不需要每条请求都带上偏移地址。这种方式的缺点是一旦服务器崩溃再重启时,
所有打开了文件的连接都丢失了,客户程序将随之失败。 NFS则不存在这个问题。
NFS协议
然而,NFS难以达到和 UNIX完全一致的语义。
例如,在 UNIX中,一个文件可以被打开,
并且被锁住,这样其它进程就不能再访问它。当文件关闭时,锁也同时被解开。
而在 NFS这样无状态的服务器中,锁是不能与打开的文件联系起来的,因为服务器不知道哪些文件被打开了。 NFS需要另外一种机制来实现锁的功能。
NFS协议
NFS使用 UNIX的保护机制,对所有者、
同组人员和其他用户分别有 rwx位来记录他们的权力。早期的 NFS中,每个请求只是简单地包含调用者的用户标识和组标识,服务器用它们来进行权限检查。
但实际上,这是基于所有客户都是可信的这一假设。
NFS协议
目前公开密钥机制可以用于客户与服务器之间的相互认证。当使用这个选项时,
一个恶意的客户就无法伪装成另一个客户,因为它不知道后者的私有密钥。不过,现在密码只用作认证,数据本身还是没有加密的。
NFS的实现
客户与服务器的实现与 NFS协议之间是独立的,它包含三层。
顶层是系统调用层。它负责处理象 OPEN、
READ,CLOSE这样的系统调用。在分析完调用和所带的参数后,它进激发第二层,虚拟文件系统层 (VFS)。
NFS的实现
VFS层的任务是维护一个打开文件表,
类似于 UNIX中的打开文件的 I节点表。
在 UNIX中,一个 I节点用一个 (设备,I节点号 )对唯一标识。 VFS中打开文件表的表项称为 V节点 (虚拟 I节点 ),每个打开的文件都对应有一个 V节点。 V节点用于指明文件是本地的还是远程的。对于远程的文件,还记录了足够的信息以便访问它们。
NFS的实现
例子:一个调用 MOUNT,OPEN、和 READ
的序列。要 mount一个远程文件系统时,系统管理员调用 mount程序,指明远程的目录名,
将要 mount到的本地目录位置,以及其他信息。
Mount程序分析远程目录的名字,从中提取它所在的机器名,然后与该机器联系。如果该目录存在,并且可以被远程 mount,服务器就返回该目录的文件指针。最后 mount程序调用
mount系统调用,将文件指针传给内核。
NFS的实现
接着内核为远程目录建立一个 V节点,并让 NFS客户代码在它内部创建一个 R节点
(远程 I节点 )存放这个文件指针。 V节点指向 R节点。这样 VFS层中的每个 V节点要么存放了指向 NFS客户代码中 R节点的指针,要么存放了指向本地操作系统中 I
节点的指针。从该 V节点可知一个文件或目录是本地的或是远程的。如果是远程的,它能知道该文件的文件指针。
NFS的分层结构系统调用层虚拟文件系统层本地操作系统 NFS客户发送消息给服务器本地硬盘虚拟文件系统层
NFS服务器来自客户的消息本地操作系统本地硬盘
NFS的实现
当一个远程文件被打开时,内核先分析该文件的文件名,得到它所在的远程文件系统所被
mount到的本地目录名。它看到该目录是远程目录,并且通过 V节点表找到该目录所对应的
R节点的指针。它接着就让 NFS客户代码去打开这个远程文件。 NFS客户代码请求相应的服务器查看该文件,并返回该文件的指针。客户代码接着在自己的内部表中为该远程文件添加一个 R节点,并将结果返回给 VFS层。 VFS层在 V节点表中为该远程文件构造一个 V节点,
存放指向 R节点的指针。这里,我们又看到每个打开的文件或目录都有一个 V节点,它指向一个 R节点或一个 I节点。
NFS的实现
调用者能得到远程文件的文件描述符。这个描述符通过在 VFS层的 V节点表映射到相应的 V
节点。请注意,在服务器端是不存在对客户打开文件的记录。尽管当接到请求时,服务器需要提供文件指针,但它不保存哪些文件被客户打开 (在客户端有它的文件指针 )。当一个文件指针发给服务器用于访问文件时,服务器只是检查该指针是否有效,有效的话,就使用它去访问文件。如果要求安全检查时,服务器会确认在 RPC头中的认证密钥是否有效。
NFS的实现
当文件描述符用于随后的系统调用时,
例如 READ调用,VFS层将找到相应的 V
节点,由此判定它是在本地还是在远程,
是用 I节点还是用 R节点描述。
NFS的实现提高性能的技术( 1)
客户与服务器之间传输的是大粒度的数据,通常是 8192个字节。
客户端的 VFS层得到 8K数据后,它会自动请求读下一个 8K数据块,这样,当它需要该数据块时,数据已经到达了。这种技术称为预取,它在一定程度上能改善性能。
NFS的实现
对于写也采取了类似的策略。
当一个写操作写的数据少于 8K时,数据先在本地积累下来。只有当数据积累到 8K
时,才真正发送给服务器。当文件关闭时,所有的数据被立即发送给服务器。
NFS的实现提高性能的技术( 2)
caching(高速缓存)
服务器缓存数据可以减少磁盘访问次数,
而这对客户是透明的。客户维护两类高速缓存,一类是针对文件属性 (I节点 )的,
另一类是针对文件数据的。当需要 I节点或文件数据块时,首先检查它们是否在客户的高速缓存中,如果在,就不需要网络传输了。
NFS的实现
尽管高速缓存能显著地改善性能,它也引入了非常讨厌的问题。假设两个客户都缓存了同一个文件数据块,其中的一个更新该数据块后,
另一个客户随后读该数据块时,得到的将是老的数据块。这时出现了高速缓存的不一致性。
介绍多处理机时也遇到了同样的问题。但在多处理机中可以通过让高速缓存监听总线来解决,
而这里却不可能这样做。因为更新位于客户高速缓存中的文件块不会产生任何的网络通讯,
即便是产生网络通讯,现有的硬件也无法监听所有的网络通讯。
NFS的实现
考虑到这个问题的严重性,在 NFS的实现中通常采取若干办法来减轻它的不利影响。一个办法是给每个高速缓存块附加一个计时器。当计时器超时时,丢弃该缓存块。通常数据块的超时是 3秒,目录块的超时是 30秒。这样作可以缓和问题。另外,当一个被高速缓存的文件打开时,客户会发一条消息给服务器,看该文件最近一次被修改的时间。如果修改发生在缓存之后,缓存块将被丢弃,客户重新从服务器读取新的拷贝。最后,每隔 30秒,时钟都会超时,
所有的 dirty缓存块 (修改过的块 )都将被写回服务器。
NFS的实现
NFS因为没有严格地实现 UNIX的语义而受到广泛地批评。一个客户对某个文件的写操作能否影响到随后另一个客户对同一个文件的读操作,是与时间相关的。
而且,一个文件被创建后,外界可能要等到 30秒后才知道。还存在其它类似的问题。
NFS的实现
尽管 NFS提供了共享文件系统,它的效果就象一个打了补丁的 UNIX,它没有完全定义好文件访问的语义。一群合作的程序运行的结果与时间相关。另外,NFS只涉及到文件系统,其它诸如进程这样重要的问题都没有涉及。尽管如此,NFS还是得到广泛的使用。
NFS是运行在松耦合硬件上的松耦合软件