DPDK程式設計指南 2(概述)

2021-09-20 03:27:17 字數 1990 閱讀 6563

本章節給出了dpdk架構的乙個全域性概述。

dpdk的主要目的就是為資料面快速報文處理應用程式提供乙個簡潔完整的框架。使用者可以通過**來理解其中使用的一些技術,構建自己的應用程式或新增自己的協議棧。可用的使用dpdk供選擇的生態系統選項。

通過建立環境抽象層(eal),dpdk框架為每個特殊的環境建立了一組執行庫。這個庫特定於intel架構(32或64位),linux*使用者空間編譯器或其他特定的平台。這些環境通過一些makefile和配置檔案建立。一旦eal庫編譯完成,使用者可以通過鏈結這些庫來構建自己的應用程式。除了eal,還有一些其他的庫,包括雜湊演算法、最長字首匹配、環形緩衝區等。提供了一些應用程式例項來指導使用者如何使用dpdk的各種特性。

dpdk實現了報文處理的rtc模型,在這種模型中,資料面應用程式在呼叫之前必須預先分配好所有的資源,並作為執行單元執行在邏輯核上。這種模型並不支援排程,且所有的裝置通過輪詢的方式訪問。不使用中斷方式的主要原因就是中斷處理增加了效能開銷。

作為rtc模型的擴充套件,通過使用ring在不同邏輯核之間傳遞報文和訊息,也可以實現報文處理的流水線模型(pipeline)。流水線模型允許操作分階段進行,在多核**執行中可能更高效。

當指定環境和架構的庫編譯出來時,這些庫就可以用於建立我們自己的資料面處理程式。

建立linux使用者空間應用程式時,需要用到glibc庫。對於dpdk應用程式,必須使用兩個全域性環境變數(rte_sdk和rte_target),這兩個變數需要在編譯應用程式之前配置好:

export rte_sdk=/home/user/dpdk
環境抽象層為應用程式和庫提供了通用的介面,隱藏了底層環境細節。eal提供的服務有:

eal更詳細的描述請參閱本文件「環境抽象層」章節。

核心元件是一系列為高效能包處理程式提供所有必須元素的函式庫。核心元件及其之間的關係如下圖所示:

ring資料結構提供了乙個無鎖的多生產者,多消費者的fifo表處理介面。相對於無鎖佇列來講,它容易部署,適合大量的操作,而且更快。ring庫在「記憶體池庫(librte_mempool)」中使用,而且,ring還用於不同邏輯核上處理單元之間的通訊。

環形緩衝區及其使用可以參考章節「環形緩衝區庫」描述。

記憶體池管理的主要職責就是在記憶體中分配指定數目物件的pool。每個pool以名稱來唯一標識,並且使用乙個ring來儲存空閒的物件節點。它還提供了一些其他的服務,如物件節點的每核快取備份,及自動對齊以保證物件能夠均衡分布到記憶體通道上。

記憶體池分配器的具體行為請參考章節「記憶體池庫」描述。

報文緩衝區庫提供了建立和銷毀報文緩衝區的能力,dpdk應用程式中使用這些緩衝區來儲存訊息。這些緩衝區通常在程式開始時通過dpdk的記憶體池庫(librte_mempool)申請並儲存在記憶體池中。緩衝區庫(librte_mbuf)提供了報文申請和釋放的api,通常情況下,訊息buffer用於快取訊息,報文buffer用於快取網路報文。

報文緩衝區管理的具體行為請參考章節「緩衝區庫」描述。

這個庫位dpdk的執行單元提供了定時器服務,為函式非同步執行提供支援。定時器可以設定成週期呼叫,或者只呼叫一次。使用eal提供的介面可以獲取高精度時鐘,並且能在每個核上根據需要初始化。

具體請參考章節「定時器庫」描述。

dpdk的pmd驅動支援1g、10g、40g。 同時dpdk提供被設計成非非同步,基於中斷訊號機制的虛擬化virtio乙太網控制器。

詳細內容參考 章節「輪詢模式驅動」描述。

dpdk提供了雜湊(librte_hash)、最長字首匹配(librte_lpm)演算法庫用於支援相應的分組**演算法。

詳細內容檢視章節「雜湊演算法」 和「最長字首匹配」 。

這個庫包括ip協議的一些定義及常見的巨集定義。這些定義都是基於freebsd*中ip協議棧的**,包括協議號(用於ip頭部)、ip相關的巨集、ipv4/ipv6頭部結構體以及tcp、udp和stcp頭部結構體。

Core Data 程式設計指南2

介紹 在cocoa環境下,如果你想使用資料庫 如sqlite 你可以使用sql語句的方式通過相關的工具類進行資料庫的直接操作。當然你也可以通過別人封裝之後的一些簡單框架,使得你的操作更加簡單 如fmdb bnrpersistence cocoa框架本身提供了coredata這個api可方便的讓開發者...

Posix執行緒程式設計指南 2

概念及作用 在單執行緒程式中,我們經常要用到 全域性變數 以實現多個函式間共享資料。在多執行緒環境下,由於資料空間是共享的,因此全域性變數也為所有執行緒所共有。但有時應用程式設計中有必要提供執行緒私有的全域性變數,僅在某個執行緒中有效,但卻可以跨多個函式訪問,比如程式可能需要每個執行緒維護乙個鍊錶,...

Posix執行緒程式設計指南 2

概念及作用 在單執行緒程式中,我們經常要用到 全域性變數 以實現多個函式間共享資料。在多執行緒環境下,由於資料空間是共享的,因此全域性變數也為所有執行緒所共有。但有時應用程式設計中有必要提供執行緒私有的全域性變數,僅在某個執行緒中有效,但卻可以跨多個函式訪問,比如程式可能需要每個執行緒維護乙個鍊錶,...