中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

什么是ringbuffer

發布時間:2021-10-20 16:32:35 來源:億速云 閱讀:320 作者:柒染 欄目:大數據

本篇文章給大家分享的是有關什么是ringbuffer,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

什么是ringbuffer

什么是ringbuffer

嗯,正如名字所說的一樣,它是一個環(首尾相接的環),你可以把它用做在不同上下文(線程、協程)間傳遞數據的buffer。

基本來說,ringbuffer擁有一個固定長度,且每個位置有一個序號,并且是連續的。

隨著你不停地填充這個buffer(可能也會有相應的讀取),這個序號會一直增長,直到繞過這個環。

一般,ringbuffer都是由數組實現,而由于其在內存上的連續性,因此性能得到了極高的提升。

從數組上看,是這樣的,不再是環形。

什么是ringbuffer

一般定義的數據結構

type RingBuffer struct{
	buffer []interface{}
	read	uint64  //讀的位置
	write	uint64  //寫的位置
	size	 uint64  //緩沖區大小
}

幾大概念:

read == write 時,緩沖區為空

(write + 1) % size == read, 緩沖區滿了

幾大困難點

繞回

ringbuffer看上去是一個環,但是實際上是一個數組,寫入到數組尾部之后需要繞回到數組首部。但是由于數據包的大小是不定大小,所以到了尾部可能會出現數據分割,包一半在尾部一半在開頭,對應的讀取的時候數據包一半在尾部,一半在開頭需要把它們合并起來。

寫入過快,釋放覆蓋

當寫入速度大于讀取速度時,新寫入數據會與未讀數據發生覆蓋,這樣就有兩種決策:覆蓋未讀數據和丟棄新寫入數據。

避免重復讀取

由于ringbuffer是通過覆蓋寫入數據,并不會刪除未讀數據,所以就通過ringbuffer中的read來判斷是否還有未讀數據。

重讀/重寫的需求

假設一個消費場景,消費是耗時的,只有當消費者確認了,這個對象已經被消費掉了,才能被釋放掉資源。這時候就需要重讀/重寫

優點

我們使用 Ring Buffer 這種數據結構,是因為它給我們提供了可靠的消息傳遞特性。

這個理由就足夠了,不過它還有一些其他的優點。

首先,Ring Buffer 比鏈表要快,因為它是數組,而且有一個容易預測的訪問模式。

CPU 高速緩存友好 (CPU-cache-friendly)-數據可以在硬件層面預加載到高速緩存,因此 CPU 不需要經常回到主內存 RAM 里去尋找 Ring Buffer 的下一條數據。

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

以上就是什么是ringbuffer,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。

向AI問一下細節
推薦閱讀:
  1. 什么是PHP
  2. 什么是python

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

西青区| 郴州市| 宣城市| 太谷县| 通山县| 瓮安县| 马关县| 简阳市| 黄冈市| 嘉善县| 平顺县| 乌什县| 汝阳县| 洛阳市| 茶陵县| 五指山市| 哈密市| 连江县| 金平| 化州市| 凌海市| 南宁市| 碌曲县| 宝丰县| 衡南县| 广灵县| 满洲里市| 兰考县| 重庆市| 宝兴县| 镇原县| 沽源县| 东台市| 青浦区| 汶上县| 连城县| 邓州市| 乡宁县| 花莲县| 隆德县| 大冶市|