zoukankan      html  css  js  c++  java
  • DPDK helloworld 源码阅读

    在 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
    ", 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
    ");
    
    	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 文档:

  • 相关阅读:
    多线程之volatile关键字
    多线程具体实现
    多线程的概述
    Linux基本目录机构
    Java13新特性
    CF1316D【Nash Matrix】(dfs+构造+思维)
    ego商城项目学习总结+出现问题及解决
    java.lang.OutOfMemoryError: GC overhead limit exceeded之tomcat7优化
    jsp在tomcat中更新不起作用
    js取值及赋值
  • 原文地址:https://www.cnblogs.com/ZCplayground/p/9317194.html
Copyright © 2011-2022 走看看