在 DPDK Programmer's Guides 中的 EAL 一篇中有一个图可以很清晰地看到一个DPDK的应用程序的大致执行思路:

初始化检查CPU支持、微架构配置等完成后,执行main()函数。

  1. 第一步是 rte_eal_init(),核心初始化和启动。其中线程使用的是pthread库,创造线程,并设置CPU亲和性:DPDK通常每个核心固定一个pthread,以避免任务切换的开销。
  2. 然后是 other inits,其余对象的初始化(mbuf、mempool、ring、lpm hash table等)都应该作为主 lcore 上整体应用程序初始化的一部分来完成。
  3. rte_eal_remote_lauch(func, NULL, lcore_id),在每个逻辑核上注册一个回调函数。
  4. rte_eal_mp_wait_lcore(),等待各个线程返回。
  5. 继续其余的部分。

下面对照此思路阅读 /dpdk/examples/helloworld/main.c 这个代码:

/* SPDX-License-Identifier: BSD-3-Clause
* Copyright(c) 2010-2014 Intel Corporation
*/ #include <stdio.h>
#include <string.h>
#include <stdint.h>
#include <errno.h>
#include <sys/queue.h> #include <rte_memory.h>
#include <rte_launch.h>
#include <rte_eal.h>
#include <rte_per_lcore.h>
#include <rte_lcore.h>
#include <rte_debug.h> static int
lcore_hello(__attribute__((unused)) void *arg)
{
unsigned lcore_id;
lcore_id = rte_lcore_id(); // ⑤ 返回当前执行单元的线程ID
printf("hello from core %u\n", lcore_id);
return 0;
} int
main(int argc, char **argv)
{
int ret;
unsigned lcore_id; ret = rte_eal_init(argc, argv); // ① 初始化EAL
if (ret < 0)
rte_panic("Cannot init EAL\n"); RTE_LCORE_FOREACH_SLAVE(lcore_id) { // ② 浏览除主lcore之外的所有lcore
rte_eal_remote_launch(lcore_hello, NULL, lcore_id); // ③ 在lcore上执行函数
} lcore_hello(NULL); rte_eal_mp_wait_lcore(); // ④ 等待lcore完成工作
return 0;
}

rte_eal_init()初始化环境抽象层(EAL)。此函数仅在应用程序的main()函数中尽快在MASTER lcore上执行。

② 宏:RTE_LCORE_FOREACH_SLAVE(i) :浏览除主lcore之外的所有正在运行的lcores。

#define RTE_LCORE_FOREACH_SLAVE(i)
Value:
for (i = rte_get_next_lcore(-1, 1, 0); \
i<RTE_MAX_LCORE; \
i = rte_get_next_lcore(i, 1, 0))

rte_eal_remote_launch(lcore_hello, NULL, lcore_id);在另一个lcore上启动一个函数。应仅在MASTER lcore上执行。第一个参数是函数名,第二个参数是以什么参数执行该函数,第三个参数是逻辑核的ID。

rte_eal_mp_wait_lcore();应仅在MASTER lcore上执行,等到lcore完成它的工作。一个lcore有三种状态:WAIT、RUNNING、FINISHED,对应空闲、正在执行一个函数、执行完成。依据三个状态来协调线程的launch和wait。

rte_lcore_id() 返回执行单元的线程ID


API 文档:

DPDK helloworld 源码阅读的更多相关文章

  1. DPDK L3fwd 源码阅读

    代码部分 整个L3fwd有三千多行代码,但总体思想就是在L2fwd的基础上,增加网络层的根据 IP 地址进行路由查找的内容. main.c 文件 int main(int argc, char **a ...

  2. DPDK L2fwd 源码阅读

    代码部分 /* SPDX-License-Identifier: BSD-3-Clause * Copyright(c) 2010-2016 Intel Corporation */ #include ...

  3. DPDK flow_filtering 源码阅读

    代码部分 main.c /*- * BSD LICENSE * * Copyright 2017 Mellanox. * * Redistribution and use in source and ...

  4. DPDK flow_classify 源码阅读

    代码部分 /* SPDX-License-Identifier: BSD-3-Clause * Copyright(c) 2017 Intel Corporation */ #include < ...

  5. DPDK QoS_meter 源码阅读

    main.c /* SPDX-License-Identifier: BSD-3-Clause * Copyright(c) 2010-2016 Intel Corporation */ #inclu ...

  6. [PHP源码阅读]explode和implode函数

    explode和implode函数主要用作字符串和数组间转换的操作,比如获取一段参数后根据某个字符分割字符串,或者将一个数组的结果使用一个字符合并成一个字符串输出.在PHP中经常会用到这两个函数,因此 ...

  7. Sping学习笔记(一)----Spring源码阅读环境的搭建

    idea搭建spring源码阅读环境 安装gradle Github下载Spring源码 新建学习spring源码的项目 idea搭建spring源码阅读环境 安装gradle 在官网中下载gradl ...

  8. 【原】FMDB源码阅读(三)

    [原]FMDB源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 FMDB比较优秀的地方就在于对多线程的处理.所以这一篇主要是研究FMDB的多线程处理的实现.而 ...

  9. 【原】FMDB源码阅读(二)

    [原]FMDB源码阅读(二) 本文转载请注明出处 -- polobymulberry-博客园 1. 前言 上一篇只是简单地过了一下FMDB一个简单例子的基本流程,并没有涉及到FMDB的所有方方面面,比 ...

随机推荐

  1. MongoDB4.0+版本安装

    >>>首先要下载MongoDB软件安装包, MongoDB社区版官网下载 >>>双击msi安装文件进行安装,点击"Next" >>& ...

  2. ARM汇编语言

    ---恢复内容开始--- arm汇编语言 汇编语言是一种程序设计语言,arm处理器是一种16/32位的嵌入式RISC微处理器.一开始我把这混为一谈了.ARM汇编的特点:汇编语言,又叫助记符语言. 1) ...

  3. CMap使用方法总结

    #include <array> #ifdef _DEBUG #include <iostream> #include <fstream> using std::e ...

  4. 数据结构与算法之二叉树 ——in dart

    用dart语言实现的二叉树,实现了插入.查找.删除,中序遍历.前序.后序遍历等功能. class BinaryTree<E extends Comparable> { Node<E& ...

  5. 2_C语言中的数据类型 (一)2.1.常量和字符串常量

    2.1 常量就是在程序中不可变化的量,常量在定义的时候必须给一个初值. 1.1.1          #define 定义一个宏常量 1.1.2          const 定义一个const常量 ...

  6. JZOJ 10043 第k小数

    Description 有两个非负整数数列,元素个数分别为N和M.从两个数列中分别任取一个数相乘,这样一共可以得到NM个数,询问这NM个数中第K小数是多少. 时间限制为20ms . Input 输入文 ...

  7. IT程序员每天的困扰:这TM为啥不可以?这TM也行?

    如果有对 Python 感兴趣的程序员,可以加我们小助手的QQ:979950755 会免费送 Python 的视频教程噢! 随着IT互联网对社会的影响越来越重要,关乎人类的未来发展进程.所以现在很多媒 ...

  8. 提高你的Python编码效率的“武林秘籍”

    我用Python编程有几年了, 并且我仍然经常惊讶于Python代码可以如何的简洁,如何的 DRY . 我学到了很多小贴士和技巧,大多数来自于阅读开源项目的源代码,像Django, Flask, Re ...

  9. 原生android(一)

    一.移动APP的几种类型 1.Native APP:基于智能手机操作系统,并使用原生程序编写运行的应用程序,有IOS,Android,Windows Phone8等系统 2.Web APP:运行在智能 ...

  10. senlenium使用

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 3 ...