WEB开发网
开发学院服务器服务器方案 集群系统MOSIX分析(4) 阅读

集群系统MOSIX分析(4)

 2008-12-01 11:02:39 来源:WEB开发网   
核心提示: 否则,调用comm_malloc分配内存,集群系统MOSIX分析(4)(5),通过comm_dorecv试图将连接所有的数据(mlink->dlen)都接收放入到其中,data将指向分配的内存缓冲区,让带外数据保留在正常的输入队列中,然后调用套接字操作集上的recvmsg操作来读取这

否则,调用comm_malloc分配内存,通过comm_dorecv试图将连接所有的数据(mlink->dlen)都接收放入到其中。data将指向分配的内存缓冲区。

comm_recvfrom():接收数据报

int comm_recvfrom(void *data, int len, mosix_link *mlink, mosix_addr *from, unsigned long timo)

读取长为len的数据放在data中,from返回接收数据报的源地址。timo指明超时值,单位为微秒。返回接收数据的长度( >0)或者错误。

调用套接字操作集上的recvmsg操作来接收数据,数据报的源地址返回在from中。如果接收到数据,则通过net_to_mos检查该源地址是否属于MOSIX节点。

如果不属于MOSIX节点,则comm_recvfrom()返回错误。

comm_free() :释放不再被使用的消息头或数据。

void comm_free(void *head)

如果当前进程的该连接是COMM_INFOLINK,则释放head,返回。

首先检查head是否超出连接消息头范围。如果head指向消息头的起始地址,则标记该消息头不再被使用(~COMM_HEADINUSE)。否则释放head所指的内存空间。

comm_mkhead() :准备指定大小的消息头空间

void *comm_mkhead(int hlen)

从内核中分配hlen大小的GFP_KERNEL内存空间,mlink->head指向分配的起始地址。

comm_flushdata():清空前一个消息剩余的数据

void comm_flushdata(int dlen)

如果当前连接是隐藏数据(mlink->flags & COMM_HIDEDATA),则从隐藏数据中flush长度为dlen的数据。否则,调用comm_dorecv从连接中读取长度为dlen的数据。

comm_peek():检查该连接是否有数据悬挂

int comm_peek(void)

调用套接字操作集上的poll函数来判断是否有数据悬挂。

comm_poll():等待直到有通讯事件、中断或MOSIX事件产生

int comm_poll(int mask, int interruptible, unsigned long timo)

interruptible指明是否可以被中断,timeo设置等待超时时间。

comm_wait() :等待消息到达或者MOSIX事件产生

int comm_wait(void)

返回1表示消息到达,返回0则表示先产生了一个事件。

comm_send_urgent():使用紧急数据(OOB)发送事件通知

int comm_send_urgent(void)

紧急事件通知只能由代理发送。MOSIX中将OOB数据定为0xdb。它只发送一个字节的有效数据(0xdb),通过将msghdr的msg_flags标志位设置MSG_OOB|MSG_NOSIGNAL来表示紧急情况。

comm_test_urgent():检查是否悬挂了紧急数据(OOB)

int comm_test_urgent(void)

通过设置MSG_OOB|MSG_PEEK|MSG_DONTWAIT|MSG_NOSIGNAL属性来调用套接字操作集上的recvmsg操作来接收数据。如果接收到的长度为1且等于0xdb,则表明悬挂了紧急数据。

comm_take_urgent():从流中取出悬挂的OOB数据,以免被转化为普通数据处理

void comm_take_urgent(void)

调用者必须确保流中没有其它的数据。

首先以MSG_OOB|MSG_DONTWAIT|MSG_NOSIGNAL属性读取一字节,判断是否有OOB数据,然后设置套接字SO_OOBINLINE选项为on,让带外数据保留在正常的输入队列中。然后调用套接字操作集上的recvmsg操作来读取这一个字节的带外数据。最后关闭套接字的SO_OOBINLINE选项。

上一页  1 2 3 4 5 

Tags:集群 MOSIX

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接