集群系统MOSIX分析(3)
2008-12-01 11:01:26 来源:WEB开发网进程迁移的一个主要的要求就是透明性,也就是说,系统的功能行为不应该因为进程迁移了而改变。表面上看来,透明性在基于消息的系统如Accent、Charlotte和V系统上是很容易实现的。在这些系统中,进程是通过消息通道,以一种统一的方式和其它进程以及系统交互的。只需保持消息通道,将消息转发到远程进程的新位置上即可确保透明性,这通常是通过更新消息通道端点的地址实现的。例如,Charlotte在迁移时更新地址,V则一直直到旧的不正确的地址被使用时才通过多播协议更新地址。但是,在像LINUX这样通过系统调用接口为进程提供服务的系统中,实现透明性则比较困难。
MOSIX支持单系统映象SSI(Single System Image)。单系统映象SSI(Single System Image)的概念用软件或硬件的方式给用户造成一种幻觉,使多个计算元素统一为单个计算资源。SSI系统具有如下的特性:
单系统: 用户视图是一个有多个CPU的单系统
单控制: 通过单一的接口从同一点获取服务
对称性: 用户可以在不同的结点获得相同的服务
位置透明性: 提供服务的物理设备位置透明
迁移后,进程将继续和它原有的环境相交互而独立于当前所处的节点。为了实现透明性,系统需要能够定位进程,保持用户接口;进程也不必了解它已经从一个节点迁移到另一个节点。一个简单的方法就是在进程的"home"节点上维持一个进程结构,代表该进程,并且和进程环境交互,Sprite系统就是采用这种方法来实现迁移的透明性的。在MOSIX中,用户的工作站就是该进程的"home"节点,"home"节点上代表该进程的结构被称为deputy。Deputy的概念是基于这样一个观察:只有进程的系统级是节点相关的,而用户级上下文是可迁移的。用户级上下文和系统级上下文间定义了良好的接口,可以截获它们之间的交互,并且通过网络传送这些交互动作。
在MOSIX系统的实现中,一个迁移进程是由用户级上下文(Remote:远程)和系统级上下文(Deputy:代理)这两部分组成的。Remote包含着程序代码、用户栈、数据、进程的寄存器和内存印象,是对进程在用户态运行的封装。Deputy则是对进程在内核级运行的封装,包括进程依附资源的描述和系统代码运行时的核心栈等。Deputy包括进程系统上下文具有节点依赖性的那部分,因此是不能被迁移的。在MOSIX中,进程在创建时所处的节点称为进程的唯一宿主节点(UHN:Unique Home-Node),Remote可以在不同的节点之间多次迁移,Deputy却只能保留在宿主节点上。
用户级上下文和系统级上下文之间具有良好定义的接口,在Linux中,进程只有通过系统调用才能进入核心态。因此,我们能够截获它们之间的每个互操作,并且通过网络转发操作。这功能由链接层(link layer)来实现,它拥有一个通讯通道来进行交互操作。Remote通过Deputy进行节点依赖性的工作,如环境变量和IO。如果Deputy所在节点出现故障,Remote将不能正常运行。
Deputy是远程进程在UHN上的表示体。进程的整个用户空间是驻留在远程节点上的,deputy并不拥有自己的内存映射。相反,它和内核线程很相似,共享内核的映射空间。
在许多内核活动中,例如系统调用的执行,必须在内核空间和用户空间之间互相传送数据。一般来说,这都是通过内核原语copy_to_user( )和copy_from_user()完成的。在MOSIX中,任何内核中的内存操作,如果需要访问用户空间,deputy就必须和remote通讯,请求remote传送必要的数据。一个系统调用中可能会重复好几次这样的远程拷贝操作。远程拷贝带来的开销很具体,主要在于网络延迟。为了消除不必要的远程拷贝,MOSIX实现了一个特别的cache,在初始请求系统调用时预取尽可能多的数据,deputy在调用结束时缓存部分返回给remote的数据,从而减少交互的次数。
为了防止在缺少内存映射的情况下删除和覆盖掉内存映射文件,deputy拥有一个特殊的表,表中的文件都被映射到remote内存。迁移进程的用户寄存器通常都是处于remote上下文的控制中。但是,每个寄存器或某些寄存器的组合可以临时为deputy拥有,处于deputy的操纵之下。
客户进程(remote)不能访问同一节点上中运行的其它进程(本地的或来自其它节点的),反之也一样。它们并不属于当前运行的远程节点上的任何用户,本地进程也不会向它们发送信号或操纵它们。它们的内存无法被当前节点上的进程访问,只有本地系统管理员才能把它们强制迁移出去。
当进程逻辑上处于停止或睡眠状态时,可能要执行一些MOSIX操作。进程将会在它们的"睡眠"之中运行MOSIX操作,然后继续睡眠,直到它们等待的事件发生。例如,可能当进程处于睡眠态时被完成了进程迁移。因此,MOSIX维持了一个逻辑状态,描述了其它的进程该如何看待该进程,而不是根据它此刻的瞬间状态。
更多精彩
赞助商链接