程序员的知识教程库

网站首页 > 教程分享 正文

DPDK深度解析:EAL的线程初始化代码解析

henian88 2024-10-20 05:58:26 教程分享 155 ℃ 0 评论

DPDK的线程初始化

DPDK是多线程运行,EAL初始化的时候,需要对线程做初始化。

包括以下:

1、 对主线程进行cpu绑定

2、 创建所需的从线程,进行从线程cpu绑定

3、 创建主线程和从线程之间的同步通道pipe

4、 检测和维护线程状态;

线程创建的流程如下图

代码解析

1、主线程cpu绑定

主线程绑定使用函数eal_thread_init_master绑定特定的core

代码调用

eal_thread_init_master(rte_config.master_lcore);

来绑定cpu

2、主线程循环创建从线程,并为从线程创建pipe、设置线程名称

创建pipe

if (pipe(lcore_config[i].pipe_master2slave) < 0)
 rte_panic("Cannot create pipe\n");
if (pipe(lcore_config[i].pipe_slave2master) < 0)
 rte_panic("Cannot create pipe\n");

pipe可以用来主从线程间消息同步,用来检测和维护线程状态。

创建从线程eal_thread_loop,从线程绑定cpu

ret = pthread_create(&lcore_config[i].thread_id, NULL,
 eal_thread_loop, NULL);

5、 从线程读pipe,死等主线程的消息

从线程创建后,会自己绑定cpu,然后等待主线程的pipe消息

代码如下

/* wait command */
 do {
 n = read(m2s, &c, 1);
 } while (n < 0 && errno == EINTR);

5、主线程给从线程注册一个空函数,并给从线程发pipe消息

主线程调用函数rte_eal_remote_launch里面实现这个功能。

由于从线程正在等主线程的消息,从线程等到主线程的pipe消息后,会执行注册的函数,

所以,这里要先注册函数,然后再发消息给从线程。

初始化阶段注册的函数为空函数,从线程执行后会立刻退出这个函数,目的是检查从线程的状态是否正确。

从线程创建后,在没收到主线程的pipe消息时,状态是WAIT;

当收到主线程pipe消息并回响应,执行空函数后,线程状态会变为FINISH;

然后从线程继续死等主线程的消息,这样初始化就完成了。

后续主线程就可以注册真正的业务处理函数了,注册后发送消息给从线程(从线程执行完空函数后继续死等主线程消息),从线程再次收到消息,执行真正的业务函数。

6、主线程完成所有从线程的第5步操作后,等待从线程的响应消息

7、从线程读取pipe消息后,给主线程回响应

回相应代码如下,用write函数实现。

/* send ack */
 n = 0;
 while (n == 0 || (n < 0 && errno == EINTR))
 n = write(s2m, &c, 1);
 if (n < 0)
 rte_panic("cannot write on configuration pipe\n");

8、从线程运行主线程注册的函数

执行代码,f为注册的函数

ret = lcore_config[lcore_id].f(fct_arg);

初始化阶段,这个函数空,直接返回,但是从线程状态发生变迁。

9、主线程收到所有从线程的消息后,继续后续初始化。

主线程继续初始换EAL。

完成EAL初始化后,会给从线程注册真正的业务执行函数,代码仍然使用函数rte_eal_remote_launch

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表