DPDK helloworld 源碼閱讀

在 DPDK Programmer's Guides 中的 EAL 一篇中有一個圖可以很清晰地看到一個DPDK的應用程序的大致執行思路:

1092156-20180716130123190-1516248864.png

初始化檢查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(); // ⑤ 返回當前執行單元的線程IDprintf("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);  // ① 初始化EALif (ret < 0)rte_panic("Cannot init EAL\n");RTE_LCORE_FOREACH_SLAVE(lcore_id) { // ② 瀏覽除主lcore之外的所有lcorerte_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 Programmer's Guides - initialization-and-core-launching
  • EAL環境抽象層 包括上文的 ①
  • CPU-multicore:lcore ②、⑤
  • CPU-multicore:launch ③、④

轉載于:https://www.cnblogs.com/ZCplayground/p/9317194.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/251248.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/251248.shtml
英文地址,請注明出處:http://en.pswp.cn/news/251248.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

javascript --- 作用域和閉包

執行環境: // 定義了變量或函數有權訪問的其他數據,決定了它們各自的行為 // 每個執行環境都有一個變量對象與之對應,執行環境中所定義的所有變量和函數都保存在變量對象中 // 某個執行環境中的所有代碼執行完畢后,該執行環境被銷毀,保存在其中的所有變量和函數定義也隨之銷毀…

異步下載圓形進度條顯示進度

圓形進度條參考鏈接即可&#xff1a;使用css3實現圓形進度條 需求點擊下載后遮罩層顯示下載進度&#xff1a; 1.圓形進度條參考以上鏈接&#xff0c;有點小瑕疵&#xff0c;可更改定位距離實現重合。 2.遮罩層&#xff1a; .lbOverlay{display: none;position: fixed;left: 0;…

javascript基本功

隱式類型轉換 var a {_default: 0,toString: function () {return a._default} } if (a 1 && a 2 && a 3) {console.log(解) } 訪問一個變量的時候進行攔截 var _default 0 Object.defineProperty(window, a, {get() {return _default} }) if (a 1 &am…

深信服筆試,抓兔子

*問題描述&#xff1a;抓兔子n個排成一排的洞&#xff0c;編號為1到n&#xff0c;兔子每天晚上會跳到相鄰的一個洞里&#xff0c;小q每天只能白天檢查其中的一個洞&#xff0c;小q會告訴你每天檢查的洞&#xff0c;分析是否一定能抓到兔子示例&#xff1a;3個洞&#xff0c;第一…

es6 --- 模塊

function foo(){var something cool;var another [1, 2, 3];function doSomething() {console.log( something );}function doAnother() {console.log( another.join( " ! " ) );} } // 是一個不明顯的閉包,doSomething()和doAnother()保持了foo的內部作用域接下來…

Java之遞歸遍歷目錄,修改指定文件的指定內容

EditProperties.java 1 package PropertiesOperation.Edit;2 3 import java.io.File;4 5 /**6 * 替換指定Porpoerties文件中的指定內容7 * 三個參數&#xff1a;8 * filePath&#xff1a;存放properties文件的目錄9 * srcStr&#xff1a;需要替換的字符串 10 * desStr&…

學習日志---7

1.復習Linux hadoop hdfs MapReduce基礎知識 1&#xff0c;列舉linux常用命令 shutdown now reboot mkdir mkdir -p touch filename rm -r filename rm -rf filename vi filename i--->可編輯狀態 esc --> : --->wq 保存退出 q! wq! cat grep find ifconfig ping user…

javascript --- 屬性描述符

從ES5開始,所有的屬性都具備了屬性描述符 var myObject {a: 2 };Object.getOwnPropertyDescriptor(myObject, "a"); //{ // value:2, // writable: true, // 可寫 // enumerable: true, // 可枚舉 // configurble: true // 可配置 //}定義屬性…

看了嗎網址鏈接

sklearn實戰-乳腺癌細胞數據挖掘&#xff08;博主親自錄制視頻&#xff09; https://study.163.com/course/introduction.htm?courseId1005269003&utm_campaigncommission&utm_sourcecp-400000000398149&utm_mediumshare # -*- coding: utf-8 -*- ""&qu…

JMeter 性能測試進階實戰

課程簡介 本課程制作的主要目的是為了讓大家快速上手 JMeter&#xff0c;期間穿插了大量主流項目中用到的技術&#xff0c;以及結合當今主流微服務技術提供了測試 Dubbo 接口、Java 工程技術具體實施方案&#xff0c;注重實踐、注意引導測試思維、拒絕枯燥的知識點羅列、善于用…

javascript --- 混入

顯示混入: function mixin(sourceObj, targetObj){for(var key in sourceObj){ // 遍歷source中的所有屬性if(!(key in targetObj)) { // 找到targetz中沒有的屬性targetObj[key] sourceObj[key];}}return targetObj; }var Vehicle {engines: 1,iginition: function() {c…

php源碼代目錄

ext :存放動態和內建模塊的目錄&#xff0c;在這里可以找到所有的php官方虧站,并且也可以在這里編寫擴展&#xff1b; main:包含php的主要宏定義; pear: PHP擴展與應用庫; sapi:包含不同服務器抽象層的代碼; TSRM&#xff1a;Zend和PHP的"線程安全資源管理器"目錄; Z…

bzoj1231 [Usaco2008 Nov]mixup2 混亂的奶牛——狀壓DP

題目&#xff1a;https://www.lydsy.com/JudgeOnline/problem.php?id1231 小型狀壓DP&#xff1b; f[i][j] 表示狀態為 j &#xff0c;最后一個奶牛是 i 的方案數&#xff1b; 所以下一個只能是和它相差大于 k 而且不在狀態中的奶牛。 代碼如下&#xff1a; #include<iostr…

JavaScript高級程序設計閱讀筆記

2020-11-15 通過初始化指定變量類型 數字-1 對象null和null的比較&#xff08;不理解&#xff09;使用局部變量將屬性查找替換為值查找&#xff08;算法復雜度&#xff09;循環的減值迭代&#xff0c;降低了計算終止條件的復雜度switch快多個變量聲明逗號隔開使用數組和對象字面…

jquery --- 監聽input框失效

使用juery監聽Input輸入的變化,并且封裝起來,如下: // html <input type"text" id‘myinput1’ /> // js function formOnById(id){let dom # id;$(dom).bind(input propertychange,()>{let item $(dom).val;console.log(item);} } formOnById(myinp…

windows任務計劃程序 坑

轉載于:https://www.cnblogs.com/kaibindirver/p/8109041.html

第三篇:函數之嵌套

1 #函數的嵌套調用&#xff1a;在調用一個函數的時&#xff0c;其內部的代碼又調用其他的函數2 # def bar():3 # print(from bar)4 #5 # def foo():6 # print(from foo)7 # bar()8 #9 # foo() 10 11 12 # def max2(x,y): 13 # if x > y: 14 # ret…

vue路由權限(結合服務端koa2)

gitee地址 一、項目初始化 vue create manager-admin // 創建vue項目// 管理員權限安裝 cnpm i -S koa2 // 下載koa2依賴 cnpm install --global koa-generator // 下載框架 koa-generator koa2 manager-server // 創建項目 cd manager-server // 進入項目 npm install // 安…

javascript --- 類、class、事件委托的編程風格

類風格: // 父類 function Widget(width, height) {this.width width || 50;this.height height || 50;this.$elem null; } Widget.prototype.render function($where) {if(this.$elem) {this.$elem.css({width: this.width "px",height: this.height "p…

在線獲取UUID

http://fir.im/udid轉載于:https://www.cnblogs.com/mtjbz/p/8116576.html