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

集群系统MOSIX分析(4)

 2008-12-01 11:02:39 来源:WEB开发网   
核心提示: 根据msg,通过调用套接字操作集上的recvmsg操作从网络连接上读取数据,集群系统MOSIX分析(4)(4),它读的是字节流,并没有格式的,如果连接中存在隐藏数据(COMM_HIDEDATA),则data指向隐藏数据缓冲区, comm_recv() :接收消息头int comm_recv

根据msg,通过调用套接字操作集上的recvmsg操作从网络连接上读取数据。它读的是字节流,并没有格式的。

comm_recv() :接收消息头

int comm_recv(void **headp, int *hlen)

如果当前进程的连接处于等待接受连接请求状态(COMM_WAITACCEPT),则等待直到接受请求。然后通过comm_dorecv()接收消息头长度(COMM_HLEN)的数据,得到消息头的实际长度(hlen+olen),然后准备空间存放消息头数据(comm_mkhead),再通过comm_dorecv()接收实际的消息头数据,并根据其中的信息,调用不同的解压处理程序。因为为了减少传输的数据量,消息数据发送前都经过了压缩。

如果有数据COMM_MFDATA,则将数据长度保存在连接的数据长度中(mlink->dlen = header.dlen),这样,随后调用comm_copydata和comm_recvdata时,我们将知道应该能够从网络中读取多少数据。

comm_copydata():从消息中拷贝数据

int comm_copydata(void *data, int len, int uspace) 返回0表示成功。

从消息中拷贝长度为len的数据。读入的数据保存在data指向的buffer中。Uspace表明data是指向用户空间还是内核空间。成功时返回0。

如果要data指向用户空间(uspace),且会导致远程page-fault(!dirty_all_remote_pages),则返回内存不足错误。

如果连接中不存在数据,但是隐藏数据缓冲区不为空,则从隐藏数据缓冲区拷贝len长数据到data中。否则则通过comm_dorecv函数从网络中读取数据。

comm_recvdata():从连接中将所有数据读取到已分配缓冲区中/*

int comm_recvdata(void **data) 返回0表示成功。

如果连接中存在隐藏数据(COMM_HIDEDATA),则data指向隐藏数据缓冲区,然后置连接的隐藏数据缓冲区为NULL。

上一页  1 2 3 4 5  下一页

Tags:集群 MOSIX

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