色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

ringbuffer數據結構介紹

科技綠洲 ? 來源:Linux開發架構之路 ? 作者:Linux開發架構之路 ? 2023-11-13 10:44 ? 次閱讀

最近在研究srsLTE的代碼,其中就發現一個有意思的數據結構------ringbuffer。

雖然,這是一個很基本的數據結構,但時,它在LTE這種通信協議棧系統中卻大行其道,也是很容易被協議開發人員忽略的。在整個通信協議的開發團隊中,一般會有一個平臺中間件的團隊,他們的任務是給業務部門提供高性能、高可靠性的中間件代碼,如內存池、線程池、消息通信機制、日志系統等等。這篇文章就來討論下這個簡約而不簡單的ringbuffer。

ringbuffer數據結構

環形緩沖器(ringr buffer),也稱作圓形隊列(circular queue),循環緩沖區(cyclic buffer),圓形緩沖區(circula buffer),是一種用于表示一個固定尺寸、頭尾相連的緩沖區的數據結構,適合緩存數據流。

在通信程序中,經常使用環形緩沖器作為數據結構來存放通信中發送和接收的數據。環形緩沖區是一個先進先出的循環緩沖區,可以向通信程序提供對緩沖區的互斥訪問。

圖片

用法

圓形緩沖區的一個有用特性是:當一個數據元素被用掉后,其余數據元素不需要移動其存儲位置。相反,一個非圓形緩沖區(例如一個普通的隊列)在用掉一個數據元素后,其余數據元素需要向前搬移。換句話說,圓形緩沖區適合實現先進先出緩沖區,而非圓形緩沖區適合后進先出緩沖區。

圓形緩沖區適合于事先明確了緩沖區的最大容量的情形。擴展一個圓形緩沖區的容量,需要搬移其中的數據。因此一個緩沖區如果需要經常調整其容量,用鏈表實現更為合適。

寫操作覆蓋圓形緩沖區中未被處理的數據在某些情況下是允許的。特別是在多媒體處理時。例如,音頻的生產者可以覆蓋掉聲卡尚未來得及處理的音頻數據。

工作機制

一般的,圓形緩沖區需要4個指針 :

  • 在內存中實際開始位置;
  • 在內存中實際結束位置,也可以用緩沖區長度代替;
  • 存儲在緩沖區中的有效數據的開始位置(讀指針);
  • 存儲在緩沖區中的有效數據的結尾位置(寫指針)。
    讀指針、寫指針可以用整型值來表示。下例為一個未滿的緩沖區的讀寫指針:

圖片

下例為一個滿的緩沖區的讀寫指針:

圖片

區分緩沖區滿或者空

緩沖區是滿、或是空,都有可能出現讀指針與寫指針指向同一位置,有多種策略用于檢測緩沖區是滿、或是空。常用的做法是總是保持一個存儲單元為空,緩沖區中總是有一個存儲單元保持未使用狀態。緩沖區最多存入 size-1個數據。如果讀寫指針指向同一位置,則緩沖區為空。如果寫指針位于讀指針的相鄰后一個位置,則緩沖區為滿。這種策略的優點是簡單、魯棒;缺點是語義上實際可存數據量與緩沖區容量不一致,測試緩沖區是否滿需要做取余數計算。

出色的KFIFO

kfifo是一種"First In First Out “數據結構,它采用了前面提到的環形緩沖區來實現,提供一個無邊界的字節流服務。采用環形緩沖區的好處為,當一個數據元素被用掉后,其余數據元素不需要移動其存儲位置,從而減少拷貝提高效率。更重要的是,kfifo采用了并行無鎖技術,kfifo實現的單生產/單消費模式的共享隊列是不需要加鎖同步的。

熟悉Linux內核的讀者應該對kfifo.c和kfifo.h并不陌生.kfifo經過簡單改進就可以在用戶態進行使用,筆者在實際項目中多次使用,經過實踐,代碼是穩定、可靠、高效的。

ringbuffer蘊藏的巨大能量

消息隊列

ringbuffer的一個天生的高性能的消息隊列,特別是在單生產/單消費的模式下,它是無鎖的,這點非常重要。之前的文章曾介紹過,LTE的協議棧實現對時序是敏感的,這意味著代碼的執行不能有阻塞的風險,而線程間的通信幾乎是協議棧中必須的基本功能。因此,用ringbuffer去實現一個高性能的消息隊列是一種非常理想的方案。當然,由于不同的線程的運行模型不同,例如PDCP線程屬于包驅動的線程,大部分時間它是屬于阻塞的,當有數據到達,如RRC可以通過消息隊列給PDCP發送一個消息,這個時候需要喚醒PDCP進行處理,這個是屬于線程同步的技術范疇,可以通過MUTEX、信號量等方案去實現。如果你的系統的Linux(rt-patch),eventfd也是不錯的選擇,eventfd優勢是可以使用poll、select、epoll等操作,這樣協議棧的線程實現的方式上較為簡潔,關鍵是eventfd性能也非常的快。

當然這里需要劃一個重點,不同線程間需要獨立的消息隊列,來保證FIFO的無鎖特性,當然缺點是會浪費一些內容,但是這在協議棧的開發中往往不是什么大的問題,性能和穩定永遠是第一位的。由于FIFO通常是固定大小的數據結構不太適合可變消息的發送,這里的技巧是隊列里面只放消息的指針,消息的內容通常是在內存池中申請不同大小的結構。

srsLTE代碼的實現PDCP和RLC并不一定是以單獨的線程運行的,但是在實際項目中,為了性能的考慮,通常是需要線程化的,且上下行也要線程化,且綁定不同的CPU核,來保證性能。

下圖是PDCP和RLC線程的消息隊列實例:

圖片

內存池

內存池在通信協議棧和很多的軟件中都是常用的技術,它的好處是除了可以避免內存碎片,更重要的一點是,內存是預先申請的,并且自我管理,在申請和釋放的效率更快,這對協議棧的實現是十分重要的。

內存池的實現在方式都是大同小異的,通常將內存分為8字節、16字節、32字節… 1K等大小不同的內存塊,并通過鏈表的方式進行管理。具體的實現方式可以自行到github上搜索,實現方式都是類似的。

那么,ringbuffer和內存池有什么關系呢?實際上,ringbuffer和內存池的實現并無直接的關系,但是內存池在實現上有個至關重要的問題,那就內存的申請和釋放可能不是在同一個線程中。簡單的說就是,內存的申請和釋放可能存在競爭的情況,通常的做法是進行加鎖進行保護。但是加鎖的操作可能對協議的時序產生不確定的影響,這對時序要求較高的協議實現(如CMAC)是無法接受的。

ringbuffer的優秀的特性又一次被應用的淋漓盡致,做法也是相當的簡單,就是使用ringbuffer單生產/單消費的模式的無鎖特性,釋放的線程可以將需要釋放的地址使用ringbuffer發送給申請的線程,由申請的線程進行內存的釋放,這就就不需要加鎖的操作,因為同一個線程不會出現并發的鏈表操作。

下圖是結合了消息隊列和內存池技術的一次應用,該方案是十分經典和有效的,在很多大型的通信系統中都能看到這種方案的影子:

圖片

總結

本文是結合筆者的實際項目經驗,介紹了ringbuffer在協議棧軟件開發中的一些應用和技巧,主要是ringbuffer單生產/單消費的模式的無鎖特性在內存池內存釋放和消息隊列中的應用技巧。如果讀者也有類似的性能方面的系統需求,可以不妨試試 ringbuffer,性能超乎你的想象,且沒有特別復雜的算法和CPU指令集的限制。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 緩沖器
    +關注

    關注

    6

    文章

    1923

    瀏覽量

    45533
  • 數據結構
    +關注

    關注

    3

    文章

    573

    瀏覽量

    40158
  • 線程池
    +關注

    關注

    0

    文章

    57

    瀏覽量

    6866
收藏 人收藏

    評論

    相關推薦

    數據結構

    1.數據結構的概念 所謂數據結構是指由某一數據對象及該對象中所有數據成員之間的關系組成的集合。成員之間的關系有很多種,最常見的是前后件關系。 2.
    發表于 03-04 14:13

    C語言與數據結構

    目錄個人介紹筆試單選題C語言數據結構計算機與操作系統網絡通信填空題C語言與數據結構網絡通信問答題嵌入式基礎知識C語言與數據結構C編程一面二面功能快捷鍵合理的創建標題,有助于目錄的生成如
    發表于 08-06 07:10

    數據結構教程,下載

    1. 數據結構的基本概念 2. 算法與數據結構3. C語言的數據類型及其算法描述要點4. 學習算法與數據結構的意義與方法
    發表于 05-14 17:22 ?0次下載
    <b class='flag-5'>數據結構</b>教程,下載

    什么是數據結構

    什么是數據結構 1、數據類型和數據結構·數據值:atomic data value: 不可再分解。如3、2、5等。nonatomicdata value: 可以再分解,其成分稱為
    發表于 08-13 13:56 ?1686次閱讀

    C數據結構介紹

    C數據結構,個人收集整理了很久的資料,大家根據自己情況,有選擇性的下載吧~
    發表于 10-27 14:03 ?0次下載

    數據結構與算法

    全國C語言考試公共基礎知識點——數據結構與算法,該資料包含了有關數據結構與算法的全部知識點。
    發表于 03-30 14:27 ?0次下載

    數據結構與算法分析

    一部淺顯易懂的介紹數據結構與算法的書籍。
    發表于 07-14 17:12 ?0次下載

    數據結構

    數據結構PPT教程
    發表于 02-27 16:43 ?0次下載

    數據結構是什么_數據結構有什么用

    數據結構是計算機存儲、組織數據的方式。數據結構是指相互之間存在一種或多種特定關系的數據元素的集合。通常情況下,精心選擇的數據結構可以帶來更高
    發表于 11-17 14:45 ?1.6w次閱讀
    <b class='flag-5'>數據結構</b>是什么_<b class='flag-5'>數據結構</b>有什么用

    為什么要學習數據結構數據結構的應用詳細資料概述免費下載

    本文檔的主要內容詳細介紹的是為什么要學習數據結構數據結構的應用詳細資料概述免費下載包括了:數據結構在串口通信當中的應用,數據結構在按鍵監測
    發表于 09-11 17:15 ?13次下載
    為什么要學習<b class='flag-5'>數據結構</b>?<b class='flag-5'>數據結構</b>的應用詳細資料概述免費下載

    什么是數據結構?為什么要學習數據結構數據結構的應用實例分析

    本文檔的主要內容詳細介紹的是什么是數據結構?為什么要學習數據結構數據結構的應用實例分析包括了:數據結構在串口通信當中的應用,
    發表于 09-26 15:45 ?14次下載
    什么是<b class='flag-5'>數據結構</b>?為什么要學習<b class='flag-5'>數據結構</b>?<b class='flag-5'>數據結構</b>的應用實例分析

    數據結構解決滑動窗口問題

    前文用 [單調棧解決三道算法問題]介紹了單調棧這種特殊數據結構,本文寫一個類似的數據結構「單調隊列」。 也許這種數據結構的名字你沒聽過,其實沒啥難的,就是一個「隊列」,只是使用了一點
    的頭像 發表于 04-19 10:50 ?666次閱讀
    <b class='flag-5'>數據結構</b>解決滑動窗口問題

    NetApp的數據結構是如何演變的

    混合和多云部署模型是企業IT組織的新常態。隨著這些復雜的環境,圍繞數據管理的新挑戰出現了。NetApp的數據管理愿景是一種無縫連接不同的數據結構云,無論它們是私有環境、公共環境還是混合環境。
    發表于 08-25 17:15 ?0次下載
    NetApp的<b class='flag-5'>數據結構</b>是如何演變的

    epoll的基礎數據結構

    一、epoll的基礎數據結構 在開始研究源代碼之前,我們先看一下 epoll 中使用的數據結構,分別是 eventpoll、epitem 和 eppoll_entry。 1、eventpoll 我們
    的頭像 發表于 11-10 10:20 ?817次閱讀
    epoll的基礎<b class='flag-5'>數據結構</b>

    redis數據結構的底層實現

    Redis是一種內存鍵值數據庫,常用于緩存、消息隊列、實時數據分析等場景。它的高性能得益于其精心設計的數據結構和底層實現。本文將詳細介紹Redis常用的
    的頭像 發表于 12-05 10:14 ?630次閱讀
    主站蜘蛛池模板: 国产综合欧美区在线| 强奸日本美女小游戏| 午夜福利电影| 国产精品久久久久久人妻精品蜜桃 | 最近中文字幕MV高清在线| 男人插女人逼逼| 高清 仑乱 一级 a| 亚洲色欲色欲WWW在线丝| 欧美成a人片免费看久久| 国产精品久久久久秋霞影视| 曰曰夜夜在线影院视| 日韩高清一区二区三区不卡| 精品国产国产综合精品| WWW国产色情在线观看APP| 亚洲国产日韩欧美高清片a| 免费果冻传媒在线完整观看| 国产精品嫩草久久久久| 最新高清无码专区在线视频| 天天综合亚洲综合网站| 两性午夜刺激爽爽视频| 国产成人亚洲综合无| 中文字幕无码一区二区免费 | 果冻传媒2021在线观看| 99九九精品视频| 亚洲日韩欧美国产中文在线| 热热久久超碰精品中文字幕| 寂寞夜晚看免费视频| 成人国产在线不卡视频| 野花日本韩国视频免费高清观看 | 色呦呦导航| 免费xxx成年大片| 黄色直接观看| 国产成人理在线观看视频| 2019香蕉在线观看直播视频 | 又紧又大又爽精品一区二区| 色综合久久网女同蕾丝边| 伦理在线影院伦理电影| 好色女博士| 国产成人在线视频观看| 999久久免费高清热精品| 亚洲一区综合图区|