0.概括
首先通信原理十分简单,先概括一下
首先创建一个内存池,内存池中是一块一块内存,大小由我们指定。作为我们传递消息的单位。
1 | struct rte_mempool *message_pool = rte_mempool_create(_MSG_POOL, pool_size, |
我们需要指定内存池的名称,大小,元素大小,其他的不太重要看看,就好。首先由一个进程创建好这个缓冲池之后,另一个缓冲池要查找到这个缓冲池。通过下面的方式,
1 | struct rte_mempool *message_pool message_pool = rte_mempool_lookup(_MSG_POOL); |
也就是使用共享内存的方式进行通信,但是固定了每条信息的大小。我愿称之为,结合了共享内存与消息队列。
1.如何进行通信
通过无所环形队列,存放消息在内存池中的指针。
1 | struct rte_ring *send_ring = rte_ring_create(_PRI_2_SEC, ring_size, rte_socket_id(), flags); |
上面就是创建了两个消息唤醒队列,里面用于存放,消息在内存池中的地址。需要指定名称和大小。那么通信的另一端如何找到呢。
1 | struct rte_ring *recv_ring = rte_ring_lookup(_PRI_2_SEC); |
可以看到也是通过名称来寻找。而且可以发现名称调换了位置。
1.1 发送消息
1 | void *msg = NULL; |
先定义一个指针变量,然后去消息缓冲池中拿一块内存区域,起始地址赋给msg。然后将给msg指向的区域赋值过后。就把msg放进发送环形队列。
1.2 接收消息
1 | void *msg; |
先定义一个指针变量,从接收环形队列中拿到一个指针(如果有的话),然后这个指针指向的位置就是内存中的消息实体。拿到消息做处理之后。再把这个东西放回内存池。
总结,其实原理感觉非常简单,主要需要注意的就是两个进程为什么可以通过字符串来找到环形队列和内存池。其实就是同一台机器运行的dpdk程序有着同一套运行时环境。这也就是为什么如果开启第二个dpdk程序时,要指定参数—proc-type secondary 的原因。