分布式操作系统

来源:互联网 发布:mfc串口通信编程 编辑:程序博客网 时间:2024/05/16 17:03
 
 分布式操作系统(Distributed Operating System,简称DOS)是管理分布式系统资源的机构

12.1 标识符系统

  标识符系统的主要任务是:决定哪些资源或者哪些服务或者哪些对象应当给它命名;决定命名的规则;进行名字管理。标识符系统的目标是:
  (1) 保证命名标识符的唯一性,即在整个DOS内,被命名的服务、资源、对象是唯一的。
  这是不难理解的。唯一性并不排除同一对象有不同的别名。
  (2) 支持多级标识符,至少要支持面向用户的标识符和面向内部的标识符。面向用户的标识符便于用户阅读、理解和记忆,通常只用字母组成的字符串。面向内部的标识符应便于操作系统识别、操纵和管理。正如我们在单机系统中为进程所做的那样,进程标识符供用户使用,进程号(整数)供操作系统调度进程使用。多级标识符是DOS自治性特征的体现。
  (3)名字与名字所代表的对象的物理位置无关。这有2层含义:其一是指对象的物理位置对用户是透明的;其二是指物理位置的变化不影响名字的标识符组成。
  标识符系统包括:命名对象 标识符类型 命名机制名字映射
  1、命名对象
  在分布式系统中,凡能提供服务的一切对象都是可以命名的,称为命名对象。例如,进程、文件、过程、文件系统、网络中的站点、主机、协议、信箱、通信端口、逻辑信道等。当然对不同的对象可以采取不同的命名规则。 
  2、标识符类型
  可以从不同角度来标识一个对象,从而出现了多种类型的标识符形式。
  (1)主机标识符
  ①可为一个对象取一个或多个名字,一种常见的情况是为对象取两种名字:外部名字和内部名字。外部名字面向用户。内部名字通常是一个整数,是为了便于计算机处理而由系统分配的。若对象是共享资源,它可被不同的用户用不同的名字(标识符)来访问。
  ②地址本是用来指明某对象的所在位置的,但当为一对象规定了唯一的地址后,便可直接利用它来标识该对象。这种方法有时更便于计算机对该对象进行处理。例如,我们可为每个工作站规定一个站址,以唯一地标识该站,以后便可利用该站址实现其它站与该站的通信。
  ③一条路径不仅可用来识别一个对象,同时还可用来指出访问该对象的途经,这对于计算机的处理是十分有用的。通常又把路径称为路径名。在具有层次式结构的系统中,广泛使用路径名方式来访问某个站点或进程;在文件系统中,则使用路径名来访问文件。
  (2)连接名和端口(Port)
  ①在面向连接的传输方式中,当A系统的实体请求与B系统(见下图)中的实体建立连接时,需用全局名B.2。在连接建立后,双方便可利用连接该两个实体的连接名(例如2号连接名)进行通信。连接名通常是一个整数。这可减少通信开销。分布式操作系统
  ②可把端口理解为连接的端点,如A.b是连接1的端点、A.c是连接2的端点。一对端口可确定一个连接。在很多系统中实体与其端口间可存在一对多的联系,即一个实体可有多个端口。在实体之间通信时,若已经标明了端口,就不必再标出其实体名,因此端口又是实体的代号。在两个不同系统中的实体建立连接后,由该连接的一个端口A.b发出的信息,必然会传送到B.1实体。因此,端口不仅是本系统实体的代号,也可作为其它系统实体的代号。这样,在建立了连接的两个实体之间进行通信时,只须写出端口号,而不必标出源和目标实体的名字,这可显著减少通信开销。 
  (3)全局标识符和局部标识符
  ①全局标识符是在整个分布式系统范围内用来标识某对象的标识符,它是唯一的。当一个系统中的实体访问另一系统中的资源时,往往要使用全局名。为了保证标识符的唯一性,常采用分级地址结构。分级地址结由网络号、主机号和端口号组成。
  ②局部标识符仅在一指定范围内才是唯一的。在指定范围内进程间的通信以及对资源的访问均可使用局部名。各系统可用一种或几种不同的方法来建立本系统中的局部标识符。局部名同样应是有结构的,以便于在全局名和局部名之间进行转换。局部名的典型结构为:本系统标识符+唯一的局部标识符。
  3、命名机制 
  
我们以计算机网络中的主机为例,阐述命名机制。
  为向一般用户提供一种直观明了的主机标识符,TCP/IP专门设计了一种字符型的主机命名机制(又称为域名系统),实质上,主机名字是一种比IP地址更高级的地址形式。
  (1)层次型命名机制
  对主机名字的首要要求是全局唯一性,其次要便于管理(包括名字的确认、分配与回收),第三是便于映射,即便于用户级的名字到IP地址的变换,关键是映射效率。
  (2)域名与对象类型
  域名既能标识主机也能标识信箱甚至用户感兴趣的所有分布式对象。遗憾的是,域名语法本身并不能确定对象的类型或协议的类型。为了区分不同类型的对象以及不同类别的协议,在域名数据库中,每个域名记录中增加两个字段type和class,用以标明与此域名相关的对象类型和协议类别。域名数据库是由域名记录组成的,每条域名记录除了域名、type、class之外,还包括用于域名映射的信息。 
  4、名字映射
  
(1)映射表法
  利用映射表来实现名字转换是一种常用方法。在表的每个表目中设置一对名字,其中之一是面向用户的标识符或N层的某一标识符;另一个则是与之对应的面向内部的标识符或N-1层的某一标识符。通过查找映射表,即可实现名字映射。
   (2)呼叫法
  ①站名呼叫 
  在正式通信之前,是由源站形成站名呼叫报文,其中含有目标站名及源站地址,再以广播方式把站名呼叫报文发至整个分布式站点,用以询问“目标站址是什么”。若某个站点收到呼叫报文后,发现自己正被呼叫,立即发送一应答报文,其中含有自己的站址。注意应答报文是通过“点--点”通信方式发送的。源站收到应答报文后,便获得目标站的站址。若源站多次呼叫均失败,便认为分布式系统中不存在指定的站,便向用户报告呼叫失败。
  既然通过广播得到目标站址是为了通信,为什么不直接广播数据本身呢?因为广播数据的开销远远高于站名呼叫开销。站名呼叫的开销就在第1次广播上,一旦获得物理地址,以后的传输就可以直接进行了。这也是名字映射的主要好处之一。 
  ②文件呼叫
  当用户请求访问某文件时,系统首先检索本地文件系统,若无此文件便立即形成一个文件呼叫报文并以广播方式发至各站,每个站在收到文件呼叫报文后,都应检索本站文件系统,若找到该文件名,便送回一个应答报文。应当提出,由于可能在多个站点存在同名文件,因此在竞争型总线(CSMA/CD)中,应答报文的发送应推迟一随机时间,以免发生发送冲突。
   ③混合法
  在源站系统中配置一张站名映射表和非本站的文件目录。平时,多数站间通信和文件访问都能通过查找映射表获得目标站址和文件的物理位置;仅对少数在映射表中没有的站名或文件,才启用呼叫法。此时映射表的作用很像存储管理中讲到的联想寄存器,且效果相当明显。因为本站从经常进行通信和文件访问的规律中,很容易掌握常用的目标站址及文件的物理位置。

12.2 分布式进程互斥/同步

  所谓分布式进程(distributed processes)是能够真正在多个站点上同时运行的诸进程。显然,一般并发进程利用的是多个虚处理机概念,而分布式进程利用的是多个物理处理机。所以前者实现了逻辑上的并行性,而后者实现了物理上的并行性。分布式进程之间互斥与同步的概念与一般进程的情况相同。 
  对于分布式系统而言,不管分布的程度和方式如何,都有如下两种基本的假定:
  假定1:每个站点只是整个系统的一部分,且决策都是根据本地的信息进行的;
  假定2:不存在全系统范围内的公共时钟。
  由于两种假定的存在,分布式进程的互斥/同步比集中式或紧耦合系统内的进程的互斥/同步,在实现上要复杂得多。分布式进程的互斥/同步算法必须能确定事件发生的先后次序。 

12.2.1 事件定序
  
单个进程中的事件是按时间完全定序的,此外,根据因果律,可以假定“发送”消息的事件肯定发生在“接受”该消息的事件之前。这种情况自然地给系统中的事件提供了一个编序,称前发生关系(happened before,简称HB),并用“->”表示,其定义如下:
  a->b 若a到b是同一进程内的两个事件且a在b前发生或者a是一进程中的发送消息的事件而b是另一进程中接受同一消息的事件。
  显然,->具有传递性,即若a->b 且b->c 则a->c;->是非自反的,因同一事件不可能在自身之前发生。
若两个事件不存在 ->关系,则二者可同时执行,该事件为并发事件。显然,并发事件彼此互不影响,但若a->b,则事件a就可能影响事件b。
  定序方法分布式操作系统
  设有站点P、Q、R,它们各自的事件沿本站的时钟依次发生,但对整个系统来说,存在前发生关系和并发关系,如右图。图中有矢线相连的代表两个事件有→关系,例如事件p1一定要在事件q2之前发生尽管两事件在不同站点。注意,仅比较站点P和站点Q的局部时钟值不能反映事件的前发生的关系。
  我们希望引进一个逻辑时钟,并用它的值来反映这种关系,从而实现整个系统中的事件定序。假定对每个进程Pi有一个与其相关的逻辑时钟Ci,赋给进程Pi中事件a的逻辑时钟值记为Ci(a)。可用一个单调递增的计数器来实现Ci。假定C为系统的逻辑时钟,为使C能正确计值,下面的条件应成立:
  A. 对于进程Pi中的两个事件a和b,若a->b,则Ci(a)<Ci(b);
  B. 若a是进程Pi发送消息的事件,b是进程Pj接受同一消息的事件,则有Ci(a)<Cj(b);
  C. 对系统中的任何事件a和b,若a->b,则C(a)必须小于C(b)。
  按下述规则做,就能实现上述条件:
  A. 进程Pi中的任何两个相继事件之间使Ci增值,即计数器增加;
  B. 若事件a是进程Pi中发送消息m的事件,则a事件就附有时间戳Tm=Ci(a);
  C. 若事件b是进程Pj(j*i)中接收消息m的事件,则令Cj(b)=Tm+k且Tm+k≥Cj的当前值(k取正整数,保证Tm+k≥Cj即可,一般k取整数1)。
  至此,我们可以对分布式系统中的所有事件进行一致的定序了,称进程Pi中的事件a先于进程Pj中的事件b(用aTb表示),当且仅当 Ci(a)<Cj(b) 或者 Ci(a)=Cj(b)且Pi<<Pj
  其中关系“<<”是进程的一个任意编序。实现<<关系的一个简单方法是给系统中的每一个进程赋以一个唯一的进程号,且规定若进程号i<进程号j,则Pi<<Pj。通常把Þ称为全序关系。

12.2.2 Lamport算法
  
Lamport算法利用前述的事件定序方案统一定序所有对临界段的请求,按先来先服务的原则让请求临界资源的进程进入其临界段,进/出临界段1次需要3×(n-1)条消息。
  1、Lamport算法基本假定如下:
  A. 进程Pi发送的请求消息形如request(Ti , i),其中Ti = Ci是进程Pi发送此消息时对应的逻辑时钟值,i代表消息内容。
  B. 每个进程保持一个请求队列,队列中的请求消息根据T关系定序,队列初始为空
  2、Lamport算法描述
  当进程Pi请求资源时,它把请求消息request(Ti , i)排在自己的请求队列中,同时也把该消息发送给系统中的其他进程; 
  当进程Pj接收到外来消息request(Ti , i)后,发送回答消息reply(Tj , j),并把request(Ti , i)放入自己的请求队列。应当说明,若进程Pj在收到request(Ti , i)前已提出过对同一资源的访问请求,那么其时间戳应比(Ti , i)小。 
  若满足下述两条件,则允许进程Pi访问该资源(即允许进入临界段):
  A. Pi自身请求访问该资源的消息已处于请求队列的最前面;
  B. Pi已收到从所有其他进程发来的回答消息,这些回答消息的时间戳均晚于(Ti, i). 
  为了释放该资源,Pi从自己的队列中撤销请求消息,并发送一个打上时间戳的释放消息release给其他进程; 
  当进程Pj收到Pi的release消息后,它撤销自己队列中的原Pi的request(Ti , i)消息。

12.2.3 令牌传递法
  为实现分布式系统中的进程互斥,在系统中设置了象征权力的令牌(token)。令牌本身是一种特定格式的报文(通常只有一个字节),它不断地在系统中由一个进程传递给另一个进程。如果握有令牌的进程想进入临界段,则它保持令牌在手直到退出临界段时才将令牌传递给后继进程。没有令牌的进程不能进入临界段。这样,每次只有一个进程进入临界段,实现了进程互斥。

12.2.4 Ricart and Agrawala算法
  Ricart and Agrawala算法实现了进程互斥,其控制是全分布的。因为进入临界段是根据时间戳的顺序来安排的(即先来先服务方式),所以根本不可能有进程“饥饿”现象发生。死锁也不可能发生,因为不存在环路等待。
  Ricart and Agrawala 算法存在这样两个问题。其一,当有一个进程请求进入临界段时,所有其他进程都被牵连到。这就是说,每个进程都要知道其他进程的名字,当有新进程出现时,必须把新进程名字通知其他各进程,同时新进程要获知全部其他进程名。在分布式系统中完成这件事并不容易。其二,如果某一进程故障,那么该算法因无法收到全部应答消息而崩溃。系统应具有故障监测与恢复功能才能保证该算法切实可行。
  该算法对于进程1次进/出临界段最多要2(n-1)条消息,因而比Lamport算法更加有效。如前所述,进程的请求队列按T关系定序,其算法描述如下:
  1. 当进程Pi请求资源时,它发送消息request(Ti,i)到所有其他进程;
  2.当进程Pj收到request消息后,执行下述操作:
  A.如果Pj正在临界段,则推迟向Pi发reply消息;
  B.如果Pj不请求同一资源,则立即发送回答消息reply(Tj, j);分布式操作系统
  C.如果Pj也请求同资源,且时间戳(Ti,i)早于(Tj, j),则立即返回reply(Tj, j),否则推迟发送reply消息;
  3.当进程Pi收到所有其他进程的reply 时,便可以进入临界段;
  4.当Pi释放资源时,仅向所有推迟发来reply消息的进程发送reply(Ti,i)消息。
  执行该算法时,每个进程的状态变换如右图所示。

12.3 资源管理

  分布式操作系统中的资源管理方式主要有局部集中式、分级式和分散式。资源包括硬件和软件,有时也把资源抽象成对象。

12.3.1 局部集中式 
  每种资源由一个且仅由一个资源管理者管理,具体讲就是,资源按其在各站点上的分布情况分别由其所在的站点实行局部的集中管理,不存在全系统范围的集中管理者。就一个站点而言,这种方式与单机的情况相似,但增加了利用网络通信手段申请使用其它站点上的资源的功能。
  由于各站点都有隶属于自己管理的一部分资源,所以进程请求使用资源时,先向本站点的管理者提出请求,仅当本站点的管理者无法满足时,本站点管理者才向其它站点转发这一请求,而且可在提供所需资源的站点之中挑选出通信距离最短的站点,从而减少通信开销。
  当多个并发进程同时申请某一资源,且该资源又是由某一站点上的管理者进行局部集中式管理时,可把这一问题归结为访问临界段问题。

12.3.2 分级式
  分级式管理的基本原理是:
  ①针对实际的分布式系统,对其中的各种资源进行分析,然后根据其重要性、常用性和隶属关系将资源分为2个级别:第1级是被多个站点经常使用的资源;第2级是仅被本站点使用的资源。
  ②采用不同方式来管理不同级别的资源,即:对第1级资源,由于它们被系统中的多个站点经常使用,因此必须采用分散式管理即由多个站点在协商一致的情况下共同管理。对第2级资源,由于它们属于某个站点,不被其它站点所使用,可采用集中式管理。

12.3.3 分散式
  提出这种管理方式,是由于在分布式系统中,有些资源很难采用集中管理方式。例如,系统有一文件A,它有若干副本分别存放在站点1,2,3上。系统允许多个用户同时读文件A,但当某个用户在修改文件A时,任何其它的用户既不能读A也不得写A(即分布式“读者/写者”问题)。因此,当站点1,2,3上的资源管理者之一接收到请求“写”文件A的要求时,它必须与其它站点的资源管理者协商,取得一致后才能决定是否满足申请者的要求。也就是说,文件A不是由一个管理者而是由多个管理者来管理,这就要求采用分散式管理。显然,该管理方式适用于必须由多个站点共同管理且逻辑上有相互联系的一些资源,如多份拷贝的文件、数据、表格等。
  算法描述
  (1)算法说明:
  A.占有资源的进程,必须先释放资源,系统才能把该资源分配给另一进程;
  B.多个进程申请同一资源时,必须按其请求的先后次序来分配;
  C.若分配到资源的进程都能在有限时间内释放所占有的资源,则每个资源申请者就能在有限的时间内获得该资源;
  D.假定系统由n个站点组成,每个站点运行一个进程,它们的编号依次是P1, P2, …,Pn。每个进程都有一个自己管理的申请队列,用以存放请求消息。
  (2)算法描述:
  该算法利用时间戳来标明申请资源的先后次序。
  ①当系统中的任一进程Pi申请资源ri时,向系统中的其它每一进程发一Request(Ti,Pi,ri)消息,(其中Ti为此时的时间戳)并把它存入自己的请求队列;
  ②进程Pj接收到这一消息后,将其存入自己的请求队列,若Pj当前未请求该资源,则它马上给Pi发送一个带有时间戳的认可消息;若Pj也正在请求使用该资源,且其时间戳Tj先于Ti,则它暂不给Pi发送认可消息;
  ③仅当下列条件成立时,Pi才可以分配该资源:
  a.在其请求队列中,它的Request(Ti , Pi , ri)消息中的Ti比所有其它请求消息中时间戳都要小;
  b.Pi已接收到所有其它进程发来的时间戳迟于Ti的认可消息。
  ④在释放资源时,Pi从自己的请求队列中去掉Request(Ti , Pi , ri)消息,并向系统
中每个正等待请求使用该资源的进程发一条release(Ti , Pi , ri)消息和一条带时间戳的认可消息。
  ⑤当进程Pj收到Pi发来的Release(Ti , Pi , ri)消息后,从其请求队列中去掉Request(Ti , Pi , ri)消息。

12.4 死锁问题

  分布式系统是由各站点组成的,所有进程都归属于各个站点。当这些进程在站点内活动时,因争夺站内资源可能发生死锁,这种情况称为站内死锁或局部死锁。但是,甲站的进程可能会申请乙站的资源,乙站的进程也可能会申请甲站的资源。因此,为竞争全局范围内的资源有可能导致进程死锁,称为全局死锁。
  局部死锁可以用单机系统中的解决死锁的方法加以处理,这是不难理解的。如果给事件确定了全序,那么单机系统中介绍中的“资源编序”方法可以移植到分布式系统中来防止全局死锁的发生。具体做法是:分布式系统中的所有资源被赋以一个唯一的资源号,全序事件中的进程只能以资源号递增的顺序请求资源。如果此时进程想请求低号资源,必须先释放已占用的高号资源。
  如果在分布式系统内设置“银行家进程”管理与银行家算法有关的信息,则单机系统中的银行家算法同样可以解决分布式进程的死锁问题。
  为叙述方便,我们先定义进程等待图。进程等待图(process waiting graph,简写PWG)是顶点和有向边的集合: 
  PWG = {V,E}
  其中 V = {Pi | i=1,2,…,n}
  E = {(Pi , Pj )| i , j = 1, 2,…,n但i≠j}

分布式操作系统
图 局部PWG图 

  图中顶点是进程名用圆圈表示,有向边(Pi , Pj)表示进程Pi等待Pj (i*j)释放它所需要的资源,在图中用Pi→Pj表示。右图是站点A、B的PWG,因为各进程均局部于站点内,故称局部PWG。
为简单起见,假定在分布式系统中每类资源只有一个。在此假定下,死锁发生的充分必要条件是:PWG中存在环路。 
  本节提出2个新方案,它们是当前分布式系统中处理死锁问题最常用的,一个用于死锁预防,另一个用于死锁检测。

12.4.1 死锁预防
  预防死锁的途径之一是通过抢占资源(如果必要)来破坏循环等待条件,其做法是:给每个进程赋一个唯一的优先数,这些优先数用以决定Pi是否等待Pj。例如,如果Pi的优先数高于Pj的优先数,令Pi等待Pj,否则Pj被撤离。因为对于等待图中的每一条边 (Pi , Pj),Pi的优先数高于Pj的优先数,因此也就不存在循环等待现象。但可能发生饥饿现象,即某些具有很低优先数的进程可能总被撤离。为解决这个问题,Rostenkrantz等人提出了使用时间戳作为优先数的方法。对系统中的每一进程,当创建它时,就赋给它一个时间戳,利用时间戳预防死锁的2种方案是:
  ①当进程Pi申请当前已由Pj占有的资源时,仅当Pi的时间戳小于Pj的时间戳(即,Pi比Pj年长)时,让Pi等待,否则,Pj被撤离。例如,假定进程P1, P2和P3分别有时间戳5,10和15,若P1申请已由P2占有的资源,P1就等待:如果P3申请已由P2占有的资源,P2就被撤离。
  ②当Pi申请当前已由Pj占有的资源时,如果Pi的时间戳大于Pj的时间戳(即Pi比Pj年轻时,让Pi等待,否则Pj被撤离。再考虑前面的例子,如果P1申请已由P2占有的资源,那么从P2手中抢占该资源,而且P2被撤离;如果P3申请已由P2占有的资源,则P3就等待。
  因为时间戳总是递增的,因此被撤离的进程最终将具有最小的时间戳,它将不会再次被撤离,可避免饥饿现象发生。这2种方案存在的主要问题是可能出现某些不必要的撤离。

12.4.2 死锁检测分布式操作系统
  假定每类资源只有单个实例,则PWG中的环路表明有死锁发生。但任何局部PWG中不出现环路并不意味着系统不存在死锁。
  1、集中式死锁检测
  全局PWG是取所有局部PWG之并构造而成、由单一进程管理的,这个特殊的进程称为“死锁检测协调者”进程。全局PWG可以在如下时刻构造:
  ①每当从局部PWG中去掉一条边或向局部PWG插入一条新边时;
  ②每当PWG中已经发生了若干改变时;
  ③每当协调者需要引用环路检测算法时。
  死锁检测协调者搜索全局PWG,如果发现一环路,则挑选一个进程作为牺牲者予以撤离,从而破坏环路。事后协调者必须通知所的的站点;“此时某某进程已作为牺牲者”,接到通知的站点也作相应的处理。
  针对第③种情况,检测算法的执行过程如下:
  ①协调者向系统中每一站点发送一条初始消息;
  ②当接收到这一消息后,各站点将它的局部PWG发给协调者。注意,该PWG包含站点的所有局部信息,反映了相应站点瞬时的状态,但它并不与任何其它站点的PWG同步。
  ③当协调者接收到来自每一站点的回复信息后,它就按如下方法构造PWG;
  A.系统中的每一进程作为图中一个结点;
  B.当且仅当边(Pi , Pj)或者边(Pi , Pj , n)(对某个n)出现在一个以上的PWG中时,则在全局PWG中就加上边(Pi , Pj)。
  可以断言,如果按此方法所构造的PWG中出现环路,那么该系统处于死锁状态。如果所构造的图中不存在环路,那么在开始执行该算法时,该系统不是处于死锁状态。
  2、层次式死锁检测
  集中式死锁检测算法要求所有的信息都驻留在协调者进程中,并由该进程管理。层次式死锁检测算法则是将这些信息分散给各个进程来管理。因而它是一种分布式算法。
  同集中式方法类似,每个站点管理它自己的局部PWG,但与集中式方式不同的是全局PWG被分散给若干不同的控制者管理。这些控制者组织成树形结构,其中每片叶子包含单个站点的局部PWG。每个非叶子控制者管理着它下面子树的控制者管理的PWG。
  层次式死锁检测方法中,假死锁仍然存在。 

12.5 任务分布

  这里讲的任务是指一个应用问题经分解而得的、最适合单一处理的单位。任务分解是把一个提交的应用任务划分成若干独立的、具有最小模块间通信(IMC)开销的模块;任务分布则是把各模块分布给站点,使得它们由站点间的通信(IPC)引起的开销最小。
  假定任务分解已经完成,本节讨论在适当约束条件下,寻找不一定最优却相当有效的任务分布算法。较有代表性的算法是:基于图论的、基于整数规划的、基于经验的等。这些策略的着眼点是设法减少IPC和IMC开销,以此来提高整个系统的性能。 
  较有代表性的算法有:基于图论的和基于整数规划的等。

12.5.1 基于图论的分布策略
  该分布策略的基本思想是把待分布的一组模块作为图中的结点集,并用连结两个结点的无向连线上的权表示每对模块间的IMC开销。IMC开销为0意指相应的两模块间无通信发生,因此它们在图中无连线;IMC开销为∝意指相应的两模块间通信量很大,必须分布给同一站点。假定任何一对同机模块的IPC开销为0。若把系统的总开销定义为系统的处理开销和IPC开销之和,那么,这种分布策略的目标就是去实现最小的总开销。处理开销和IPC开销都是模块到站点分布的函数。为表示模块到站点的分布,定义下面的分布矩阵X: 
  分布式操作系统
  而处理开销则由下面的Q矩阵给出: 
  Q={qi, k}, i =1,…,m; k=1,…,n
  其中qi, k表示Mi在站点Pk上的处理开销,它是该模块处理要求的度量。qi, k = ∝隐含模块Mi不可能在站点Pk上执行。
  令Ci,j表示模块Mi和Mj之间的IMC开销。于是处理给定任务的总开销T可表示为分布矩阵X的函数:
分布式操作系统
  其中,第1项表示每个模块在它的站点上的处理开销;第2项则表示非同站模块间的IPC开销。最小开销分布则是在模块通信图上执行最小分割算法来获得。

模块A B C D E F

A
B
C
D
E
F

  6 4 0 0 12
   8 12 3 0
     0 11 0
      0 0
         0

(a) IMC开销

模块P1开销P2开销A
B
C
D
E
F5
2
4
6
5
∝10 

4
3
2
4

(b) 处理开销

  6模块2站点 
  例如,考虑由站点P1,P2构成的分布式系统,提交的任务由6个模块{A, B, C, D, E, F}组成。相关的IMC开销和处理开销分别给在上图中的(a)和(b)中。根据这些信息,利用上述方法可以构成一个模块通信图(下左)。为了表示处理开销,再给下图左添加2个结点以表示可用的站点P1和P2。在P1上运行每个模块的开销(即处理开销)标在该模块结点到P2的连线上;在P2上运行每个模块的开销标在该模块结点到P1的连线上,于是得到完全图(下右)。如果在该图上执行最小分割算法,那么获得的分割情况如下右图中双线所示,这就是在2站点上对给定模块的最小开销分布。

分布式操作系统
模块通信图

分布式操作系统
完全图

  最小分割算法是:在图中画曲线,每条曲线包围1个表示站点的结点,要使各曲线所切割连线上权值的总和达到最小。这种分布策略的最大优点是它的简明性。但它也存在一些限制和不足:第一,所用的最小分割算法是一种基本的最小分割算法,它只能用于实现2~3个站点间最小开销分布。若将它扩充成处理任意数目的站点,则需要n维的最小分割算法,该算法是极其复杂的。这就限制了这种任务分布策略的应用范围;第二,这种方法既未提供表示有关存储空间或处理时间等资源方面的限制手段,也没有提供负载均衡方面的机制;第三,它没有能力去观察排队延迟的效果。当一个以上的模块分布给同一站点时,就不可避免地会出现这种延迟。
12.5.2 基于整数规划的分布策略
  该策略的主要思想是把任务分布问题概括成一种优化问题,然后利用数学上的整数规划技术去解决它。

12.6 思考与习题

  1. 在分布式操作系统中标识符系统解决什么性质的问题? 
  2. 在分布式系统中,那些对象(资源)需要命名?命名一个对象应遵循哪些必要规则? 
  3. 分布式系统中各种名字是如何存放的?各种存放方案有什么优缺点? 
  4. 名字服务器和使用名字的各站点构成客户/服务器关系,请描述这种关系,例如一个无盘工作站如何使用名字? 
  5. Internet中域名指什么?Internet的域名由哪些部分组成?各部分是怎么产生的? 
  6. 什么叫名字映射?实现名字映射有哪几种常用方法? 
  7. 如何提高名字映射的效率? 
  8. 什么是逻辑时钟?局部逻辑时钟和系统逻辑时钟有什么关系? 
  9. 什么是前发生关系?什么是全序关系? 
  10. 试讨论分布式系统中进程同步与互斥的复杂性。 
  11. 分析Lampor算法和Ricart and Agrawala算法的优缺点。 
  12. 试分析资源管理的招标算法的时间复杂性(假定有n个站点,采用全互连拓扑结构)。 
  13. 试讨论站点进程不死锁/死锁与全系统范围内进程死锁/不死锁的关系(即局部与全局的关系)。 
  14. 什么是假死锁?它是怎么产生的? 
  15. 集中式死锁检测的思想能否用于进程同步(例如设置中心进程)?说明其理由。 
  16. “死锁检测协调者”进程所在的主机若故障,则需要在另一台主机上启动协调者进程的副本。选择哪一台主机的算法称为选择算法(select atgorithm)。如果分布式系统是环形拓扑结构,请你设计针对它的选择算法(写出要点)。 
  17. 在分布式系统中,处理机有忙、闲、等待3种状态。处理机的分配与调度通常是由处理机的互相通信来实现的。可以设置一个“中心协调进程”负责处理机之间有关处理机分配事务。假定有5台处理机,请写出“中心协调进程”的主要工作。 
  18. 如果在第17题中不设“中心协调进程”,如何进行处理机分配?(提示:完全分散式的调度) 
  19. 任务分布一节中介绍了2种任务分布算法,它们各自追求的目标是什么?