【DPDK学习路径】五、线程创建及核心绑定

        DPDK支持多线程以提高报文处理性能,充分利用多核特性。

        DPDK 用于创建多线程的接口为 rte_eal_mp_remote_launch,由rte_eal库提供。

        此函数将使用全部可能的核心以创建线程。如下所示,该函数含有三个参数,第一个参数是线程处理函数指针,第二个参数是处理函数的入参,第三个参数用于甄别是否使用主核心创建线程,有效值为SKIP_MASTER 及 CALL_MASTER,前者表示使用除了主核心以外的全部核心创建线程,后者表示使用全部核心创建线程,以四核系统为例,前者创建3个线程,后者创建4线程。

int rte_eal_mp_remote_launch(int (*f)(void *), 
    void *arg, enum rte_rmt_call_master_t call_master);

        主核心并不确定,它取决于 DPDK 程序本身是否绑定了核心,在没有绑定的情况下,DPDK程序的运行核心取决于操作系统核心调度策略以及核心使用情况,因此主核心不确定。一般核心均空闲的情况,默认使用核心0运行。

        线程一旦建立,将绑定在特定的核心当中,因此也就完成了核心的绑定。

        下面给出一个示例函数,它在四核系统中通过 rte_eal_mp_remote_launch 创建了线程,因为第三个参数置为 SKIP_MASTER,因此总共创建了三个线程,绑定在除主核心之外的其他核心上。此外,它只希望使用核心1运行,因此,其他没有绑定核心1的线程将被结束。因此,最终的结果是,此函数会在核心1上运行,并且每间隔1s输出一次核心id及线程id,而运行在核心2、3上的线程迅速结束,核心0则等待核心1上运行线程结束返回。

        程序代码为:

#include <unistd.h>
#include <pthread.h>

#include <rte_eal.h>
#include <rte_launch.h>
#include <rte_lcore.h>

#define TARGET_CORE 1

static int
main_loop(__attribute__((unused)) void *dummy){
	pthread_t thread_id;
	unsigned lcore_id = rte_lcore_id();

	if(lcore_id != TARGET_CORE){
		printf("return cause not use target core, core id:%u\n", lcore_id);
		return 0;
	}
	
	while(1){
		thread_id = pthread_self();
		lcore_id = rte_lcore_id();
		sleep(1);
		printf("coreid:%u; tid:%lu;\n", lcore_id, thread_id);
	}
	return 0;
}

int main(int argc, char *argv[]) {
	unsigned lcore_id;
    if(rte_eal_init(argc, argv) < 0){
        rte_exit(EXIT_FAILURE, "Error with eal init\n");
    }

    rte_eal_mp_remote_launch(main_loop, NULL, SKIP_MASTER);
	RTE_LCORE_FOREACH_SLAVE(lcore_id) {
		if (rte_eal_wait_lcore(lcore_id) < 0)
			return -1;
	}
	return 0;
}

        这是它某一次的运行输出:

return cause not use target core, core id:2
return cause not use target core, core id:3
coreid:1; tid:140334893885184;
coreid:1; tid:140334893885184;
coreid:1; tid:140334893885184;
coreid:1; tid:140334893885184;
......

        参考上述程序,可以用更加复杂的策略指定各个不同任务线程绑定于不同的核心上,以实现DPDK轮询的两种工作方式:运行至完成时模式及异步流水线模式,后续将会介绍。

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值