集群系统MOSIX分析(4)
2008-12-01 11:02:39 来源:WEB开发网作为一个集群系统,节点之间要经常合作,不时的散布和收集负载信息,获取其它节点的情况。另外,我们也已经看到,在MOSIX中,一个迁移进程实际上是由deputy和remote两部分组成的。Deputy和remote是两个单独的进程,分别位于不同的节点,但在逻辑上,它们却是看出一个独立的进程的。它们之间经常要通过频繁的通讯来合作。因此,通信机制是至关重要的。MOSIX提供了一个连接层抽象(linker layer),在套接字接口之上封装了一层,提供了一系列类似BSD SOCKET的接口函数用于在进程间接收和发送MOSIX相关数据的。MOSIX连接是位于内核中的,对用户态进程是不可见的。
作为一个集群系统,MOSIX中的每个节点都被分配一个唯一的节点号,节点号是一个整型值,从1开始连续分配的。0表示的是当前节点。通过节点号抽象,可以很方便的定位某个节点。但是通过网络发送和接收数据,都是以IP地址来寻找节点的。因此,MOSIX系统提供了一系列函数用于在节点号和IP地址间的互相转换和匹配。每个节点在/etc/目录下都存在着一个配置文件mosix.map,保存着整个集群系统节点的IP地址信息。该文件的每一行都包含3个域,分别为节点范围的起始号,IP地址或主机名,该范围中的节点数目。例如某系统的配置文件如下:
1 172.26.4.138 1
2 172.26.4.139 2
4 MOSIX_4 1
机器MOSIX_4的IP为172.26.4.22。在这个系统中,节点1的IP为172.26.4.138。节点2,3的IP则分别为172.26.4.139,172.26.4.140。节点4的IP则为172.26.4.22。
数据结构
struct mosix_link表示一条MOSIX连接,它维持着该连接的状态和一些控制信息。定义如下:
struct mosix_link {
struct socket *sock; /* 套接字控制结构,用于通讯,通过它进行实际的网络操作*/
int flags; /* 状态标志 */
int dlen; /*悬挂数据的长度 */
int peer; /* 连接另一端的节点号*/
char *hideptr; /*指向当前隐藏数据的指针*/
char *hidebuf; /*指向隐藏数据缓冲区起始地址的指针 */
int hidelen; /* 隐藏数据的长度*/
char head[COMM_DEF_HEADSIZE]; /* 存放着消息头*/
};
struct comm_header {消息格式
unsigned short olen;//Option data length--
unsigned short hlen;
int type;
int dlen;
int regs;
int dfsalen;
};
#define COMM_HLEN (sizeof(struct comm_header))
更多精彩
赞助商链接