日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

SQL Server 环形缓冲区(Ring Buffer) -- 介绍

發布時間:2025/7/14 数据库 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SQL Server 环形缓冲区(Ring Buffer) -- 介绍 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

SQL Server 環形緩沖區(Ring Buffer) -- 介紹

?

以下關于Ring Buffer的介紹轉載自:

http://zh.wikipedia.org/wiki/%E7%92%B0%E5%BD%A2%E7%B7%A9%E8%A1%9D%E5%8D%80

?

環形緩沖區(Ring Buffer),也稱作圓形緩沖區(Circular Buffer),也稱作圓形隊列(Circular Queue)循環緩沖區(Cyclic Buffer),是一種數據結構用于表示一個固定尺寸、頭尾相連的緩沖區,適合緩存數據流。

?

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

?

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

?

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

?

以下關于Ring Buffer的譯文轉載自:

http://www.cnblogs.com/shanyou/archive/2013/02/04/2891300.html

原文地址為:

http://mechanitis.blogspot.com/2011/06/dissecting-disruptor-whats-so-special.html

?

Ring Buffer 究竟是什么?


正如名字描述那樣 - 它是一個環 (圓形,首尾相接的),你可以把它當作一個緩存 (buffer),用來在一個線程上下文與另一個線程上下文之間傳遞數據。

(好吧,我是用 Paint 畫的。我嘗試畫草圖,希望強迫癥沒有摻和進來要求我畫出完美的圓和直線)。


所以基本上 Ring Buffer 就是擁有一個序號指向下一個可用元素的數組。

?

如果你持續向 buffer 中寫入數據(應該也會從里面讀數據),這個序號會一直增長,直到繞過整個環。

?

要找到數組中當前序號指向的元素,你可以用 mod 運算。

sequence mod array length = array index

因此對于上面的 Ring Buffer,這個算法就是(用 JAVA 的 mod 語法):12 % 10 = 2。很簡單。

其實圖片里畫著 10 個元素完全是一個意外。2 的 N 次方個元素會更好,因為計算機是用二進制思考的。

?

接下來呢?


如果你從 Wikipedia 查到 Circular Buffers?,你會看到它與我們的實現方式有一個重要的差別-沒有指向末尾的指針。我們只有下一個可用的序號。這是刻意的-選擇 Ring Buffer 的根本原因是需要支持可靠的消息通信。我們需要把服務發出的消息存儲起來,那么當另一個服務發來一個 NAK (拒絕應答信號)?? 說他們沒有收到消息的時候,我們可以重新發送給他們。


Ring Buffer 看起來很理想。它用序號來指出 buffer 的末尾在哪里,而且當它收到一個 NAK 信號的時候,可以重發從那一點到當前序號之間的所有消息:


我們所實現的 Ring Buffer 與傳統隊列的區別是:buffer 里的對象不會被銷毀-它們留在那兒直到下次被覆蓋寫入。這是與 Wikipedia 上的版本相比我們的實現不需要尾指針的原因。在我們的實現中,確定 Ring Buffer 是否重疊的工作,是由數據結構之外來完成的(這是生產者與消費者行為的一部分-如果你來不及等我寫博客說明它,可以自己檢出 Disruptor 代碼??)。

?

Ring Buffer 這么棒是因為...?


我們使用 Ring Buffer 這種數據結構,是因為它給我們提供了可靠的消息傳遞特性。這個理由就足夠了,不過它還有一些其他的優點。

?

首先,Ring Buffer 比鏈表要快,因為它是數組,而且有一個容易預測的訪問模式。這很不錯,對 CPU 高速緩存友好 (CPU-cache-friendly)-數據可以在硬件層面預加載到高速緩存,因此 CPU 不需要經常回到主內存 RAM 里去尋找 Ring Buffer 的下一條數據。

?

第二點,Ring Buffer 是一個數組,你可以預先分配內存,并保持數組元素永遠有效。這意味著內存垃圾收集(GC)在這種情況下幾乎什么也不用做。此外,也不像鏈表那樣每增加一條數據都要創建對象-當這些數據從鏈表里刪除時,這些對象都要被清理掉。


總結

以上是生活随笔為你收集整理的SQL Server 环形缓冲区(Ring Buffer) -- 介绍的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。