Cisco VPP中vectors解析
- vectors 的本質
-
- 外在表現
- 為什麼定義vectors結構
- 總結
- Vectors的使用
-
- 作為正常的記憶體操作來使用
- 作為常用資料結構使用
-
- 數組
- 其他結構
vectors 的本質
外在表現
很簡單,實際上就是一個動态的可變大小數組。這個數組:
- 每個元素的大小可以變化,數組大小可以變化。進而使得其可以作為任何資料結構的存儲結構,事實上,VPP就是這樣做的,所有資料結構的存儲結構就是vectors。
- 使用者自定義頭結構,表示vectors表示的存儲結構對應的全部或部分邏輯結構的資訊。
- 利用頭部位圖表示數組某個元素是否已經被使用
- 使用者可以用C數組的通路方式通路vectors,效率極高
- 提供了一系列對vectors的操作宏,函數。
- 對vector中的資料結構,經過指針變換後,仍然保持原資料結構的通路方式。
為什麼定義vectors結構
這實際上是網絡作業系統多年實踐中得來的經驗。作為轉發協定棧:
- 需要極緻高效,
- 從1, 各子產品需要共享資料結構
- 新的特性,協定及相關的安全需求不斷出現導緻其更新永不停,
- 可移植,可維護,可擴充,可測試,可調試
- 熱插拔,主備備援轉發表資料同步及恢複
這些需求直接導緻的就是轉發協定棧程式極易出現bug,尤其是記憶體相關的bug。是以,普遍的,網絡作業系統通常自己實作一個内部的記憶體管理系統,期待更細緻的跟蹤每個子產品甚至每個資料結構的記憶體使用,但這種系統往往仍然是一個大一統方案,僅僅增加了一些公用的使用統計資訊,對每個資料結構的分析仍然要依靠各子產品做額外的開發工作。
vectors則是從基礎的存儲結構的角度出發,統一了所有資料結構的存儲結構,進而強行使得每個資料結構規範自己的記憶體管理。同時又盡量的貼近C語言記憶體使用習慣,編碼和運作都能高效化。
使用vectors後,可以僅在vectors層面即可生成程式運作時資料快照(很遺憾,這部分VPP沒有實作,個人認為cisco開源時故意拿去了這一部分)。可以利用外部程式對資料快照進行自動化分析。使得問題分析和運作時解耦,減輕在各程式子產品針對快照資料分析的開發及其帶來的一系列麻煩。同時可以使用更合适的工具進行分析,提高運作時及分析效率。
同時,vectors這種數組設計,使得資料同步及恢複可以批量copy,不但高效而且可以簡化和更好的子產品化相關程式(VPP中沒有實作)
總結
vectors本質上提供了一種針對每一種資料結構的高效的記憶體管理機制。利用vectors作為基礎存儲結構,可以有效降低程式中記憶體問題bug。并為對程式運作時資料分析,資料同步,恢複等奠定了良好的基礎。
Vectors的使用
作為正常的記憶體操作來使用
vec_resize,vec_alloc,vec_new,vec_add,vec_add1,vec_add2等都可用于正常的記憶體申請(類似malloc),統一用vec_free做記憶體釋放(類似free)。
vec_dup,vec_copy,vec_clone完成記憶體複制(類似memcpy)
vec_cmp完成記憶體比較(類似memcmp)
vec_zero完成記憶體清零(類似memset)
vec_set完成記憶體設定為某個值(memset)
作為常用資料結構使用
數組
vectors本身就是一個極佳的動态數組實作。
vec_insert ,vec_insert_elts數組内插入元素;
vec_del,vec_delete數組内删除元素;
vec_append,vec_prepend連接配接兩個數組;
其他結構
對于其他結構,必須熟悉利用數組作為存儲結構的實作方式,而且,通常會附加很多算法技巧。我将在接下來對VPP其他部分的分析中做進一步的工作。
此處大家可以考慮一下如何完成類似連結清單,二叉樹等的vec實作。給個提示,系統申請記憶體時,可以用一塊記憶體同時承載若幹個有着關系的向量。