说明
这一篇文章主要是对DPDK中的进程间通信(Inter-Process Communication)进行介绍。
由于个人水平所限,若所写的博文中存在错误,希望大家能帮忙指出。
一,DPDK的进程间通信
前面的文章<DPDK内存的初始化过程>提到,DPDK将进程分为两种 : primary process 和secondary process。并且DPDK在单机上是一个集中式控制的系统,即主要由primary process对系统的资源(如内存,vfio container等)进行控制,而secondary process若需要申请资源,则向primary process发送申请的请求,由promary process处理请求后,将结果通知secondary process。
涉及到多个进程之间的相互协作,就必然会涉及到进程间通信(Inter-Process Communication, 缩写为IPC), 就目前阅读到的代码而言,主要采用了两种IPC的方式:共享内存通信(memory share),Socket。
DPDK在初始化时创建一个控制线程用来监听来自其他进程的消息,接收到消息后,会根据消息的类型(同步或者异步)进行不同的处理,详情见rte_mp_channel_init(), process_msg()(位于文件lib/librte_eal/common/eal_common_proc.c)。
<DPDK内存的初始化过程>提到,primary process对内存初始化后,会将一部分初始化信息写入到文件中,而secondary process在初始化时能读取此文件,这就是使用了共享内存通信的方式。
这一篇博文主要介绍DPDK中采用Socket的进程间通信方式。
二,相关结构体的说明
下面还是先对一些结构体作简单的说明 :
********************rte_eal.h********************
struct rte_mp_msg {
char name[RTE_MP_MAX_NAME_LEN]; //用来指明消息的类型
int len_param; //指明param的长度
int num_fds; //指明fds的长度
uint8_t param[RTE_MP_MAX_PARAM_LEN]; //用来存放消息的相关参数
int fds[RTE_MP_MAX_FD_NUM]; //用于进程间传递fd
};
struct rte_mp_reply {
int nb_sent; //发送出去的消息的个数
int nb_received; //收到回复的消息的个数
struct rte_mp_msg *msgs; /* caller to free */ //用于存放收到回复的消息
};
********************eal_common_proc.c********************
//消息的四种类型
enum mp_type {
MP_MSG, /* Share message with peers, will not block */
MP_REQ, /*