分散数据处理系统中顾客对文件的扩充的制作方法

文档序号:6405842阅读:146来源:国知局
专利名称:分散数据处理系统中顾客对文件的扩充的制作方法
技术领域
本发明涉及通过网络相连接的处理系统。更具体地涉及网络内的本地与远程处理系统之间的文件修改。
相关申请的交叉参照申请号07/014,897“在一个分布式网络环境中访问远程文件的一个系统与方法”,1987年2月13日以茌生(Johnson)等人的名义提出,在此引入作为对比。
申请号(IBM内部记录号AT9-89-027)“在一个分散数据处理系统中文件属性的维护”,1989年5月15日以茌生(Johnson)等人的名义提出,在此引入作为对比。
申请号(IBM内部记录号AT9-89-030)“在一个分散数据处理系统中的远程认证与授权”,1989年5月15日以茌生(Johnson)等人的名义提出,在此引入作为对比。
申请号(IBM内部记录号AT9-89-034)“分散数据处理系统中认证服务的一种灵活接口”,1989年5月15日以罗克斯(Loucks)等人的名义提出,在此引入作为对比。
申请号(IBM内部记录号AT9-89-037)“分散数据处理系统中文件加锁管理”,1989年5月15日以D.W。茌生(Johnson)等人的名义提出,在此引入作为对比。
申请号(IBM内部记录号AT9-89-036)“分散数据处理系统中有效控制高速缓冲存储数据的系统与方法”,1989年5月15日以D.W.茌生(Johnson)等人的名义提出,在此引入作为对比。
本专利文件的部分公开包含受版权保护的材料,版权所有人不反对任何人以专利与商标局专利文件或记录的原样对该专利文件或专利公开进行影印复制,除此而外,保留一切版权。


图1所示,一个分布式网络环境1包含通过通信链路或一个网络3相连的两个或更多的节点A、B、C。网络3可以是一个局部网络(LAN)或者一个广域网络(WAN)。
在节点A、B、C中任何一个上可以有一个处理系统10A、10B、10C,例如一个工作站。各处理系统10A、10B、10C可以是具有使用网络3去访问位于一个远程节点上的文件的能力的一个单用户系统或多用户系统。例如,在本地节点A上的处理系统10A能够访问分别在远程节点B、C上的文件5B、5C。
在本文件中,“服务器”一词将用于表示文件永久性地存储在的处理系统,而“顾客”一词将用于表示任何具有访问该文件的进程的其它处理系统。然而,必须理解的是,“服务器”一词並不是某些局部网络系统中使用该词所指的专用服务器。本发明在其中所实现的分散服务系统是真正的一个支持在系统中不同节点上运行各种各样应用程序的分散系统,这些节点可以访问位于系统中任何地点的文件。
如上文所述,以后所讨论的本发明是指向通信网络中的一个分散数据处理系统。在这一环境中,网络中一个节点上的各处理器有可能访问网络中的所有文件不论这些文件位于什么节点。
已知有其它支持分散数据处理系统的方案。例如,在申请号014,897“在一个分布式网络环境中访问远程文件的系统与方法”中所公开的用于AIX操作系统的IBM的分散服务,该专利以茌生等名义在1987年2月13日提出申请。此外,SunMicrosystems(Sun微系统)发布了网络文件系统(NFS),以及贝尔实验室研制了远程文件系统(RFS)。在一系列出版物中描述了Sun微系统NFS,其中包括S.R克利曼的“V节点SunUNIX中多文件系统类型的一种体系结构”,会议报告汇编,USENIX1986夏季技术会议与展示,238至247页;罗塞尔.山勃格等“Sun网络文件系统的设计与实现”,会议报告汇编,USENIX1985,119至130页;邓.华尔西等,“Sun网络文件系统的概述”,117至127页;张觉美,对NFS提供网络封锁服务的状态监控”,张觉美,“SunNet(Sun网)”71至75页;以及布雷特兰.泰勒,“Sun环境中的可靠联网”,28至36页。在一系列出版物中也描述了ATLT(美国电话与电报公司)RFS,其中包括安德鲁P.里夫金等,“RFS体系结构概述”,USENIX会议报告汇编,亚特兰大,治亚(1986年6月),1至12页;里查德.汉弥尔顿等,“管理人员眼中的远程文件共亨”,1至9页;姆。霍软等,“文件系统转换”,1至2页;以及大卫丁.奥兰特等,“在系统V中联网的一种框架”,1至8页。
将本主题发明在其中实现的分散服务系统区别于Sun微系统NFS的特性是Sun的方案所设计的基本上是无状态的服务器。这意味着服务器並不存储任何有关顾客节点的信息,包括诸如哪些顾客节点打开了一个服务器文件或者顾客进程是否以只读或读写方式打开一个文件。这样一种实现简化了服务器的设计,因为服务器不需要处理当一个顾客出现故障或脱机而没有及时通知服务器它正释放它对服务器资源的权利要求而引起的错误复原情况。
在本发明在其中所实现分散服务系统的设计中采用了完全不同的方案。更具体地说,本分散服务系统可表征为一个“有状态的实现”。这里所描述的一种“有状态的“服务器保存有关谁在使用其文件及这些文件正在如何被使用的信息。这便要求服务器有某种方法来检测与一个顾客的失去联系从而能将有关该顾客的累积状态信息丢弃。这里所描述的高速缓冲存储器管理策略除非服务器保存这些状态信息是不能实现的。
可以先通过审视一个独立系统如何访问文件来更好地了解在访问远程节点中所遇到的问题。
在一个独立系统中,例如图2中所示的10,在永久性存储器2(例如工作站中的一个硬文件或磁盘)与用户地址空间14之间的数据传送是用操作系统11中的一个本地缓冲器12来缓冲存储的。操作系统11中的本地缓冲器12也称作本地高速缓冲存储器或核心缓冲器。
在独立系统中,核心缓冲器12被分成以设备号及该设备中的逻辑块号标识的块15。在发布一个读系统调用16时,与其同时发布一个文件5的文件描述符及文件5中的一个字节范围,如图3中步骤101中所示。操作系统11取得这一信息並将其转换成设备号与该设备中的逻辑块号,如图3中步骤103所示。若该块在高速缓冲存储器中(步骤105)。在高速缓冲存储器中並没有在步骤103所寻找的块的情况中,则在前进至从高速缓冲存储器中获得数据的步骤105之前,先在步骤104将数据读入高速缓冲存储器中。
从磁盘2读入的任何数据都保存在高速缓冲存储器块15之中直到该高速缓冲存储器块需要用于其它目的。从而,任何来自在处理系统10上运行的一个应用程序4的对于以前读取的相同数据的接连的读请求都是从高速缓冲存储器12而不是磁盘2上读取的。从高速缓冲存储器上读取运比从磁盘上读取节省时间。
同样,从应用程序4写入的数据並不立即存在磁盘2上而是写入高速缓冲存储器12中。如果另一次写操作也是发布到同一块的,这便节省了磁盘访问。在高速缓冲存储器12中被修改过的块周期性地存在磁盘2上。
在使用AIX操作系统的一个独立系统采用高速缓冲存储器提高系统的总体性能,由于对接连的读与写消除了磁盘访问。因为访问永久性存储器比访问高速缓冲存储器更慢更贵,所以总体性能得以增进。
在一个分布式环境中,如图1所示,在本地节点C上的处理系统10C有两种方法可以从节点A读文件5A。一种方法是处理系统10C将整个文件5A进行复制,然后如同它是位于节点C的一个本地文件5C那样去读它。以这一方法读一个文件导致这样一个问题,如果在另一节点A上的另一处理系统10A在文件5A已经被作为文件5C复制到节点C以后修改文件5A。处理系统10C便不能访问对文件5A的这些最新的修改。
处理系统10C访问在节点A上的一个文件5A的另一种方法是当节点C上的处理系统需要某一块时每次只读入一块,例如N1。这种方法的一个问题是每读一次必须跨越网络通信链路3到达文件所在的节点A。为每一次接连的读取发送数据是费时的。
跨越网络访问文件提出了上述两个挑战性的问题。一个问题涉及为接连的读和写跨越网络传输数据所需的时间。另一方面,如果为了减少网络通信量而将文件数据存储在节点上,则可能失掉文件的完整性。例如,如果若干节点中的一个也写入该文件,则正在访问该文件的其它节点所访问的可能不是刚写入的最近更新的数据。这样,由于一个节点可能访问不正确和过时了的文件而失去文件的完整性。
在以UNIX操作系统为基础的操作系统中,没有必要写入到文件中的每一个字节。例如,如果一个文件是10,000字节,一个进程可以写入一个文件的第一字节及该文件的第10,000个字节,而不写入任何其它的字节。如果企图读取第10,001号字节,这便超出了文件的结尾,而不能读取。然而,如果企图读取的是第2至第9999字节,它们並没有超出文件的结尾。中间的这些字节从未写入过,而且磁盘块也从未分配给它们过。这是基于UNIX操作系统的文件系统的一个优点。这些文件系统並不分配块给未曾写入的字节。然而,如果一个进程企图读取这些字节,由于它们並未超过该文件的结尾,该进程所得回的为逻辑零的字节。
所以,在本发明的较佳实施例中,一个进程在能够写入字节以前,它必须在一个get-bytrs(取字节)请求中请求这些字节。例如,假定一个进程要写入一个字节。虽然该进程可以只请求所要写入的这一字节或不同范围的字节,该进程也可以请求4K范围的字节。一旦该进程接收到这一范围的字节,它便可写入在接收到的字节范围内的那些字节中的只一个字节。在本例中使用了4K范围的字节,因为一个顾客数据处理系统在一页的级别基础上管理其数据,一页大约为4K字节。
然而,写入的最常见情况是当一个进程写入一个没有数据存在的新文件。在这一情况中,一个进程从新文件的开头开始写一直写到文件的结尾。所以,一个进程经常写入一个文件中以前並不存在的部分。在以前的系统中,在能够进行这种写入以前,在顾客处理系统中运行的一个进程必须跨越网络並申请一整页字节。一旦该字节已经写入后,可以申请下一页字节。然而,这造成在顾客数据处理系统与服务器数据处理系统之间大量的网络通信量,其目的只是为了取得一块含有逻辑零的字节。
在一个分散数据处理系统中,数据能被多个节点访问。在本发明中,数据被这一数据处理系统中称作服务器的一个节点所控制。访问该数据的其它节点称作顾客。顾客向服务器发送一个请求以得到对数据的访问。服务器将该数据返回给请求访问数据的顾客。该顾客便可以读与/或修改所请求的数据。当多个顾客对该数据有兴趣时,服务器节点必须对数据的访问进行同步使之保持一致。服务器节点以下述方法做到这一点在任何给定的时间,保证一个节点能够进行修改访问的各部分数据不得被任何其它节点进行读或修改访问,而允许只能进行读访问的数据部分可以被任何数目的节点所访问。
为了执行这一同步性,要求写入一个文件的某些部分或扩充一个文件的顾客必须首先向服务器请求对包括所要修改的那些字节在内的一个范围的字节的写访问,顾客通过一个对服务器的get,bytes(取字节)报文请求一个范围的字节。服务器则以所请求的字节答复这一请求。然后,顾客便可以修改这些字节了。然而,在某些情况中,如果一位不同的顾客提出了一个互相冲突的请求,为了同步若干个顾客对该范围字节的访问,服务器可能有必要收回早先已经分配给一个顾客的数据。服务器通过从服务器发往顾客的一个revoke-bytes(收回字节)报文收回一个范围的字节。
虽然大多数对文件的写入是在文件的结尾处新分配的只包含零的各个新块上进行的,但在更广义的情况中,当一个进程写或存入一个远程文件的一个块中时,在可以进行写或存入以前块必须从文件服务器得来。为了减轻常用机制的费用,本发明优化了一个重要的特殊情况写或存入早先不在文件中的块。这样便减少了在已存在的文件后面增加新块和建立新文件的费用。
如果一个顾客知道文件中的一个块是一个新块,尚不在文件中的一个块,他便能建立一个全零的块并使用它而不接触服务器。这便可省去一次取字节(get-bytes)请求的费用,但这也可能在一个顾客处建立一个块而在文件的服务器上並未分配一个对应的磁盘块。为了避免顾客超负荷使用服务器资源以及由于在两处建立同一个块而相互干扰,服务器维护分配新的页的控制。
服务器除了发送实际字节以外也向顾客发送新生的零以管理新文件块的分布式分配。当一个服务器回答一个get-bytes请求时,它可以选择性地返回一个未经请求的范围的新生零。新生零是新的逻辑零的字节,它们尚未包含在文件之中。所返回的新生零的范围一般大于所请求的字节的范围。新生零是从未存储或写入过的,並且可能在文件的当前范围之外。和来自文件的实际字节一样,一个范围的新生零被发送给一个顾客只有当没有其它顾客具有任何复盖该范围的数据(实际的或新生的)时才能对它们进行写入。和实际字节一样,新生零可以被服务器用一则收回(reroke-bytes)报文收回。
本发明允许一个进程每二次向服务器数据处理系统请求字节时,该服务器不但送回所请求的字节,并且服务器也可以送回包含从未写入过数据的一个额外范围的字节。这种数据在这里将被称作新生零。当服务器判定顾客可能要写入这些额外字节时,它便送回这一额外范围的字节。该服务器给该顾客以写入这一较顾客原来请求的更大范围的字节的许可。
这一点很重要是服务器管理这一额外范围的字节而不是顾客可以自作主张地写入一个早先从末写入过的范围的字节。由于服务器具有对可利用的物理存储器容量的控制,服务器是给予顾客写入这一额外范围的字节的许可者这一点是重要的。服务器必须保证当文件被关闭与数据被返回时,服务器有足够的空间来存储这些额外的数据,所以,在服务器向一个顾客给出一个范围的新生零时,它必须肯定如果顾客决定写入这一额外范围时,已经为它保留了磁盘空间。
然而,一个顾客可以决定不写入这一额外范围。在这一情况中,服务器仍然保留磁盘空间。服务器在顾客关闭该文件时确定是否已经写入了这一额外范围的字节的。如果顾客末普写入这一额外范围的新生零,该服务器可以释放这一磁盘空间。服务器只在顾客有可能写入这些字节时保持该磁盘空间。
与本发明的较佳实施例相连,服务器可能有必要收回早先已经给予一个顾客的新生零范围的字节,这是由于另一个顾客可能请求这一额外范围的字节。所以,服务器不但能收回顾客请求的范围的字节,也能收回它给予顾客的额外范围的新生零字节,即使顾客并未专门请求它们。
本发明的某些优点如下。一个服务器不但可以返回正好在一个文件结尾处开始的一个范围的新生零,而且可以返回文件中间早先曾写入的过的任何范围的字节。例如,一个顾客可以请求在文件中间的一个范围的字节。如果服务器确定存在着一个范围的新生零邻接于顾客正在请求的该范围,服务器也有权迭将这一额外范围的新生零给于顾客。
另一个优点示出在下述例子中。一个顾客可能请求表示文件最后一块的一个范围的字节。服务器返回的可能不止这一最后一块字节,而还有任何数目的额外页的新生零。为了示例的目的,假定服务器返回了4个额外的页。当顾客写完了这一最后一块字节与额外的四页新生零以后,该顾客可回到服务器並请求另一块字节。然后,服务器可以返回给顾客不止他所请求的下一块字节,而同样还有额外的四页新生零。在这一情况中,由于顾客每5次请求字节块回到服务器一次而不是每一块回到服务器一次,从而减少了网络通信量。
作为本发明的成果,扩充一个文件时不需要特定的协议。服务器以向顾客提供额外范围的新生零来自动地完成文件扩充。对于每一次get-bytes请求,服务器可以选择返回额外范围的新生零的字节。
根据协议的这一特点,一个服务器並不需要返回新生零。所以在设计这一处理请求新生零的协议时不需要额外的报文。因此,服务器没有必要拘泥于要求返回新生零的协议。所以,设计成返回新生零的一个服务器仍然可以在其它服务器不是设计为可以有选择地返回新生零的一个分散数据处理系统中工作。同样,一个顾客也並不是非使用返回的新生零不可。一个顾客有权选择不使用这一额外范围的新生零而每次需要一个范围的字节都回到该服务器。所以,知道这些返回的新生零並能够对它们进行写入的一个顾客与不知道这一额外范围的新生零的其他顾客可以在同一个分散数据处理系统中工作。以这种方式,高性能的服务器仍然能在一个分散数据处理系统中与低功能顾客进行通信,反之亦然。这便消除了对服务器与顾客之间在进行通信时需要什么级上的支持进行协商的要求。
不是由顾客决定他所请求的需要量与服务器响应这一请求,而是由服务器作出决定是否要把这些额外范围的新生零字节交给顾客。例如,如果若干顾客正在写入文件的结尾处,服务器可能认为revoke-bytes报文通信量太高了。在这种情况下,服务器可以决定不给出额外范围的新生零。此外,服务器可能确定磁盘已接近其容量。在这一情况下,服务器可以决定不再给出任何新生零范围以节省磁盘上的空间。反之,如果磁盘上剩有大量空间,服务器能够向顾客提供大范围的新生零而不致构成某些顾客会没有足够磁盘空间的危险。
附图的简要说明图1是本技术中已知的分散数据处理系统的方框图。
图2是表示本技术中用于通过系统调用访问一个文件的一个独立数据处理系统的方框图。
图3是图2中通过系统调用访问一个文件的数据处理系统的流程图。
图4A为通知服务器对文件进行一个关闭操作的一则Close(关闭)报文的数据结构。
图4B为从一个文件请求数据字节的一则glf-bytes(取字节)报文的数据结构。
图4C为从顾客数据处理系统向服务器数据处理系统送回经过修改的字节的Put-bytes(置字节)报文的数据结构。
图4D为收回先前答复一则get-bytes报文而送出的字节的revoke-bytes(收回字节)报文的数据结构。
图5示出本发明的分散数据处理系统中的一个顾客数据处理系统与一个服务器数据处理系统。
图6为表示二个顾客与一个服务器之间的节点间报文流的一个流程图用于展示在响应来自顾客的通过get-bytes、revoke-bytes、与Put-bytes请求访问文件中的字节时服务器的操作。
图7A为示出在一个服务器上对get-bytes请求的操作的一个流程7B为展示响应访问一个文件中的字节的一个请求选择发送给一个顾客新生零的一个流程图。
较佳实施例的说明在一个分散数据处理系统中,存在着可以访问共享数据的多个节点。本发明以这一分散数据处理系统中的多个节点管理对文件的访问。该文件是物理上存储在一个称作服务器的节点上的。服务器是长期存储该文件的处理系统。以一个通信网络连接到该服务器的其它节点也能访问这一文件。在这些情况中这些节点称为顾客。任何节点对某些文件可以是一个服务器,而对其它文件则为一个顾客。一个节点可以同时以两种能力工作;作为顾客访问远程文件而作为服务器向其它节点提供服务。
一个节点作为一个顾客的操作与该节点作为一个服务器的操作是互相独立的。所以,这两种操作将分开说明,尽管这两种操作有可能并发发生。
参照图4A-4D,对这里所使用的节点间报文进行说明。
图4A示出了顾客用于通知服务器进行关闭操作的关闭报文410。修改计数411是反映顾客处修改的一个值。访问计数412是反映顾客处访问的一个值。
图4B示出向一个文件请求数据字节的get-bytes报文440。位移量441是标记所请求的数据的起始位置的文件中的位移量。长度442是所请求的字节数。读/写标志443用于表示该顾客正在请求数据的一份只读付本或者数据的一份可写付本。如果顾客只从字节范围中读取,则rw-flag(读/写标志)的允许值为0×0000,如果顾客可以修改该字节则为0×0001。服务器只只有当用户以相客的方式早先已打开而尚未关闭该文件时才执行该get-bytes操作。如果rw-flag443为只读,则顾客必须已将文件打开。如果rw-flag443为读写,则顾客必须将文件打开用于写入。
在对get-bytes报文440的答复中,nz-offsef(新生位移量)444为所请求字节而有新生零的文件中的位移量。只有当域nz-lengfh(新生零长度)大于零时nz-offset域才有意义。域nz-lengfh445为服务器选定返回给请求者的起始于位移量nz-offsef444的新生零字节数。服务器可以永远选择不进行任何新生零处理以在此域中返回零来表明这一点。Lengfh(长度)446是返回的数据的长度。Dafa(数据)447是所请求的实际数据字节。
图4C示出了Put-byfes报文460。顾客以Puf-byfes报文460将经过修改的数据返回给服务器。服务器只对顾客早先已经打开而尚未关闭的用于写入的文件执行Puf-bytes操作。offsef(位移量)461是长度462的数据字节463应当放置的在文件中的位移量。
图4D示出了revoke-byfes(收回字节)报文470。这一报文是文件服务器发送给一个顾客用于收回早先答复一则get-byfes报文440而给于该顾客的字节。该顾客在没有抛弃所有干净(未改动)的高速缓冲存储器中的数据及新生零並将所有脏(改动过)的数据写入服务器和收到答复以前,並不为由位移量471与长度472所指明的字节范围发送答复。当顾客发送答复时,在收回的字节范围内必须已经没有高速缓冲存储的数据。这一报文收回顾客使用落在该收回范围内的任何早先返回的新生零的权利。在一个revoke-byfes请求被处理时未付的所有收回字节范围内的数据或新生零在它们到达时都必须抛弃,这一收回的字节范围是从get-bytes请求返回的。顾客可以选择收回一个比所请求的更大的字节范围,或者他可以确定在比所请求的范围更大的范围内没有什么可以收回的。在这些情况中,reply-offset(答复位移量)473与reply-length(答复长度)474指明该顾客没有高速缓冲存储页的一个范围。答复位移量473与答复长度474必须至少包括由位移量471与长度472所指明的范围。
结合图4A-4D参照图6,当一个顾客要求访问一个文件中的数据时,该用户向文件服务器发送一则称为get-bytes请求或报文的请求,步骤601,602。一则get-bytes请求除了其它项目以外,还指定这一顾客有兴趣访问的字节范围441,442(图4B)。get-byfes请求440是顾客向服务器发送的。毕备就绪时,该服务器将在这一范围内的数据送回给提出请求的顾客作为对这一get-bytes请求的答复,步骤603,604。这一get-bytes答复使顾客能够访问这些数据。
当一个服务器在前面已经满足了一个get-bytes请求,步骤603,以后又到达了一个get-bytes请求440,步骤605,606,的情况下,服务器可能有必要收回早先已发送给其它顾客的字节,步骤607。字节是以一则revoke-bytes报文470收回的,图4D。Revoke-bytes报文470是由服务器发送到顾客机器的。顾客必须以送回在被收回的字节范围内任何被改变了的数据以响应一则revoke-bytes请求。顾客也必须抛弃这一范围内的任何未曾改变的数据。
顾客用Put-bytes报文460,图4C,将修改过的数据送回给服务器,步骤609,图6。和get-bytes报文及revoke-bytes报文一样,这一报文有一则由接收者送回发送者的答复,步骤611。在所有这三种情况中的答复都是通知发送者他所指定的接收者已经收到了报文並对之进行操作。注意,在答复get-bytes请求中的数据447,图4B,实际上从服务器转移到顾客,而在Put-bytes报文中,463,图4C则是从顾客转移到服务器。
一种一个服务器必须发出一则revoke-bytes请求的情况,步骤607,发生在来自一个顾客的一则要求写访问这一范围的字节的get-bytes请求到达一个服务器时,步骤606。该服务器必须收回在这一范围内的早先已发送给顾客而尚未收回的所有字节。一个顾客每次发出一则get-bytes请求,服务器保存它已经发给这一顾客的get-bytes答复(图5)的一个记录。以这种方法,服务器能够记载属于一个文件的已经给出给顾客节点的所有数据付本。当来自顾客的一则请求写入这些字节的get-bytes请求到达时,服务器检查它的记录确认当前没有其他顾客提取这些相同的字节在读或写。如果有其他顾客提取这些字节,服务器首先向提取这些字节的这些顾客中的每一个发送一则revoke-bytes报文来收回这些字节。在这些字节可能已被修改的情况下,这些顾客用Put-bytes报文将这些字节送回给服务器,而对没有被修改过的字节则顾客们将它们抛弃。然而,在所有情况中,字节已经被收回后,顾客不再对这些字节有访问权了。在接收到Pnt-bytes答复以后,步骤612,顾客便得知返回的数据已被服务器收到,然后该顾客答复该revoke-bytes请求,步骤613。
当服务器接收到revoke-bytes答复时,步骤614,(在接收到由收回所触发的任何Put-bytes报文之后),现在服务器可以在get-bytes答复中将这些字节送给提出请求的顾客以响应写入的get-bytes请求了,给该顾客修改这些字节的许可,步骤615,616。这样,一个文件中的数据上在一个地方被修改。如果该数据正在被修改,没有其他顾客能访问这一范围的数据。这便保证了在顾客重新得到对这些数据的访问权利,这些顾客将见到所有接连的写操作结束后的数据。这提供了串行地访问数据的效果。
重要的规定是对于文件中的任何字节,只有一台机器能够对这一字节进行写,而任何数量的机器可以提取该字节用于读。在本较佳实施例中,字节不是在单个的基础上被跟踪的。反之,所跟踪的是被顾客所请求的字节范围。在本较佳实施例中,对于任何范围的字节只有一个顾客能够用写访问访问该范围的字节。
本发明的系统与方法控制机器怎样可以高效地扩充文件及写入文件中原先没有数据的区域。所希望的是最小化在顾客与服务器之间的报文往返次数。最小化一个顾客超额使用服务器所管理的磁盘空间的可能性也是所希望的。
虽然绝大多数对文件的写入是在文件的结尾处新分配的並只含零的字节的各新块上进行的,在最普遍的情况中,当一个进程写或存储进一个远程文件的一块中时,在能够进行写或存储以前该块必须从文件服务器得来。为了减轻这一普遍机制的费用,本发明优化了一个重要的特殊情况写或存储进原先不在文件中的块中。这减少了附加在已有文件的后面及建立新文件的费用。
如果一个顾客知道文件中的一块是一个新的块,文件中还不存在的一个块,他可以不接触服务器而建立一个全零的块並使用该块。这可以避免一则get-bytes请求的费用,但这也可能造成在一个顾客处建立一个块而並没有在文件服务器上分配一个对应的磁盘块。为了不使顾客超量使用服务器资源及防止由于在两处建立同一块而互相干扰,服务器维护对新页分配的控制。
服务器以发送附加在实际字节上的新生零给顾客来管理新文件块的分布式分配。当一个服务器答复一则get-byes请求时,它可以有选择地返回一个未曾请求的范围的新生零。新生零是新的,逻辑上为零的字节,这些字节尚未包含在文件中。返回的新生零的范围通常大于所请求的字节的范围。新生零是从未存储或写入过的,並可以超出文件的当前范围。和来自文件的实际字节一样,只有当没有其它顾客的任何数据(实际的或新生的)复盖该范围时,才能将一个范围的新生零发送给顾客而使顾客可以写入这些新生零中。和实际字节一样,新生零可以被服务器用revoke-bytes报文收回。
顾客机器从不明显地请求新生零。反之,只有当服务器答复一则get-bytes请求时,顾客才能从服务器接收未曾请求的新生零。这意味着服务器並不一定非返回新生零给顾客不可;一种简单的服务器实现可以正确地进行工作而从来不给出新生零。然而,这样一种实现将不如一种使用新生零的实现那样高效地支持顾客。当新生零被分配给顾客构器时,它们必须像已经给出的实际字节那样受到跟踪。如果一个顾客请求的一个范围的字节复盖已经以互相冲突的方式(即,读访问对写访问)给予另一顾客的实际字节或者新生零,则服务器必须收回实际字节以及新生零。由于revoke-bytes请求收回一个指定范围内的实际字节以及新生零,服务器只须向每一持有该字节或零的顾客发送一则报文即可。服务器能够简单地从具有一个文件中的任何实际字节或新生零的各顾客收回该文件的所有字节和新生零来统计已经给出的字节和零。一个服务器只须记住哪些顾客有任何字节或零而无须关心已经把哪些字节和新生零给了什么顾客来完成这一工作。更精巧的服务器能以更精细的份量来为字节和新生零保管信息从而在它们的顾客中支持更高的并发性。
参照图5,顾客501通过通信链路514向服务器502送一个取字节请求,请求存储在服务器的磁盘512上的一个文件513以便从该文件中获得字节並将它们放置在顾客的高速缓冲存储器503中。在服务器上处理该get-bytes请求时查阅顾客清单515。顾客清单是以查阅该文件的内节点(inode)结构504来定位的。每一个使用中的文件都会有一个内节点结构。正在被顾客机器使用的文件的内节点结构包含一个链接即指针505指向该文件的顾客清单515的起始位置。这一指针指向第一顾客清单入口508,而该入口依次又可能包含一个指针506指向顾客清单上的下一个入口。顾客清单上的最后一个入口包含一个空值的指针507表示该顾客清单上没有更多入口了。每一个入口508有三个部分。第一部分509标识该远程顾客节点。第二部分510标识已经发送给该顾客而尚未收回的所有字节范围以及指明这些字节范围中的每一个是否已经授予该顾客修改该范围的许可的一个标志。同样,部分511标识已经给予该顾客的所有范围的新生零。每一个使用该文件的远程顾客在顾客清单上都有一个入口508。
参见图7A,在服务器上的一则get-bytes请求的处理开始于步骤701。在步骤702,查阅顾客清单並定位顾客清单上的第一个入口。如果这一当前顾客清单入口便是get-bytes请求中请求字节的同一顾客的入口,则对顾客清单中这一入口的进一步处理是没有必要的,下一步便执行步骤710。否则,在步骤704继续进行处理,在该步骤中检验当前get-bytes请求的性质。如果所请求的是对它们进行修改的许可,则在步骤705处继续处理。否则,在步骤706继续处理,在该步骤中检验当前顾客清单入口。如果该顾客清单入口表示该入口的顾客在当前取字节请求的范围内接收到过许可入或新生零的字节,则处理继续到步骤707。否则,对这一顾客清单入口没有进一步处理的必要而处理继续到步骤710。在步骤705中,检验当前顾客清单入口,如果在所请求的字节范围内有已经发送给该入口的顾客而尚未收回的任何字节,则处理维续到步骤707。否则,这一入口没有必要进行进一步的处理,而以步骤710继续处理。在步骤707,这是在必须从顾客清单入口中指明的顾客收回字节的情况中到达这一步骤的,将一则revoke-bytes报文发送给当前清单入口中指明的顾客收回对应于get-bytes请求中所请求的一个范围的字节。处理继续到步骤708,在该步骤中等待对revoke-bytes报文的答复。在步骤709,更新顾客清单入口以反映该范围的字节被收回这一事实。然后处理继续步骤710。在步骤710,对该顾客清单入口进行检验以确定它是否是该顾客清单中最后一个入口。如果不是,则在步骤711,该顾客清单中的下一个入口成为当前入口而处理继续到步骤703。在步骤710,如果该当前入口是该顾客清单中的最后一个入口,处理在步骤712继续进行,在该步骤中选择一个范围的新生零毕备与这一取字节请求的答复一起返回。毕备返回的新生零的选择的进一步细节见于图7B。处理在步骤713中继续进行,在该步骤中提出请求的顾客的顾客清单入口被更新以反映将要送给该顾客的新生零。在步骤714,更新该入口以反映在get-bytes答复中在步骤715中实际返回的字节范围,在步骤716中结束get-bytes请求的处理。
上述描述以下面的编程设计语言代码说明get_bytes(gb_client,gb_file,gb_range,gb_rw)--requestfromgb_client--forgb_rangebytes--ingb_file--gb_rw==trueiffrequestisformodifyBEGINFORentry=firstentryonclientlistforgb_fileTOlastentryinclientlistIFentry′sclientisnotgb_clientTHEN
IF(gb_rw==trueAND(entryhasabyterangethatintersectsgb_rangeORentryhasnascentzerosthatintersectgb_range))OR(gb_rw==falseAND(entryhasabyterangeformodifyintersectinggb_rangeORentryhasnascentzerosthatintesectgb_range))THENSENDrevoke_bytestoentry′sclientforgb_range;
AWAITrevoke_bytesreply;
clearentry′sbyterangeandnascentzerosforgb_range;
ENDIFENDIFENDFOR--allrevokingdone,nowanswerrequestCALLselect_nascent_zero_range;
recordnascenterosselectedinclientlistentryforgb_client;
recordgb_rangebyteswithgb_rwinclientlistentryforgb_client;
SENDreplytoget_bytesrequestwithselectednascentzeros;
ENDCopyrightIBMCorporation1989参见图7B,在步骤720中检验为之选择新生零的get-bytes请求。如果这一get-bytes请求是一则不带修改许可的字节请求,即,只请求字节的只读付本,则在步骤730继续进行处理,在该步骤中指明在步骤731中返回以前不选择新生零。否则,如果该请求是修改许可的,则在步骤721中作出一个决定是否对该文件必须进行一个高的收回率。如果是这样,则在步骤730继续处理,在该步骤中确定将不选择新生零。否则如果收回率并不太高,则在步骤723继续处理,在该步骤中检验磁盘上可利用的空间。如果磁盘空间太少,在步骤730继续处理不选择新生零。否则在步骤724检验该get-bytes请求。如果检验结果确定该get-bytes请求扩充该文件,而下面的16K字节未曾作为新生零分配,则在步骤727选择下面的16K字节作为要在这一get-bytes请求中返回的新生零。然后在步骤732中为这些新生零保留磁盘空间,並且处理在步骤731返回。如果在步骤724中确定这一get-bytes请求並不扩充该文件,则处理继续到步骤725。在步骤725中,检验该get-bytes请求。如果所请求的字节是该文件中的最后一块,且下面的8K字节尚未作为新生零分配,则在步骤728选择下面的8K字节处理继续到步骤732保留磁盘空间。如果在步骤725中确定该取字节请求所请求的不是该文件中的最后一块,则处理继续到步骤726,在该步骤中检验邻接于所请求的字节的块。如果在邻接于该请求范围的字节处找到未曾作为新生零分配的4K逻辑上的零的字节,则在步骤729选择这些字节,並在步骤732保留磁盘空间。确定该文件中的逻辑上的零的字节是否已作为新生零被分配可以通过检验顾客清单入口来完成。
下面的编程设计语言代码表示上文中的说明elect_nascent_zero_range()EGINIFgb_rw==falseORhighrevoke_bytetrafficforgb_fileORlowdiskspaceavailableforgb_fileTHENselected_rangeisempty;
RETURN;
ENDIF;
IFgb_rangeispastendoffileforgb_fileAND16Kbytespastgb_rangearelogicallyzeroAND16Kbytespastgb_rangearenotnascentzerosinanyclientlistentryforgb_fileTHENselected_rangeis16Kpastgb_range;
ELSEIFgb_rangeendsatendoffileforgb_fileAND8Kbytespastgb_rangearelogicallyzeroAND8Kbytespastgb_rangearenotnascentzerosinanyclientlistentryforgb_fileTHENselected_rangeis8Kpastgb_range;
ELSEIFgb_rangeisadjacenttoa4Kblockthatislogicallyzeroandisnotnascentzerosinanyclientlistentryforgb_fileTHENselected_rangeisthe4Kblock;
ELSEselected_rangeisempty;
RETURN;
ENDIFENDIFENDIFreservediskspaceforselected_range;
RETURNCopyrightIBMCorporation1989
如果一台顾客机器上的一个进程需要访问早先未曾向文件服务器请求的一个文件的字节,它可以使用从该文件的服务器上接收到的任何新生零。一个顾客存入或写入一个新生零将它转变成一个修改过的实际字节,最后象任何修改过的字节一样在一则Put-bytes报文中返回到服务器。服务器可以使用revoke-bytes强制顾客送回在请求范围内的所有修改过的字节,包括原先是实际的以及原先是新生零的;在该范围内的未曾修改过的实际字节与新生零被顾客简单地抛弃。如果再度使用新生零时必须重新获取。
新生零已经在服务器上保留了磁盘可以在不通知服务器的情况下由顾客安全地加在文件上。在服务器上,磁盘保留防止顾客超额使用服务器的磁盘空间。只有在字节返回到服务器时所保留的磁盘块才成为该文件的一部分。如果新生零未曾被一个顾客使用,它们不返回到服务器上面磁盘保留最终被归还。
顾客不必对文件服务器发送给他们的新生零进行跟踪。一种简单的顾客实现可以忽视新生零而仍然正确地操作。它将永不使用这些零从而永远无须将它们归还给服务器。这样的顾客在写入每一块以前都必须先请求它,即使对于超过文件结尾的新块也是一样,而这样的顾客在附加或写入新文件时就不能像得益于新生零的顾客那样高效。
当一个顾客关闭一个文件时,以Close(关闭)报文410通知服务器。在发送Close报文之前,顾客必须将该文件的所有修改过的数据发送给服务器。顾客以Put-bytes报文460来完成这一工作。服务器在收到该close请求时,可将该顾客从该文件的顾客清单中去掉,並重新利用记录在该顾客上的为新生零保留的任何磁盘空间。服务器能以另一种方式,即用revoke-bytes报文收回它们的方式,重新利用这些为新生零保留的磁盘空间。当对磁盘空间的需要超过计入这些新生零保留以后可以利用的水平时,服务器可以选择这一做法。顾客在使用被收回范围内的字节时,在回收新生零时要受到性能上的惩罚,因为需要发送额外的get-bytes报文。
虽然本发明是参照一个较佳实施例来具体展示和说明的,但不言而喻,熟悉这一技术的人可以在不脱离本发明的精神和范围下作出各种各样的形式上与细节上的改变。
权利要求
1.服务器数据处理系统中的一种方法,用于从至少一个顾客数据处理系统访问位于所述服务器数据系统的一个文件中的一个范围的字节,其中所述服务器数据处理系统与所述至少一个顾客数据处理系统通过一个通信装置相连接,其特征在于在对来自所述至少一个顾客数据处理系统之一的一个要求服务器执行一个操作的请求的答复中,照所述服务器数据处理系统所确定的,返回对文件中当前未使用的字节的一个范围的一个描述;以及授予该顾客数据处理系统使用该被描述的字节范围的许可。
2.根据权利要求1的一种方法,其特征在于在授予使用该被描述的范围的许可之前在所述服务器数据处理系统上保留物理存储器空间。
3.根据权利要求2的一种方法,其特征在于当所述顾客数据处理系统关闭该文件时,由该服务器数据处理系统判定是否该顾客数据处理系统已经写入过该被描述的字节范围,並且在该顾客数据处理系统未曾写入该被描述的字节范围的情况下,释放该被保留的物理存储器。
4.根据权利要求1的一种方法,其特征在于来自所述至少一个顾客数据处理系统之一的请求是用于获得在该文件中的一个请求字节范围进行写访问的操作的。
5.根据权利要求4的一种方法,其特征在于授予的对所描述的范围的使用是用于写入。
6.根据权利要求1的一种方法,其特征在于由该服务器数据处理系统收回使用该被描述的字节范围的许可。
7.在一个服务器数据处理系统中的一种方法,用于从至少一个顾客数据处理系统访问位于所述服务器数据处理系统上的一个文件中的一个字节范围,其中所述服务器数据处理系统与所述顾客数据处理系统是通过一个通信装置连接的;其特征在于按所述服务器数据处理系统的确定,以与所请求的字节范围一起返回一个逻辑上为零的额外的字节范围回来答复来自所述至少一个顾客数据处理系统之一的要求写访问该字节范围的一个请求,借此,给予该顾客数据处理系统写入较所请求的更大的字节范围的许可;以及当该顾客数据处理系统具有写入该额外字节范围时,在所述服务器数据处理系统上为所述额外字节范围保留物理存储器空间。
8.在一个服务器数据处理系统中的一种方法,用于从至少一个顾客数据处理系统访问位于所述服务器数据处理系统上的一个文件中的一个字节范围,其中所述服务器数据处理系统与所述顾客数据处理系统是通过一个通信装置连接的;其特征在于按所述服务器数据处理系统的确定,以与所请求的字节范围一起返回一个未曾请求的额外的未曾写入的零的字节范围来答复来自所述顾客数据处理系统之一的要求对该字节范围进行写访问的一则请求,借此给予该顾客数据处理系统写入比所请求的更大的一个字节范围的许可;以及为了控制来自所述顾客数据处理系统对该文件的访问,由该服务器数据处理系统收回对该顾客数据处理系统所请求的字节范围与额外的未曾请求的字节范围的写入的许可。
9.在一个服务器数据处理系统中的一种方法,用于从至少一个顾客数据处理系统访问位于所述服务器数据处理系统上的一个文件中的一个字节范围,其中所述服务器数据处理系统与所述顾客数据处理系统是通过一个通信装置连接的;其特征在于答复来自所述顾客数据处理系统之一的对表示所述文件的最后一块的该字节范围的写访问的一个请求,按照所述服务器数据处理系统的确定,在返回所述请求的字节范围时一起返回至少一个未曾请求的未写入的零的字节的额外的块,借此给予该顾客数据处理系统写入一个较所请求的更大字节范围的许可;以及在所述顾客数据处理系统已经写入了所述文件的所述请求的最后块以及所述至少一个非请求额外块之后,接收对该文件的下一个字节块的后续请求,借此最小化来自所述顾客数据处理系统的请求新的字节节块的次数。
10.在一个具有通过一个通信装置连接的多个数据处理系统的分散数据处理系统中的一种方法,用于访问被至少一个第二数据处理系统所请求的位于所述数据处理系统中的第一个上的一个文件中的一个字节范围;其特征在于从该第一数据处理系统返回第二数据处理系统所请求的该字节范围;根据在所述第一数据处理系统上的一个决定,有选择地在返回所述请求的字节范围的同时是否返回一个未曾写入过的零的字节的额外范围;以及如果所述第二数据处理系统觉察所述额外的未曾写入过的零的字节的范围和如果所述第二数据处理系统决定写入所述额外未曾写入过的零的字节的范围,则由所述第二数据处理系统写入所述返回的额外的未曾写入过的零的字节范围。
11.具有从一个第二数据处理系统访问位于一个第一数据处理系统上的一个文件中一个字节范围的装置的一个系统,其中所述第一数据处理系统与所述第二数据处理系统是通过一个通信装置连接的,其特征在于根据所述第一数据处理系统的确定,用于在对来自所述数据处理系统第二个要求第一数据处理系统在所述文件上执行一个操作的一个请求答复中返回一个文件中当前未使用的一个字节范围的描述的装置;以及用于授于该第二数据处理系统使用该被描述的所述字节范围的许可的装置。
全文摘要
本发明的系统与方法控制一个分布式网络环境中的顾客数据处理系统如何得以高效地扩充文件并写入文件中早先未曾被数据占用的区域。服务器数据处理系统以向顾客数据处理系统送出他所请求的实际字节以及额外的新生零来管理新文件块的分布式分配。新生零是逻辑上为零的字节,它们从未存储或写入过,并且可以在该文件的当前范围之外。服务器根据它所能利用的物理存储器的数量以及有否其它顾客数据处理系统需要访问这一范围的块来确定是否将这一额外范围的新生零送给一个顾客。
文档编号G06F17/30GK1047408SQ90103520
公开日1990年11月28日 申请日期1990年5月15日 优先权日1989年5月15日
发明者斯蒂芬·保罗·摩根, 托德·艾伦·史密斯 申请人:国际商业机器公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1