在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

ringbuffer數(shù)據(jù)結(jié)構(gòu)介紹

科技綠洲 ? 來(lái)源:Linux開發(fā)架構(gòu)之路 ? 作者:Linux開發(fā)架構(gòu)之路 ? 2023-11-13 10:44 ? 次閱讀

最近在研究srsLTE的代碼,其中就發(fā)現(xiàn)一個(gè)有意思的數(shù)據(jù)結(jié)構(gòu)------ringbuffer。

雖然,這是一個(gè)很基本的數(shù)據(jù)結(jié)構(gòu),但時(shí),它在LTE這種通信協(xié)議棧系統(tǒng)中卻大行其道,也是很容易被協(xié)議開發(fā)人員忽略的。在整個(gè)通信協(xié)議的開發(fā)團(tuán)隊(duì)中,一般會(huì)有一個(gè)平臺(tái)中間件的團(tuán)隊(duì),他們的任務(wù)是給業(yè)務(wù)部門提供高性能、高可靠性的中間件代碼,如內(nèi)存池、線程池、消息通信機(jī)制、日志系統(tǒng)等等。這篇文章就來(lái)討論下這個(gè)簡(jiǎn)約而不簡(jiǎn)單的ringbuffer。

ringbuffer數(shù)據(jù)結(jié)構(gòu)

環(huán)形緩沖器(ringr buffer),也稱作圓形隊(duì)列(circular queue),循環(huán)緩沖區(qū)(cyclic buffer),圓形緩沖區(qū)(circula buffer),是一種用于表示一個(gè)固定尺寸、頭尾相連的緩沖區(qū)的數(shù)據(jù)結(jié)構(gòu),適合緩存數(shù)據(jù)流。

在通信程序中,經(jīng)常使用環(huán)形緩沖器作為數(shù)據(jù)結(jié)構(gòu)來(lái)存放通信中發(fā)送和接收的數(shù)據(jù)。環(huán)形緩沖區(qū)是一個(gè)先進(jìn)先出的循環(huán)緩沖區(qū),可以向通信程序提供對(duì)緩沖區(qū)的互斥訪問(wèn)。

圖片

用法

圓形緩沖區(qū)的一個(gè)有用特性是:當(dāng)一個(gè)數(shù)據(jù)元素被用掉后,其余數(shù)據(jù)元素不需要移動(dòng)其存儲(chǔ)位置。相反,一個(gè)非圓形緩沖區(qū)(例如一個(gè)普通的隊(duì)列)在用掉一個(gè)數(shù)據(jù)元素后,其余數(shù)據(jù)元素需要向前搬移。換句話說(shuō),圓形緩沖區(qū)適合實(shí)現(xiàn)先進(jìn)先出緩沖區(qū),而非圓形緩沖區(qū)適合后進(jìn)先出緩沖區(qū)。

圓形緩沖區(qū)適合于事先明確了緩沖區(qū)的最大容量的情形。擴(kuò)展一個(gè)圓形緩沖區(qū)的容量,需要搬移其中的數(shù)據(jù)。因此一個(gè)緩沖區(qū)如果需要經(jīng)常調(diào)整其容量,用鏈表實(shí)現(xiàn)更為合適。

寫操作覆蓋圓形緩沖區(qū)中未被處理的數(shù)據(jù)在某些情況下是允許的。特別是在多媒體處理時(shí)。例如,音頻的生產(chǎn)者可以覆蓋掉聲卡尚未來(lái)得及處理的音頻數(shù)據(jù)。

工作機(jī)制

一般的,圓形緩沖區(qū)需要4個(gè)指針 :

  • 在內(nèi)存中實(shí)際開始位置;
  • 在內(nèi)存中實(shí)際結(jié)束位置,也可以用緩沖區(qū)長(zhǎng)度代替;
  • 存儲(chǔ)在緩沖區(qū)中的有效數(shù)據(jù)的開始位置(讀指針);
  • 存儲(chǔ)在緩沖區(qū)中的有效數(shù)據(jù)的結(jié)尾位置(寫指針)。
    讀指針、寫指針可以用整型值來(lái)表示。下例為一個(gè)未滿的緩沖區(qū)的讀寫指針:

圖片

下例為一個(gè)滿的緩沖區(qū)的讀寫指針:

圖片

區(qū)分緩沖區(qū)滿或者空

緩沖區(qū)是滿、或是空,都有可能出現(xiàn)讀指針與寫指針指向同一位置,有多種策略用于檢測(cè)緩沖區(qū)是滿、或是空。常用的做法是總是保持一個(gè)存儲(chǔ)單元為空,緩沖區(qū)中總是有一個(gè)存儲(chǔ)單元保持未使用狀態(tài)。緩沖區(qū)最多存入 size-1個(gè)數(shù)據(jù)。如果讀寫指針指向同一位置,則緩沖區(qū)為空。如果寫指針位于讀指針的相鄰后一個(gè)位置,則緩沖區(qū)為滿。這種策略的優(yōu)點(diǎn)是簡(jiǎn)單、魯棒;缺點(diǎn)是語(yǔ)義上實(shí)際可存數(shù)據(jù)量與緩沖區(qū)容量不一致,測(cè)試緩沖區(qū)是否滿需要做取余數(shù)計(jì)算。

出色的KFIFO

kfifo是一種"First In First Out “數(shù)據(jù)結(jié)構(gòu),它采用了前面提到的環(huán)形緩沖區(qū)來(lái)實(shí)現(xiàn),提供一個(gè)無(wú)邊界的字節(jié)流服務(wù)。采用環(huán)形緩沖區(qū)的好處為,當(dāng)一個(gè)數(shù)據(jù)元素被用掉后,其余數(shù)據(jù)元素不需要移動(dòng)其存儲(chǔ)位置,從而減少拷貝提高效率。更重要的是,kfifo采用了并行無(wú)鎖技術(shù),kfifo實(shí)現(xiàn)的單生產(chǎn)/單消費(fèi)模式的共享隊(duì)列是不需要加鎖同步的。

熟悉Linux內(nèi)核的讀者應(yīng)該對(duì)kfifo.c和kfifo.h并不陌生.kfifo經(jīng)過(guò)簡(jiǎn)單改進(jìn)就可以在用戶態(tài)進(jìn)行使用,筆者在實(shí)際項(xiàng)目中多次使用,經(jīng)過(guò)實(shí)踐,代碼是穩(wěn)定、可靠、高效的。

ringbuffer蘊(yùn)藏的巨大能量

消息隊(duì)列

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

當(dāng)然這里需要?jiǎng)澮粋€(gè)重點(diǎn),不同線程間需要獨(dú)立的消息隊(duì)列,來(lái)保證FIFO的無(wú)鎖特性,當(dāng)然缺點(diǎn)是會(huì)浪費(fèi)一些內(nèi)容,但是這在協(xié)議棧的開發(fā)中往往不是什么大的問(wèn)題,性能和穩(wěn)定永遠(yuǎn)是第一位的。由于FIFO通常是固定大小的數(shù)據(jù)結(jié)構(gòu)不太適合可變消息的發(fā)送,這里的技巧是隊(duì)列里面只放消息的指針,消息的內(nèi)容通常是在內(nèi)存池中申請(qǐng)不同大小的結(jié)構(gòu)。

srsLTE代碼的實(shí)現(xiàn)PDCP和RLC并不一定是以單獨(dú)的線程運(yùn)行的,但是在實(shí)際項(xiàng)目中,為了性能的考慮,通常是需要線程化的,且上下行也要線程化,且綁定不同的CPU核,來(lái)保證性能。

下圖是PDCP和RLC線程的消息隊(duì)列實(shí)例:

圖片

內(nèi)存池

內(nèi)存池在通信協(xié)議棧和很多的軟件中都是常用的技術(shù),它的好處是除了可以避免內(nèi)存碎片,更重要的一點(diǎn)是,內(nèi)存是預(yù)先申請(qǐng)的,并且自我管理,在申請(qǐng)和釋放的效率更快,這對(duì)協(xié)議棧的實(shí)現(xiàn)是十分重要的。

內(nèi)存池的實(shí)現(xiàn)在方式都是大同小異的,通常將內(nèi)存分為8字節(jié)、16字節(jié)、32字節(jié)… 1K等大小不同的內(nèi)存塊,并通過(guò)鏈表的方式進(jìn)行管理。具體的實(shí)現(xiàn)方式可以自行到github上搜索,實(shí)現(xiàn)方式都是類似的。

那么,ringbuffer和內(nèi)存池有什么關(guān)系呢?實(shí)際上,ringbuffer和內(nèi)存池的實(shí)現(xiàn)并無(wú)直接的關(guān)系,但是內(nèi)存池在實(shí)現(xiàn)上有個(gè)至關(guān)重要的問(wèn)題,那就內(nèi)存的申請(qǐng)和釋放可能不是在同一個(gè)線程中。簡(jiǎn)單的說(shuō)就是,內(nèi)存的申請(qǐng)和釋放可能存在競(jìng)爭(zhēng)的情況,通常的做法是進(jìn)行加鎖進(jìn)行保護(hù)。但是加鎖的操作可能對(duì)協(xié)議的時(shí)序產(chǎn)生不確定的影響,這對(duì)時(shí)序要求較高的協(xié)議實(shí)現(xiàn)(如CMAC)是無(wú)法接受的。

ringbuffer的優(yōu)秀的特性又一次被應(yīng)用的淋漓盡致,做法也是相當(dāng)?shù)暮?jiǎn)單,就是使用ringbuffer單生產(chǎn)/單消費(fèi)的模式的無(wú)鎖特性,釋放的線程可以將需要釋放的地址使用ringbuffer發(fā)送給申請(qǐng)的線程,由申請(qǐng)的線程進(jìn)行內(nèi)存的釋放,這就就不需要加鎖的操作,因?yàn)橥粋€(gè)線程不會(huì)出現(xiàn)并發(fā)的鏈表操作。

下圖是結(jié)合了消息隊(duì)列和內(nèi)存池技術(shù)的一次應(yīng)用,該方案是十分經(jīng)典和有效的,在很多大型的通信系統(tǒng)中都能看到這種方案的影子:

圖片

總結(jié)

本文是結(jié)合筆者的實(shí)際項(xiàng)目經(jīng)驗(yàn),介紹了ringbuffer在協(xié)議棧軟件開發(fā)中的一些應(yīng)用和技巧,主要是ringbuffer單生產(chǎn)/單消費(fèi)的模式的無(wú)鎖特性在內(nèi)存池內(nèi)存釋放和消息隊(duì)列中的應(yīng)用技巧。如果讀者也有類似的性能方面的系統(tǒng)需求,可以不妨試試 ringbuffer,性能超乎你的想象,且沒(méi)有特別復(fù)雜的算法和CPU指令集的限制。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 緩沖器
    +關(guān)注

    關(guān)注

    6

    文章

    1930

    瀏覽量

    45645
  • 數(shù)據(jù)結(jié)構(gòu)

    關(guān)注

    3

    文章

    573

    瀏覽量

    40232
  • 線程池
    +關(guān)注

    關(guān)注

    0

    文章

    57

    瀏覽量

    6893
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    數(shù)據(jù)結(jié)構(gòu)

    1.數(shù)據(jù)結(jié)構(gòu)的概念 所謂數(shù)據(jù)結(jié)構(gòu)是指由某一數(shù)據(jù)對(duì)象及該對(duì)象中所有數(shù)據(jù)成員之間的關(guān)系組成的集合。成員之間的關(guān)系有很多種,最常見的是前后件關(guān)系。 2.
    發(fā)表于 03-04 14:13

    C語(yǔ)言與數(shù)據(jù)結(jié)構(gòu)

    目錄個(gè)人介紹筆試單選題C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)計(jì)算機(jī)與操作系統(tǒng)網(wǎng)絡(luò)通信填空題C語(yǔ)言與數(shù)據(jù)結(jié)構(gòu)網(wǎng)絡(luò)通信問(wèn)答題嵌入式基礎(chǔ)知識(shí)C語(yǔ)言與數(shù)據(jù)結(jié)構(gòu)C編程一面二面功能快捷鍵合理的創(chuàng)建標(biāo)題,有助于目錄的生成如
    發(fā)表于 08-06 07:10

    數(shù)據(jù)結(jié)構(gòu)教程,下載

    1. 數(shù)據(jù)結(jié)構(gòu)的基本概念 2. 算法與數(shù)據(jù)結(jié)構(gòu)3. C語(yǔ)言的數(shù)據(jù)類型及其算法描述要點(diǎn)4. 學(xué)習(xí)算法與數(shù)據(jù)結(jié)構(gòu)的意義與方法
    發(fā)表于 05-14 17:22 ?0次下載
    <b class='flag-5'>數(shù)據(jù)結(jié)構(gòu)</b>教程,下載

    什么是數(shù)據(jù)結(jié)構(gòu)

    什么是數(shù)據(jù)結(jié)構(gòu) 1、數(shù)據(jù)類型和數(shù)據(jù)結(jié)構(gòu)·數(shù)據(jù)值:atomic data value: 不可再分解。如3、2、5等。nonatomicdata value: 可以再分解,其成分稱為
    發(fā)表于 08-13 13:56 ?1691次閱讀

    C數(shù)據(jù)結(jié)構(gòu)介紹

    C數(shù)據(jù)結(jié)構(gòu),個(gè)人收集整理了很久的資料,大家根據(jù)自己情況,有選擇性的下載吧~
    發(fā)表于 10-27 14:03 ?0次下載

    數(shù)據(jù)結(jié)構(gòu)與算法

    全國(guó)C語(yǔ)言考試公共基礎(chǔ)知識(shí)點(diǎn)——數(shù)據(jù)結(jié)構(gòu)與算法,該資料包含了有關(guān)數(shù)據(jù)結(jié)構(gòu)與算法的全部知識(shí)點(diǎn)。
    發(fā)表于 03-30 14:27 ?0次下載

    數(shù)據(jù)結(jié)構(gòu)與算法分析

    一部淺顯易懂的介紹數(shù)據(jù)結(jié)構(gòu)與算法的書籍。
    發(fā)表于 07-14 17:12 ?0次下載

    數(shù)據(jù)結(jié)構(gòu)

    數(shù)據(jù)結(jié)構(gòu)PPT教程
    發(fā)表于 02-27 16:43 ?0次下載

    數(shù)據(jù)結(jié)構(gòu)是什么_數(shù)據(jù)結(jié)構(gòu)有什么用

    數(shù)據(jù)結(jié)構(gòu)是計(jì)算機(jī)存儲(chǔ)、組織數(shù)據(jù)的方式。數(shù)據(jù)結(jié)構(gòu)是指相互之間存在一種或多種特定關(guān)系的數(shù)據(jù)元素的集合。通常情況下,精心選擇的數(shù)據(jù)結(jié)構(gòu)可以帶來(lái)更高
    發(fā)表于 11-17 14:45 ?1.6w次閱讀
    <b class='flag-5'>數(shù)據(jù)結(jié)構(gòu)</b>是什么_<b class='flag-5'>數(shù)據(jù)結(jié)構(gòu)</b>有什么用

    為什么要學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)數(shù)據(jù)結(jié)構(gòu)的應(yīng)用詳細(xì)資料概述免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是為什么要學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)數(shù)據(jù)結(jié)構(gòu)的應(yīng)用詳細(xì)資料概述免費(fèi)下載包括了:數(shù)據(jù)結(jié)構(gòu)在串口通信當(dāng)中的應(yīng)用,數(shù)據(jù)結(jié)構(gòu)在按鍵監(jiān)測(cè)
    發(fā)表于 09-11 17:15 ?13次下載
    為什么要學(xué)習(xí)<b class='flag-5'>數(shù)據(jù)結(jié)構(gòu)</b>?<b class='flag-5'>數(shù)據(jù)結(jié)構(gòu)</b>的應(yīng)用詳細(xì)資料概述免費(fèi)下載

    什么是數(shù)據(jù)結(jié)構(gòu)?為什么要學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)數(shù)據(jù)結(jié)構(gòu)的應(yīng)用實(shí)例分析

    本文檔的主要內(nèi)容詳細(xì)介紹的是什么是數(shù)據(jù)結(jié)構(gòu)?為什么要學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)數(shù)據(jù)結(jié)構(gòu)的應(yīng)用實(shí)例分析包括了:數(shù)據(jù)結(jié)構(gòu)在串口通信當(dāng)中的應(yīng)用,
    發(fā)表于 09-26 15:45 ?14次下載
    什么是<b class='flag-5'>數(shù)據(jù)結(jié)構(gòu)</b>?為什么要學(xué)習(xí)<b class='flag-5'>數(shù)據(jù)結(jié)構(gòu)</b>?<b class='flag-5'>數(shù)據(jù)結(jié)構(gòu)</b>的應(yīng)用實(shí)例分析

    數(shù)據(jù)結(jié)構(gòu)解決滑動(dòng)窗口問(wèn)題

    前文用 [單調(diào)棧解決三道算法問(wèn)題]介紹了單調(diào)棧這種特殊數(shù)據(jù)結(jié)構(gòu),本文寫一個(gè)類似的數(shù)據(jù)結(jié)構(gòu)「單調(diào)隊(duì)列」。 也許這種數(shù)據(jù)結(jié)構(gòu)的名字你沒(méi)聽過(guò),其實(shí)沒(méi)啥難的,就是一個(gè)「隊(duì)列」,只是使用了一點(diǎn)
    的頭像 發(fā)表于 04-19 10:50 ?702次閱讀
    <b class='flag-5'>數(shù)據(jù)結(jié)構(gòu)</b>解決滑動(dòng)窗口問(wèn)題

    NetApp的數(shù)據(jù)結(jié)構(gòu)是如何演變的

    混合和多云部署模型是企業(yè)IT組織的新常態(tài)。隨著這些復(fù)雜的環(huán)境,圍繞數(shù)據(jù)管理的新挑戰(zhàn)出現(xiàn)了。NetApp的數(shù)據(jù)管理愿景是一種無(wú)縫連接不同的數(shù)據(jù)結(jié)構(gòu)云,無(wú)論它們是私有環(huán)境、公共環(huán)境還是混合環(huán)境。數(shù)
    發(fā)表于 08-25 17:15 ?0次下載
    NetApp的<b class='flag-5'>數(shù)據(jù)結(jié)構(gòu)</b>是如何演變的

    epoll的基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)

    一、epoll的基礎(chǔ)數(shù)據(jù)結(jié)構(gòu) 在開始研究源代碼之前,我們先看一下 epoll 中使用的數(shù)據(jù)結(jié)構(gòu),分別是 eventpoll、epitem 和 eppoll_entry。 1、eventpoll 我們
    的頭像 發(fā)表于 11-10 10:20 ?845次閱讀
    epoll的基礎(chǔ)<b class='flag-5'>數(shù)據(jù)結(jié)構(gòu)</b>

    redis數(shù)據(jù)結(jié)構(gòu)的底層實(shí)現(xiàn)

    Redis是一種內(nèi)存鍵值數(shù)據(jù)庫(kù),常用于緩存、消息隊(duì)列、實(shí)時(shí)數(shù)據(jù)分析等場(chǎng)景。它的高性能得益于其精心設(shè)計(jì)的數(shù)據(jù)結(jié)構(gòu)和底層實(shí)現(xiàn)。本文將詳細(xì)介紹Redis常用的
    的頭像 發(fā)表于 12-05 10:14 ?665次閱讀
    主站蜘蛛池模板: 四虎国产精品永久在线网址 | 91久久麻豆 | 成人午夜大片免费7777 | 99久久精品费精品国产一区二区 | 国产香蕉一区二区精品视频 | 欧美日韩国产另类一区二区三区 | 深夜在线视频免费网址 | 免费一级特黄 | 伊人99在线 | 免看乌克兰a一级 | 日本一级成人毛片免费观看 | avtt国产| 天堂一区二区三区在线观看 | 男人边吃奶边爱边做视频日韩 | 欧美三级网 | qyule亚洲精品 | 亚洲精品综合网在线8050影院 | 四虎中文 | 色噜噜亚洲精品中文字幕 | 欧美色图首页 | 欧美日韩生活片 | 最好看的2019中文字幕免费高清 | 男人在线网站 | 国产美女叼嘿视频免费看 | 综合色久 | 老师别揉我胸啊嗯上课呢视频 | 黄色免费看网站 | 免费爱爱网 | 日本特黄绿像大片免费看 | 中文4480yy私人免费影院 | 天天躁天天爽 | 丁香啪啪天堂激情婷婷 | 97人人干| 亚洲天堂视频在线播放 | 色视频网站免费 | 白嫩美女一级高清毛片免费看 | 成人免费看黄网站无遮挡 | 亚洲成综合人影院在院播放 | 天天拍天天干天天操 | 夜夜爽爽爽 | 青青热久久国产久精品秒播 |