[发明专利]基于Rsockets协议的零拷贝数据传输方法在审
申请号: | 202110399487.5 | 申请日: | 2021-04-14 |
公开(公告)号: | CN113064846A | 公开(公告)日: | 2021-07-02 |
发明(设计)人: | 黄旺;刘亚萍;张硕 | 申请(专利权)人: | 中南大学;鹏城实验室 |
主分类号: | G06F13/28 | 分类号: | G06F13/28;H04L29/06 |
代理公司: | 湖南企企卫知识产权代理有限公司 43257 | 代理人: | 任合明 |
地址: | 410083 *** | 国省代码: | 湖南;43 |
权利要求书: | 查看更多 | 说明书: | 查看更多 |
摘要: | |||
搜索关键词: | 基于 rsockets 协议 拷贝 数据传输 方法 | ||
1.一种基于Rsockets协议的零拷贝数据传输方法,其特征在于包含以下步骤:
第一步,构建基于Rsockets协议的零拷贝数据传输系统;基于Rsockets协议的零拷贝数据传输系统由基于Rsockets协议的RDMA传输系统,内存管理模块,内存处理模块,工作请求模块组成;基于Rsockets协议的RDMA传输系统包括套接字应用,OFED库,OFED内核库以及RDMA网卡;发送端和接收端都安装有基于Rsockets协议的零拷贝数据传输系统;
基于Rsockets协议的RDMA传输系统中,套接字应用和OFED库安装在用户空间,Rsockets协议属于OFED库的一部分,OFED内核库安装在内核空间,RDMA网卡为硬件,安装在主机的PCIE插槽内;
修改Rsockets协议中的相关函数:在Rsockets协议中添加SEND发送管理函数,在Rsockets协议的rsendto函数中增加调用SEND发送管理函数的功能,SEND发送管理函数负责发送工作请求模块构造的SEND工作请求;在Rsockets协议中添加WRITE发送管理函数,在Rsockets协议的rsend函数增加调用WRITE发送管理函数的功能,WRITE发送管理函数负责发送工作请求模块构造的WRITE工作请求;Rsockets协议的rconnect函数、raccept函数、rsendto函数,rrecvfrom函数增加调用OFED库的注册物理地址内存区域函数的功能,使得具有注册物理地址内存区域的功能;在Rsockets协议中增加请求创建缓存池函数,在Rsockets协议增加调用请求创建缓存池函数的功能,请求创建缓存池函数向内存管理模块发送“创建缓存池请求”;在Rsockets协议中增加请求内存处理函数,在rsend函数和rsendto函数中增加调用请求内存处理函数的功能,请求内存处理函数向内存管理模块发送“内存处理请求”和内存地址信息;在Rsockets协议中增加请求RDMA资源函数,在rsend函数和rsendto函数增加调用请求RDMA资源函数的功能,请求RDMA资源函数向工作请求模块发送“RDMA资源请求”;在Rsockets协议中增加判断缓存池函数,在rsend函数中增加调用判断缓存池函数的功能,向内存管理模块发送“判断缓存池长度请求”;在Rsockets协议中增加WRITE处理完成事件函数,在rrecv函数增加调用WRITE处理完成事件函数的功能,负责处理WRITE工作请求的消息的接收,并向内存管理模块发送“内存映射请求”;在Rsockets协议中增加SEND处理完成事件函数,在rrecvfrom函数增加调用SEND处理完成事件函数的功能,负责处理SEND工作请求的消息的接收,SEND处理完成事件函数向内存管理模块发送“内存映射请求”;在Rsockets协议中增加请求接收工作请求函数,在rbind函数增加调用请求接收工作请求函数的功能,请求接收工作请求函数向工作请求模块发送RDMA资源和“构造接收工作请求”;在Rsockets协议增加获取工作请求函数,在rsend函数和rsendto函数增加调用获取工作请求函数的功能,获取工作请求函数向工作请求模块发送“获取工作请求”;
内存管理模块运行在用户空间,与工作请求模块,内存处理模块以及OFED库的Rsockets协议相连,负责管理套接字应用的发送缓存和接收缓存以及缓存池;缓存池仅用于存储接收的数据,并提供数据所在的物理地址使得套接字应用的接收缓存可以与消息所在的物理地址建立内存映射,直接获取数据;当内存管理模块从请求创建缓存池函数接收到“创建缓存池请求”时,向内存处理模块发送“创建缓存池请求”,并从内存处理模块接收缓存池的物理地址,当内存管理模块接收到缓存池的物理地址,向内存管理模块发送“建立内存映射请求”,并从内存处理模块接收缓存池的虚拟地址;当内存管理模块从交换缓存池地址函数接收到“交换缓存池请求”时,发送端内存管理模块和接受端内存管理模块互相交换缓存池地址信息;当内存管理模块从请求内存处理函数接收到“内存处理请求”时,向内存处理模块发送“内存处理请求”,并从内存处理模块接收到物理地址和页个数,向工作请求模块返回物理地址和页个数;当内存管理模块从判断缓存池函数接收到“判断缓存池长度请求”时,内存管理模块计算缓存池长度,将缓存池长度返回给rsend函数;内存管理模块从WRITE处理完成事件函数接收到“内存映射请求”时,向内存处理模块发送“建立内存映射请求”,并从内存处理模块接收到套接字应用的发送缓存的虚拟地址;当内存管理模块从SEND处理完成事件函数接收到“内存映射请求”时,向内存处理模块发送“建立内存映射请求”,并从内存处理模块接收到套接字应用的发送缓存的虚拟地址;
内存处理模块运行在Linux系统的内核空间,与内存管理模块相连接,由两个部分组成,一个是提供内存处理功能的系统调用处理模块,一个是提供创建缓存池和内存映射功能的字符设备;系统调用处理模块负责处理从内存管理模块接收的“内存处理请求”,向内存管理模块发送物理地址和页个数;字符设备负责处理从内存管理模块接收的“创建缓存池请求”,创建一个缓存池,向内存管理模块返回缓存池的物理地址;字符设备处理从内存管理模块接收“建立内存映射请求”,建立内存映射,向内存管理模块传递与缓存池的物理地址对应的虚拟地址;
工作请求模块运行在用户空间,与内存管理模块和Rsockets协议相连接,负责构造对应的工作请求,将工作请求交由Rsockets协议处理;工作请求模块从Rsockets协议中获取RDMA资源,从内存管理模块获取内存的物理地址和页个数,构造基于物理地址发送的工作请求,并将基于物理地址发送的工作请求发送给Rsockets协议;当工作请求模块从请求接收工作请求函数收到RDMA资源和“构造接收工作请求”时,创建RECEIVE工作请求,将RECEIVE工作请求发送给Rsockets协议;当工作请求模块从获取工作请求函数接收到“获取工作请求”时,创建工作请求结构体数组,向rsend函数或rsendto函数发送创建的工作请求结构体数组地址和数组的长度;当工作请求模块从请求RDMA资源函数接收到“RDMA资源请求”时,判断工作请求模块是否获取到了RDMA资源,如果没有获取到RDMA资源,则向Rsockets协议发送“RDMA资源请求”以获取RDMA资源;
第二步,发送端和接收端的套接字应用向Rsockets协议发送socket请求,创建RDMA资源;内存管理模块和内存处理模块相互配合创建缓存池,建立对缓存池的内存映射,方法是:
2.1发送端和接收端套接字应用调用Linux系统的socket函数,使用Rsockets协议拦截socket函数,采用Rsockets协议中的rsocket函数替代socket函数,rsocket函数调用请求创建缓存池函数,请求创建内存池函数向内存管理模块发送“创建缓存池请求”;
2.2内存管理模块收到rsocket函数的“创建缓存池请求”,打开内存处理模块的字符设备,向内存处理模块的字符设备传递“创建缓存池请求”;
2.3内存处理模块的字符设备收到“创建缓存池请求”后,创建一个物理地址连续的内存块作为缓存池,如果创建失败则显示“创建缓存池失败”,转3.32,如果创建成功,则向内存管理模块返回缓存池的物理地址和长度,转2.4;
2.4内存管理模块初始化内存管理结构体,内存管理结构体的内容包含缓存池物理地址首地址、缓存池虚拟地址首地址、长度、空闲长度、数据头指针、数据尾指针,内存管理模块将从字符设备接收的缓存池的物理地址和长度分别存入到内存管理结构体的缓存池物理地址首地址和长度中;内存管理结构体的空闲长度初始化为内存管理结构体的长度,内存管理结构体的数据头指针初始化为零,内存管理结构体的数据尾指针初始化为零;
2.5内存管理模块构造“内存映射请求”,向内存处理模块的字符设备发送“内存映射请求”,请求映射缓存池物理地址;
2.6字符设备收到“建立内存映射请求”后,根据缓存池物理地址建立内存映射,调用Linux内核的remap_pfn_range函数将缓存池的物理地址与Linux内核查找的虚拟地址建立内存映射,将与缓存池的物理地址对应的Linux内核查找的虚拟地址返回给内存管理模块,内存管理模块将虚拟地址首地址写入内存管理结构体的缓存池虚拟地址首地址;
2.7Rsockets协议的rsocket函数根据从发送端和接收端套接字应用调用的socket函数传入的参数type和protocol来确认是TCP还是UDP传输,如果是TCP传输,转2.7.1;如果是UDP传输,转2.7.2;
2.7.1如果是从发送端获取的type和protocol,说明是发送端套接字应用,转2.8;如果是从接收端获取的type和protocol,说明是接收端套接字应用,转2.11;
2.7.2如果是从发送端获取的type和protocol,说明是发送端套接字应用,转3.16;如果是从发送端获取的type和protocol,说明是接收端套接字应用,转2.14;
2.8发送端套接字应用调用Linux系统的connect函数,使用Rsockets协议拦截connect函数,采用Rsockets协议的rconnect函数替代connect函数;rconnect函数调用交换缓存池地址函数,交换缓存池地址函数向发送端的内存管理模块发送“交换缓存池请求”;
2.9发送端的内存管理模块从rconnect函数接收“交换缓存池请求”,内存管理模块将发送端的内存管理结构体A1的内容发送给接收端的内存管理模块,并等待接收端返回接收端的内存管理结构体A2,若发送端内存管理模块接收到A2,将A2存入到发送端的第二内存管理结构体B1中,B1的内容包含接收端缓存池的物理地址首地址,接收端缓存池虚拟地址首地址,长度,空闲长度,数据头指针,数据尾指针;
2.10Rsockets协议的rconnect函数调用OFED库的注册物理地址内存区域函数,注册物理地址内存区域;转第三步;
2.11接收端套接字应用调用Linux系统的accept函数,使用Rsockets协议拦截accept函数,采用Rsockets协议的raccept函数替代accept函数;raccept函数调用交换缓存池地址函数,交换缓存池地址函数向接收端的内存管理模块发送“交换缓存池请求”;
2.12接收端的内存管理模块从raccept函数接收的“交换缓存池请求”,内存管理模块从发送端内存管理模块接收A1,将A1存入到接收端的第二内存管理结构体B2中,B2的内容包含发送端缓存池物理地址首地址,发送端缓存池虚拟地址首地址,长度,空闲长度,数据头指针,数据尾指针;接收端的内存管理模块将A2发送给发送端内存管理模块;
2.13raccept函数调用OFED库的注册物理地址内存区域函数,注册物理地址内存区域;转3.30;
2.14接收端套接字应用调用bind函数,使用Rsockets协议拦截bind函数,采用Rsockets协议的rbind函数替代bind函数,rbind函数调用请求接收工作请求函数,请求接收工作请求函数向工作请求模块发送Rsockets协议的rconnect函数创建的RDMA资源和“构造接收工作请求”;
2.15工作请求模块从rbind函数接收“构造接收工作请求”和RDMA资源,构造RECEIVE工作请求,并调用OFED库的ibv_post_recv函数,将所有RECEIVE工作请求发布到网卡中;转3.31;
第三步,发送端套接字应用从其发送缓存发送数据,内存管理模块和内存处理模块处理发送缓存后得到物理地址和页个数,工作请求模块构造对应工作请求,交由RDMA网卡执行工作请求将数据发送到接收端的缓存池中,接收端的内存管理模块将接收端套接字应用的接收缓存与缓存池中数据的物理地址建立内存映射,直接拿取数据;数据成功到达接收端套接字应用;方法是:
3.1发送端套接字应用调用write或send函数发送数据,使用Rsockets协议拦截write或send函数,采用Rsockets协议的rsend函数替代write或send函数,rsend函数调用请求内存处理函数,请求内存处理函数向发送端的内存管理模块发送“内存处理请求”,“内存处理请求”包含所在套接字应用发送缓存虚拟地址首地址,发送缓存的长度;
3.2发送端内存管理模块收到“内存处理请求”和内存地址信息,内存管理模块将内存地址信息处理为“内存处理请求”,向发送端的内存处理模块的系统调用处理模块传递“内存处理请求”;
3.3发送端的系统调用处理模块收到“内存处理请求”,从“内存处理请求”中获取到套接字应用发送缓存的虚拟地址和长度,调用Linux内核的get_user_pages函数处理套接字应用的发送缓存虚拟地址和发送缓存长度,得到发送端套接字发送缓存对应的物理地址和页个数,设置每个页不可交换,并且每个页是只读,使用链表存储物理地址,将存储物理地址的链表和页个数返回给发送端的内存管理模块;
3.4发送端的内存管理模块收到发送端的内存处理模块返回的存储物理地址的链表和页个数,使用地址管理结构体的物理地址链表头指针存储包含物理地址的链表的地址,地址管理结构体的页个数存储从内存处理模块返回的页个数,地址管理结构体包含物理地址链表头指针、页个数;
3.5rsend函数调用请求RDMA资源函数,请求RDMA资源函数向发送端的工作请求模块发送“RDMA资源请求”;
3.6发送端的工作请求模块收到“RDMA资源请求”,工作请求模块判断是否已经获取RDMA资源,如果没有获取RDMA资源,向请求RDMA资源函数返回“RDMA资源请求”,请求RDMA资源函数收到“RDMA资源请求”后向发送端的工作请求模块发送RDMA资源,发送端的工作请求模块获取RDMA资源,转3.7;如果已经获取RDMA资源,则直接转3.7;
3.7发送端的工作请求模块从发送端的内存管理模块获取地址管理结构体和内存管理结构体B1,构造操作类型为WRITE的工作请求结构体,如果地址管理结构体的物理地址是连续的,转3.8;如果地址管理结构体的物理地址是离散的,转3.9;
3.8发送端的工作请求模块构造一个WRITE工作请求结构体数组,元素个数为1;设置工作请求结构体元素的源地址为地址管理结构体中的第一个物理地址,工作请求结构体元素的发送长度为地址管理结构体的页个数与Linux系统的页大小之积;转3.10
3.9发送端的工作请求模块构造一个WRITE工作请求结构体数组,数组元素个数为地址管理结构体的页个数;依次将地址管理结构体的链表的物理地址写入到工作请求结构体数组元素的源地址中,工作请求结构体数组的每个元素的发送长度为Linux系统页的大小;转3.10;
3.10rsend函数调用获取工作请求函数,获取工作请求函数向发送端的工作请求模块发送“获取工作请求”;
3.11发送端的工作请求模块获取“获取工作请求”后,向rsend函数返回工作请求结构体数组的地址和数组元素个数;rsend函数接收工作请求结构体数组地址和数组长度;
3.12rsend函数调用判断缓存池函数,向发送端的内存管理模块发送“判断缓存池长度请求”;
3.13发送端的内存管理模块收到“判断缓存池长度请求”后,判断B1的空闲长度是否大于套接字应用的发送缓存的长度,如果B1的空闲长度小于套接字应用的发送缓存的长度,将B1的空闲长度返回给rsend函数,如果B1的空闲长度大于或等于套接字应用的发送缓存的长度,将套接字应用的发送缓存的长度返回给rsend函数;
3.14rsend函数接收到3.13返回的长度,记为rsend函数的可发送长度;调用WRITE发送管理函数;
3.15WRITE发送管理函数从rsend函数获取工作请求结构体数组的地址、数组元素个数、可发送长度;对获取的工作请求结构体数组,调用OFED库的ibv_post_send函数进行处理,具体方法如下:
3.15.1WRITE发送管理函数从工作请求结构体数组取出元素,设置工作请求结构体数组元素的目的地址为B1的接收端缓存区的虚拟地址首地址,判断工作请求结构体数组元素的发送长度是否大于可发送长度,如果大于,转3.12;如果小于等于可发送长度,转3.15.2;
3.15.2WRITE发送管理函数调用OFED库的ibv_post_send函数将取出的工作请求结构体元素发送到RDMA网卡;RDMA网卡从工作请求结构体数组元素的源地址读取数据,并发送到工作请求结构体数组元素的目的地址指定位置中,RDMA网卡发送数据的长度为工作请求结构体元素的发送长度;
3.15.3WRITE发送管理函数将可发送长度减去工作请求结构体元素的发送长度,将B1的接收端缓存区虚拟地址首地址加上工作请求结构体元素的发送长度后存入B1的接收端缓存区虚拟地址首地址;转3.15.4;
3.15.4WRITE发送管理函数判断工作请求结构体数组元素是否为空,如果为空,转3.32,如果不为空,转3.15.1;
3.16发送端套接字应用调用Linux系统的sendto函数,使用Rsockets协议拦截sendto函数,采用Rsockets协议的rsendto函数替代sendto函数,rsendto函数调用OFED库的注册物理地址内存区域函数,注册物理地址内存区域,rsendto函数调用请求内存处理函数,请求内存处理函数向发送端的内存管理模块发送“内存处理请求”,“内存处理请求”包含所在套接字应用发送缓存虚拟地址首地址,发送缓存的长度;
3.17发送端的内存管理模块收到“内存处理请求”,向发送端的内存处理模块的系统调用处理模块传递“内存处理请求”;
3.18发送端的系统调用处理模块接收“内存处理请求”,系统调用处理模块从“内存处理请求”中获取到套接字应用发送缓存的虚拟地址和长度,系统调用处理模块处理套接字应用的发送缓存虚拟地址和发送缓存长度,得到对应的物理地址和页个数,设置每个页不可交换,并且设置每个页是只读,使用链表存储物理地址,将存储物理地址的链表和页个数返回给发送端的内存管理模块;
3.20发送端的内存管理模块收到发送端的内存处理模块返回的存储物理地址的链表和页个数,使用地址管理结构体的物理地址链表头指针存储包含物理地址的链表的地址,地址管理结构体的页个数存储从内存处理模块返回的页个数,地址管理结构体包含物理地址链表头指针,页个数;
3.21rsendto函数调用请求RDMA资源函数,请求RDMA资源函数向发送端的工作请求模块发送“RDMA资源请求”;
3.22发送端的工作请求模块接收到“RDMA资源请求”,判断是否已经获取RDMA资源,如果没有获取RDMA资源,向请求RDMA资源函数返回“RDMA资源请求”,请求RDMA资源函数收到“RDMA资源请求”,向发送端的工作请求模块发送Rsockets协议的rsendto函数创建的RDMA资源,发送端的工作请求模块获取RDMA资源,转3.23;如果已经获取RDMA资源,直接转3.23;
3.23发送端的工作请求模块从发送端的内存管理模块获取地址管理结构体,构造操作类型为SEND的工作请求结构体,如果地址管理结构体的物理地址是连续的,转3.24;如果地址管理结构体的物理地址是离散的,转3.25;
3.24发送端的工作请求模块构造一个SEND工作请求结构体数组,元素个数为1;设置工作请求结构体数组元素的源地址为地址管理结构体中的第一个物理地址,工作请求结构体数组元素的发送长度为地址管理结构体的页个数与Linux系统的页大小之积;转3.26;
3.25工作请求模块构造一个SEND工作请求结构体数组,元素个数为地址管理结构体的页个数;依次将地址管理结构体的链表的物理地址写入到工作请求结构体数组的元素的源地址中,工作请求结构体数组的每个元素的发送长度为Linux系统页的大小;转3.26;
3.26rsendto函数调用获取工作请求函数,获取工作请求函数向发送端的工作请求模块发送“获取工作请求”;
3.27发送端的工作请求模块获取“获取工作请求”,将工作请求结构体数组的地址和元素个数给返回给rsendto函数;
3.28rsendto函数接收工作请求结构体数组地址和数组长度;rsendto函数调用SEND发送管理函数;
3.29SEND发送管理函数从rsendto函数获取工作请求结构体数组的地址、数组长度;对获得的工作请求结构体数组,进行如下处理:
3.29.1SEND发送管理函数取出工作请求结构体数组元素;
3.29.2SEND发送管理函数调用OFED库的ibv_post_send函数,将取出的工作请求结构体数组元素发送到RDMA网卡;RDMA网卡从工作请求结构体元素的源地址读取数据,将数据发送到接收端的RDMA网卡,接收端的RDMA网卡将发送端的数据放置到RECEIVE工作请求指定的位置中;
3.29.3SEND发送管理函数判断工作请求结构体数组元素是否为空,如果为空,转3.32,如果不为空,转3.29.1;
3.30接收端套接字应用调用Linux系统的recv或者read函数接收数据,使用Rsockets协议拦截recv或read函数,采用Rsockets协议的rrecv函数替代recv或者read函数,rrecv函数调用WRITE处理完成事件函数,具体方法为:
3.30.1WRITE处理完成事件函数调用OFED库提供的ibv_poll_cq函数获取完成事件,如果获取到完成事件,解析完成事件获取数据的长度,将内存管理结构体A2的数据尾指针的长度增加数据的长度,A2的数据头指针指向数据所在首地址,转3.30.2;如果没有获取到完成事件,则显示“获取完成失败,没有数据到达”,转3.32;
3.30.2WRITE处理完成事件函数判断接收端套接字应用调用rrecv函数传入的长度是否大于3.30.1获取的数据长度,如果大于3.30.1获取的数据长度,记接收长度为数据长度,否则记接收长度为接收端套接字应用调用rrecv函数传入的长度;如果接收长度大于16KB,转3.30.3,如果接收长度小于或等于16KB,转3.30.5;
3.30.3WRITE处理完成事件函数向接收端的内存管理模块发送“内存映射请求”;接收端的内存管理模块收到“内存映射请求”,处理为“建立内存映射请求”,向接收端的内存处理模块的字符设备传递“建立内存映射请求”;
3.30.4接收端的内存处理模块的字符设备收到“建立内存映射请求”,从“建立内存映射请求”中获取虚拟地址和物理地址、数据的长度,建立虚拟地址到物理地址的内存映射;转3.30.6;
3.30.5WRITE处理完成事件函数将数据从数据所在地址拷贝到接收端套接字应用的接收缓存中;转3.30.6;
3.30.6WRITE处理完成事件函数将A2的空闲长度增加接收的长度,A2的数据头指针增加接收长度的值,套接字应用的接收缓存的长度减去接收的长度,WRITE处理完成事件函数将A2的内容写到发送端的B1中;
3.30.7WRITE处理完成事件函数判断套接字应用的接收缓存长度是否为零,如果为零,转3.32,如果不为零,转3.30.1;
3.31接收端套接字应用调用recvfrom函数,使用Rsockets协议拦截recvfrom函数,采用Rsockets协议的rrecvfrom函数替代recvfrom函数,rrecvfrom函数调用OFED库的注册物理地址内存区域函数,注册物理地址内存区域,rrecvfrom函数调用SEND处理完成事件函数,具体方法为:
3.31.1SEND处理完成事件函数调用OFED库提供的ibv_poll_cq函数获取完成事件,如果获取到完成事件,解析完成事件获取数据的长度,将内存管理结构体A2的数据尾指针的长度增加数据的长度,A2的数据头指针指向数据所在首地址,转3.31.2;如果没有获取到完成事件,则显示“获取完成事件失败,数据未到达”,转3.32;
3.31.2SEND处理完成事件函数判断接收端套接字应用调用rrecv函数传入的长度是否大于3.31.1获取的数据长度,如果大于,记接收长度为数据长度,否则接收长度为接收端套接字应用调用rrecv函数传入的长度;如果接收长度大于16KB,转3.31.3,如果接收长度小于或等于16KB,转3.31.5;
3.31.3SEND处理完成事件函数向接收端的内存管理模块发送“内存映射请求”;接收端的内存管理模块收到“内存映射请求”,处理为“建立内存映射请求”,向接收端的内存处理模块的字符设备传递“建立内存映射请求”;
3.31.4接收端的内存处理模块的字符设备收到“建立内存映射请求”,从“建立内存映射请求”中获取虚拟地址和物理地址,数据的长度,调用Linux内核的remap_pfn_range函数建立虚拟地址到物理地址的内存映射;转3.31.6;
3.31.5SEND处理完成事件函数将数据从数据所在地址拷贝到接收端的套接字应用的接收缓存中;转3.31.6;
3.31.6SEND处理完成事件函数将A2的空闲长度增加接收的长度,A2的数据头指针增加接收长度的值,套接字应用的接收缓存的长度减去接收的长度;转3.31.7;
3.31.7SEND处理完成事件函数构造RECEIVE工作请求,工作请求的目的地址为A2的数据尾指针指向的地址,工作请求的长度为接收的长度,调用OFED库的ibv_poll_cq函数将RECEIVE工作请求发布到RDMA网卡中;转3.31.8;
3.31.8SEND处理完成事件函数判断套接字应用的接收缓存长度是否为零,如果为零,转3.32,如果不为零,转3.31.1;
3.32结束。
该专利技术资料仅供研究查看技术是否侵权等信息,商用须获得专利权人授权。该专利全部权利属于中南大学;鹏城实验室,未经中南大学;鹏城实验室许可,擅自商用是侵权行为。如果您想购买此专利、获得商业授权和技术合作,请联系【客服】
本文链接:http://www.vipzhuanli.com/pat/books/202110399487.5/1.html,转载请声明来源钻瓜专利网。
- 上一篇:一种具备防振功能的继电器
- 下一篇:基于情景构建的应急预案生成方法及系统