网站首页 > 教程分享 正文
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
猜你喜欢
- 2024-10-20 C++进程间通信--命名管道通信代码实现及其原理图示
- 2024-10-20 自动化运维开发日志: 升级到DC域控制器
- 2024-10-20 Oracle PL/SQL进阶编程(第七弹:使用系统包:DBMS_PIPE)
- 2024-10-20 6000+字,30+张图。JAVA线上故障排查全套路总结
- 2024-10-20 攻击中东地区的DNSpionage活动分析
- 2024-10-20 react 最新版本解决了什么问题 加了哪些东西
- 2024-10-20 java并发编程之进程与线程(java线程并发工具类)
- 2024-10-20 记一次 .NET某汽车零件采集系统 卡死分析
- 2024-10-20 Net 高级调试之七:线程操作相关命令介绍
- 2024-10-20 STAYIN’ ALIVE ——针对亚洲电信和政府部门的针对性攻击
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- css导航条 (66)
- sqlinsert (63)
- js提交表单 (60)
- param (62)
- parentelement (65)
- jquery分享 (62)
- check约束 (64)
- curl_init (68)
- sql if语句 (69)
- import (66)
- chmod文件夹 (71)
- clearinterval (71)
- pythonrange (62)
- 数组长度 (61)
- javafx (59)
- 全局消息钩子 (64)
- sort排序 (62)
- jdbc (69)
- php网页源码 (59)
- assert h (69)
- httpclientjar (60)
- postgresql conf (59)
- winform开发 (59)
- mysql数字类型 (71)
- drawimage (61)
本文暂时没有评论,来添加一个吧(●'◡'●)