分布式共享存储器.docx
- 文档编号:10950346
- 上传时间:2023-02-23
- 格式:DOCX
- 页数:43
- 大小:399.97KB
分布式共享存储器.docx
《分布式共享存储器.docx》由会员分享,可在线阅读,更多相关《分布式共享存储器.docx(43页珍藏版)》请在冰豆网上搜索。
分布式共享存储器
第六章分布式共享存储器
在第一章中,我们看到存在着多处理机和多计算机这样两种多处理机系统。
在多处理机系统中,两个或更多的CPU共享一个存储器。
任何处理机上的任何进程只需将数据移入移出就可读写共享存储器中的数据。
而在多计算机系统中,每个CPU有各自的存储器,并不共享。
以农业为例,一个多处理机可以看作这样一个系统:
一群猪(进程)用一个食槽(共享存储器)进食。
而多计算机则是每只猪拥有自己的食槽。
以教育为例,多处理机就是教室前面的一块黑板,所有学生都可以看到,而多计算机则是每个学生看自己的笔记本。
尽管这种区别看起来微不足道,其影响却是深远的。
其结果涉及到软件和硬件两个方面。
首先看看对硬件的影响。
设计一种使多个处理机同时使用同一存储器的机器是非常困难的。
如1.3.1节所述,由于总线会成为一种瓶颈,基于总线的多处理机总数就最多只能有几个。
1.3.2节介绍的交换式多处理机可应用于大系统,但相比之下过于昂贵、缓慢、复杂以及难维护。
相反,大的多计算机系统更易于建立。
单主板计算机(包含一个CPU,一个存储器,一个网络接口)可以相互连接在一起,而不受数量的限制。
许多生产商都提供包含数以千计处理机的多计算机系统。
从硬件设计者的角度看,多计算机系统比多处理机系统更优越。
现在看看它对软件的影响。
用于多处理机编程的技术很多。
为实现通信,一个进程把数据写到存储器,其它进程将之读出。
为保持同步,可以使用临界区(criticalregion),信号量或管程(monitor)提供必要的互斥。
很多文章都讨论了在共享存储器的计算机上实现通信与同步的问题。
在过去的20年中,每一本操作系统的教科书都有几个章节讨论这个问题。
简而言之,大量的理论和实践知识可用于多处理机编程。
对多计算机系统,情况正好相反。
通信一般使用消息传递,这使输入/输出更为抽象。
消息传递带来了许多复杂的问题,包括:
流控制,信包丢失,缓冲区设置和拥塞。
尽管已提出了不同的解决方案,但消息传递的编程仍很复杂。
为回避消息传递中的一些困难,Birrell和Nelson(1984)提议采用远程过程调用。
在他们的方案中,实际的通信隐藏在过程库中。
为了使用远程服务,进程调用相应的库过程,它将操作码和参数组装成一条消息,通过网络送出,等待应答。
但是像图像和其它包含指针的复杂数据结构不易发送。
且它不能用于使用全局变量的程序。
另外,用这种方法传送大数组也相当昂贵,这是因为它们必须通过值而不是引用来传送。
总之,从软件设计者的角度来看,多处理机系统要比多计算机系统优越。
这两种方法各有优缺点:
多计算机系统易于建立但难于编程;多处理机系统正相反,易于编程但难于建立。
我们需要既易于建立又易于编程的系统。
本章便试图建立这样的系统。
6.1简介
在早期的分布式系统中,人们认为程序运行在不同的地址空间,没有物理上的共享存储器(例如多计算机)。
在这种思维模式下,通信自然被看作不相关地址空间的消息传递。
1986年,Li提出了不同方案,这就是现在所说的分布式共享存储器(DSM)(Li,1986;Li及Hudak,1989)。
简言之,Li和Hudak提出让一组由局域网互连的工作站共享一个分页的虚拟地址空间。
在最简单的变形中,每一页刚好在一台机器上。
对本地页的访问以存储器速度由硬件实现。
试图访问其它机器上的页将导致缺页错误,它激活操作系统的陷阱程序。
操作系统向远程机器发送消息,远程机器查找所需页面,将它发送给提出请求的处理机。
失败的操作将重新开始并得以完成。
这种设计与传统的虚拟存储器系统有类似之处:
当一进程访问一未驻留存储器的页时,激活陷阱,操作系统获取相应页并将其调入。
不同之处在于:
操作系统不是从磁盘中而是通过网络从另一个处理机中获取页。
对用户进程来说,系统更象传统的多处理机,多个进程随意地读写共享存储器。
所有的通信和同步都通过存储器来完成,对用户进程不可见。
实际上,Li和Hudak设计了一种即易于编程又易于建立的系统。
然而,十全十美是不可能的。
尽管这个系统既易于编程又易于建立,但是许多应用程序在这个系统上运行的情况并不乐观。
页在网上频繁地调进调出,这种情况与单处理机虚拟存储器系统的抖动类似。
近几年来,如何使这种分布式共享存储器系统更为有效已成为一个有待深入研究的领域,并研究开发了大量的新技术。
所有这些都是为了缓解网络冲突、减少存储器请求与应答之间的时间。
另一种方法是不共享整个地址空间,而只共享其中所选择的一部分,即那些由多个进程引用的变量和数据结构。
在这种模式下,每台机器并不直接访问一般存储器而是访问共享的变量集,这是一种更高层次上的抽象。
这种策略不仅极大地减小了必须共享的数据量,而且在大多数情况下,共享数据的大量信息,比如类型,也是可得的,这有助于优化系统性能。
还有一种可能的优化方法是在多台计算机上复制共享变量,通过共享复制的变量而不是整个页,模拟处理机的问题可简化为保证一组数据结构的多个拷贝一致性的问题。
一般来说读操作可以在本地进行而不引起任何网络通信,写则可以通过多拷贝更新协议完成。
这种协议在分布式数据库中已得到广泛应用。
进一步研究地址空间的构成,我们不仅可以共享变量,还可以共享通常被称为对象的封装的数据类型。
与共享变量不同,每个对象不仅有数据还有称之为方法的过程。
程序不能直接访问数据而必须通过调用方法来访问。
通过这种限制访问数据,我们有可能采用各种新算法。
和硬件分页相比,仅由软件实现分布式共享内存既有优点,也有缺点。
我们通常倾向于在程序里加入一定限制来获得较好的性能。
本章后面将涉及到这一点。
在详细介绍分布式共享存储器之前,我们首先回顾一下什么是共享存储器以及共享存储器的多处理机系统是怎样工作的。
由于共享的含义很微妙,所以在后面我们将分析共享的语义。
最后,我们将回到分布式共享存储器的设计上来。
因为分布式共享存储器与计算机结构、操作系统、实时系统,甚至程序设计语言都有关系,所有这些在本章中都将提到。
6.2什么是共享存储器?
这一节我们将比较几种共享存储器(内存)的多处理机,范围从简单的单总线多处理机到具有高级缓存方案的多处理机。
DSM的很多研究工作都受到了多处理机结构发展的启发,所以理解这些机制对理解分布式共享存储器(DSM)是很重要的。
而且,许多算法是如此的相似以至于很难区分出一台高档计算机是多处理机还是应用了由硬件实现分布式共享存储器的多计算机,我们将比较各种多处理机结构和分布式共享存储器系统,从硬件到软件,提出各种可能的设计方案。
通过分析这一系列方案我们会了解DSM更适用于种场合。
6.2.1芯片存储器
尽管大多数计算机都用和CPU分离的存储器,但仍然存在着包含CPU和存储器的芯片。
这种芯片生产量数以百万计,广泛应用于汽车、电气用具、甚至玩具。
在芯片里,CPU和存储器通过地址线和数据线直接相连,图6-1(a)是这种芯片的一个简图。
可以设想,只要将这种芯片简单扩展,多个CPU就可以共享同一存储器,如图6-1(b)所示。
构建这样一个芯片不仅复杂,而且非常昂贵和不实用。
如果想构建这样的一个单芯
片多处理机,想使100个CPU可以同时访问同一个存储器,在工程上是不可实现的。
我们需
要采用其它方法共享所需存储器。
图6-1(a)单片计算机(b)理想的共享存储器多处理机
6.2.2基于总线的多处理机
从图6-1(a)中可以看出CPU和存储器由并行线连接,一些具有CPU要读写的地址,一些接收和发送数据,其余用于传输控制,这些线称为总线。
这里的总线是在芯片内,但在大多数系统中总线都是外置的,用于连接包含CPU、存储器和I/O控制器在内的印刷电路板。
在台式计算机中,总线一般蚀刻在主板上,主板上插有CPU、存储器和I/O控制卡。
基于总线相连多个CPU是构建多处理机的一种简单有效的方法。
图6-2(a)描述的系统具有3个CPU且它们共享一个存储器。
当任一CPU要从存储器中读取数据时,它将数据的地址放在总线上,并在控制总线上加上“读”信号。
存储器读出需要的数据,将其放在总线上,在控制总线上加“准备好”信号,CPU即可读到相应的数据。
写的情况类似。
图6-2(a)多处理器(b)带缓存的多处理器
为防止多个CPU同时访问存储器,需要总线仲裁机制。
现已采用了多种方案。
例如CPU要获取总线控制权,首先要提出申请,获得允许后方能使用。
这种申请可以采用集中式即总线仲裁机构来仲裁;也可采用非集中方式即先申请的CPU先获得总线控制权。
单一总线的不利之处在于3-4个CPU就可能导致超载。
降低总线负载的一般方法是给每个CPU提供一个监听高速缓存(snoopingcache或snoopycache)。
称之为监听,是因为它在总线上“监听”信号。
监听高速缓存如图6-2(b)所示。
这已经成为许多研究机构近年来的研究方向。
(Agarwaletal.,1988;Agarwal和Cherian,1989;Archibald和Baer,1986;Cheong和Veidenbaum,1988;Dahlgernetal.,1994;Egger和Katz,1989a,1989b;Nayfeh和Olukotun,1994;Przybylskietal.,1988;Scheurich和Dubois,1987;Thekkath和Eggers,1994;Vernonetal.1988;Weber和Gupta,1989)。
这些文章都类似地提出了缓存一致性协议,即保证不同的缓存对于相同的存储器位置具有相同的值。
其中一种特别简单、通用的协议称为通写(Write--Though)。
当CPU从存储器中首次读取某字时,该字通过总线取出并存在提出请求的CPU缓存中。
当再次需要这个字时,CPU不再提出访问存储器的请求,而是直接从缓存中获取,这减少了总线流量。
图6-3的前两行说明了读取的两种情况,读失败(该字不在Cache中)和读命中(该字在Cache中)。
在简单的系统中,只把被请求的字放在Cache中,但在大部分系统中,通常第一次访问后,一数据块即16或32字节被传送并置于Cache中,便于下次访问。
图6-3通写缓存一致性协议.第三列中的“命中”项说明监听CPU
的缓存中有该字,而不是请求的CPU
由于每个CPU都独立完成缓存操作,因此也可能两个或更多CPU同时对一个字执行了缓存操作。
我们来看看执行写操作时的情况。
如果某字不在CPU的缓存中,那么仅仅更新存储器,就像从未使用缓存一样。
这个操作需要一个普通的总线周期。
如果执行写操作的CPU拥有字的唯一拷贝,则缓存和存储器通过总线同时更新。
如果情况仅仅是这样,就不会发生错误。
但当某CPU要写的字也在其它CPU的缓存中时,就可能会出现问题。
当CPU对在缓存中的字执行写操作时,Cache中的项便被更新。
不管怎样,存储器都通过总线被更新。
其它CPU的缓存监听到写操作(它们总在总线上监听),检查自身是否有这个被更改的字。
如果有,则将该字的缓存项置无效。
当写操作完成时,存储器便被更新并且只有一个CPU的缓存中有这个字。
除了将其它的缓存项置无效,也可将它们全部更新。
在大多数情况下,更新要比置无效慢得多。
置无效只需提供地址,更新还需要提供新的值。
如果这两项顺序出现在总线上,就可能会出现多余的循环。
即使将地址和数据同时写入总线,但若缓存块长于一个字,更新整个数据块也得需要多个总线循环。
这种置无效和更新的问题在所有的缓存协议以及DSM系统中都存在。
图6-3概括了整个协议。
第一列列出了可能发生的四种基本事件。
第二列说明缓存如何响应相关CPU的操作。
第三列说明缓存发现(通过监听)其它CPU的读写操作时如何反应。
例如,当CacheS(监听者)发现其它CPU写入的字在其Cache中(从S的角度看是写命中)时,S必须采取措施。
S的响应是从本缓存中删除这个字。
通写协议(Write-throughprotocal)易于理解和使用,其不利之处在于所有的写操作必须通过总线。
尽管总线流量在某种程度上确实是减小了,但允许挂在单一总线上的CPU数量仍很少,不能满足大型多处理机的需要。
可喜的是,对大多数实际的程序来说,一旦CPU写了某字,它很可能再次需要这个字,而其它CPU不大可能立即需要该字。
这种情况表明如果让正在使用某字的CPU暂时拥有该字的拥有权,直到别的CPU需要该字,那么就可以避免更新存储器的顺序写操作。
这种缓存协议是存在的。
1983年,Goodman设计了第一个这样的协议:
WRITEONCE。
然而,他设计的协议考虑了与当时的现有总线协作问题,因此比所需的更为复杂。
下面我们将给出一个它的简化版本,这个版本在所有权协议中具有典型性。
Archibald和Baer(1986)描述及比较了其它协议。
该协议管理缓存块,每个块处于以下三种状态之一:
1.无效——本缓存块无有效数据。
2.干净——存储器被更新,该块可能在别的缓存中。
3.脏——存储器错误,该数据块不在其它缓存中。
基本思想是允许正被多个CPU读取的字出现在它们所有的缓存中。
而仅被一个CPU经常写的字将只保存在它的缓存中,为减少总线流量,不必每次都写回存储器。
下面举例说明协议的操作过程。
为简化本例,我们假定每个缓冲块只含一个字。
首先,如图6-4(a)的缓存块中有一个字W1,地址为W。
存储器拥有W的有效拷贝。
图6-4(b)中,A提出请求并从存储器中得到W的一个拷贝。
B监听到此读操作,不做反应。
图6-4缓存拥有权协议工作的例子
现在A将新值W2写入W,B监听到写请求,将自己的缓存项置无效。
如图6-4(c),A的缓存块状态变为DIRTY。
这说明A持有W的唯一拷贝,存储器中的W值已经失效。
这时,如图6-4(d),A又一次重写了该字。
写操作在本地缓存完成,不需总线通信。
此后一系列写操作都不用更新存储器。
此后,其它CPU,如图6-4(e)中的C访问了这个字。
A发现总线上的访问请求则发信号禁止存储器响应。
然后,A提供C所需的字并将自己的项置为无效。
C发现该字来自其它的缓存而不是存储器,且其状态为DIRTY,则也相应的标示了自己的缓存项。
C现在是该字的拥有者,这意味着C可以不通过总线请求而直接读写该字。
当然它还要监听其它CPU的请求,并提供服务。
直到缓存缺乏空间而清除该字,该字状态始终为DIRTY。
那时,该字从所有的缓存中消失,回写到存储器。
许多小型多处理机采用与此类似的缓存一致性协议,它有三个重要属性:
1.缓存对总线的监听保证了一致性。
2.协议建立在存储器管理单元中。
3.整个算法在一个存储器周期中完成。
后面我们将会看到,大型交换式多处理机系统并不具有某些属性,DSM则不具有上面所有属性。
6.2.3基于环的多处理机
通向DSM系统的下一步是基于环的多处理机,例证由Memnet提出(Delp,1988;Delpetal.,1991;Tametal.,1990)。
在Memnet的例子中,一个独立的地址空间被分成一个私有区和一个共享区。
私有区被分成段,使得每个机器都有一个段用来存放堆栈和其它非共享的数据和代码。
共享区对所有的机器都是一样的,保持其一致性的协议类似于基于总线多处理机的。
共享存储器被分成32字的块,是机器间传输的单元。
Memnet中的机器由一个改进的令牌环连接。
该环包括20条并行线,允许每100nsec发送16位数据和4位控制信号,数据传输率为160Mbps。
环如图6-5(a)所示。
环接口,MMU(存储器管理单元),缓存和一部分存储器集成在称为Memnet设备(MemnetDevice)的器件中,如图6-5(b)上三分之一所示。
图6-5(a)Memnet环(b)单一主机(c)块表
不同于图6-2所示的基于总线的多处理机,在Memnet中没有集中式全局存储器。
共享地址空间中的每个32字节数据块都有一属主机器(homemachine),该机器在其属主存储器(homememory)域中始终为这32位数据块保留物理存储器,如图6-5(b)所示。
数据块可被置于除属主机器以外的任何机器的缓存中。
cache和homememory区实际上是共享缓冲池的,因它们的使用稍有不同,所以把它们分为两部分来对待。
只读块可以出现在多个机器上;可读可写块只能出现在一台机器上。
在这两种情况中,块都不需要置于属主机器中。
属主机器所做的是保证该块不在其它机器的缓存时,有一个确定的地点保存。
由于没有全局存储器,这一点是必要的。
实际上,全局存储器已散布到整个系统中。
如图6-5(c),每个机器的Memnet设备上有一个表,包括每个块在共享地址空间的入口,以块序号为索引。
每个表项包含一个有效位,判断块是否在缓存中且已被更新;一个互斥位,确定本地的拷贝是否唯一;一个属主位,只有当本机是该块的属主机器时才置位;一个中断位,用于强制中断;一个定位位,表明若块存在并有效,它定位在缓存中何处。
看过Memnet的结构,再来看一下它所用的协议。
当CPU要从共享存储器中读一个字时,该存储器地址传送给Memnet设备,Memnet设备检查表项以确定该块是否存在。
若存在,读请求立即得到满足。
否则,Memnet设备等待直到俘获循环的令牌,将请求信包送入环中,并挂起CPU。
请求信包包含目标地址和32字节哑域(dummyfield)。
信包在环中传递的过程中,每个MEMNET设备都检查自己是否有所需的块,若有则将块置入哑域,修改信包头使下一机器不再重复此工作。
若块中的互斥位置位,则清除它。
因为某数据块一定位于系统某处,因此当信包返回发送点时,一定包含了所需的块。
CPU发出请求并存储块,满足请求以后释放CPU。
若发出请求的机器没有足够的缓存容纳到来的块,就会出现问题。
为了得到空间,它随机取一缓存块送入属主机器中,释放该缓存块。
因为属主位已置位的块已在属主机器中,所以不再被选取。
写操作与读操作有些不同。
这里有三点需要区别。
若包含要写字的块存在于本地并且是系统中的唯一拷贝(互斥位置位),字就在本地写入。
若所需块在本地存在但不是系统中的唯一拷贝,CPU将在环中发出置无效信包,强制其它机器抛弃此块的拷贝。
当置无效信包返回时,将该块的互斥位置位,字在本地写入。
若本地不存在所需块,CPU则发出包含读请求和置无效请求的信包。
第一个有此数据块的机器将该块拷入信包,同时抛弃自己的拷贝。
其余的机器仅从自己的缓存中抛弃该数据块。
当信包返回到发送者时,本地存储该数据块并执行写操作。
在许多方面,Memnet与基于总线的多处理机有相似之处。
在这两种设计中,读操作返回的都是最近写入的值。
读操作时,数据块可能在一个缓存中,也可能在多个缓存中。
写操作时,数据块只能在一个缓存中。
两者的协议也很相似,但Memnet没有集中式全局存储器。
基于总线的多处理机和像Memnet这样的基于环的多处理机的最大的区别是:
前者是紧耦合的,CPU通常在一个框架上。
而使用基于环的多处理机的机器耦合得较松一些,甚至有可能像局域网上的机器那样在一座楼的桌面上分布,尽管这种松耦合会影响性能。
再者,不像基于总线的多处理机,像Memnet这样基于环的多处理机没有集中式全局存储器。
在这两方面,基于环的多处理机几乎就是DSM的硬件实现。
有人试图说明基于环的处理机在理论上是不应该存在的,因为它结合了两种被认为互斥类别的特性(多处理机和DSM机对应哺乳动物与写的关系)。
然而,它确实存在,说明这两种类别并不象人们想象的那样不同。
6.2.4交换式多处理机
尽管基于总线和基于环的多处理机对于小系统(不超过64个CPU)很适用,但对于有着成百上千个CPU的系统来说,情况就不容乐观。
CPU增加到一定数量时,总线或环的带宽达到饱和,再增加额外的CPU也不会提高系统性能。
我们一般采用两种方法解决带宽不足的问题:
1.减少通信流量。
2.增加通信容量。
我们已经看到试图通过缓冲减少通信流量的例子。
这方面的工作集中在改善缓冲协议,优化块大小,重组程序,以提高存储器访问的本地命中率。
但是,总有这样的一天:
不知足的设计者需要添加更多的CPU,虽然使用了书中的所有技术,但也不再剩余总线带宽了。
唯一的办法只有增加总线带宽。
一种措施是改变拓扑结构,例如从一根总线到两根总线到树状结构到网状结构。
通过改变互联网络的拓扑结构,可能会增加通信容量。
另一种方法是为系统建立层次结构。
仍在一根总线上挂一些CPU,但把整个单元(CPU加总线)看作一个簇。
如图6-6(a),整个系统中有多个簇,用簇间总线连接。
只要大多数CPU主要在簇内通信,就可保证簇间的通信流量相对较小。
若一条簇间总线不够,可以增加第二条簇间总线,或者将簇排列成树状或网状。
若仍需要更多的带宽,则将这些以总线相连的或是树状、网状的簇组成超级簇,将系统分成若干超级簇,超级簇也可以用单总线相连或组织成树状、网状结构。
图6-6(b)是一个三级总线的系统。
图6-6(a)三个簇由簇间总线连接组成一个超级簇
(b)由超级簇总线相连的两个超级簇
本节我们来看看基于网状簇的分层设计。
DASH机是斯坦福大学的一项研究课题(Lenoskietal.,1992)。
尽管许多学者都在做着类似的工作,DASH机仍是比较典型的一个。
下面将着重讨论一个已实际建立的具有64个CPU的原型。
它的设计原理经过严格筛选以便于建立更大规模的版本。
为避免一些不必要的细节,在下面的描述中,我们简化了一些地方。
图6-7(a)是DASH原型的简化拓扑结构图。
它包括16个簇,每簇有一条总线,4个CPU,16M全局存储器和一些I/O设备(如磁盘等)。
为避免结构图过于杂乱,每簇省略掉2个CPU和I/O设备。
每个CPU可监听本地总线,如图6-2(b),却不能监听其它总线。
原型中总共可用的地址空间为256M,分为16块,每块16M。
簇0的全局存储器地址是0~16M,簇1的全局存储器地址是16M~32M,以此类推。
存储器以16字节的块为单位设置缓冲和传送。
因此每一簇的地址空间中有1M存储器块。
每一簇都以目录来记录哪些簇现在拥有哪些块的拷贝。
因为每簇有1M存储器块,在它的目录中就有1M个项,每个块1项。
每一簇的每个表项保留一个一位的位图,以判定簇是否将该块放入缓冲区。
表项中还有2位表明块的状态。
下面我们会看到目录对于DASH的操作很重要。
实际上,DASH的名字就来源于“共享存储器的目录结构”(DirectoryArchitectureforSharedmemory)。
每簇拥有1M18位的项意味着每个目录的大小超过2M。
16簇的目录所需存储器超过36M,几乎是256M的14%。
若每簇的CPU数量增加,目录所需存储器的数量不变。
每簇拥有更多CPU使得目录开销分摊到大量的CPU上,减少每个CPU开销。
同时,每个CPU的总线控制和目录开销也减小了。
理论上,1个CPU为一簇最好,但总线和目录的开销对一个CPU来说太大了。
图6-7(a)Dash体系结构的简单表示.每一个簇实际上有四个CPU,这儿只显示了两个
(b)Dash目录
位图不是跟踪哪一簇拥有那些缓存块的唯一方法。
另一方法是以列表形式组织每个目录项,判断那些块拥有相应的缓冲块。
若有共享的数据较少,则列表法需要较少位,若有大量共享,则需很多位。
列表法的不足之处在于变长度的数据结构,但这可以解决。
例如MITALEWIFE多处理机(Agarwaletal.,1991;Kranzetal.,1993)与DASH有许多相似之处,但MITALEWIFE在目录的记录上使用表格而不是位图,目录溢出处理也是采用软件的方法。
DASH中的每个簇通过一个接口连接,这个接口用于簇间通信。
如图6-7(a),接口由簇间链(简单的总线)连接成一个四方网格。
系统中增加簇后,也增加了更多簇间链,带宽和系统规模增大。
簇间链系统使用蛀孔式路由(WORMH
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 分布式 共享 存储器
![提示](https://static.bdocx.com/images/bang_tan.gif)