新聞中心
一、引言

在計(jì)算機(jī)中,緩沖區(qū)是一塊內(nèi)存區(qū)域,用于臨時(shí)緩存輸入或輸出數(shù)據(jù)。Linux的內(nèi)核中常用環(huán)形緩沖區(qū),被廣泛應(yīng)用于網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)、音視頻設(shè)備驅(qū)動(dòng)等模塊中。本文將對Linux環(huán)形緩沖區(qū)的原理及應(yīng)用進(jìn)行解析,旨在為讀者提供更深入的了解。
二、環(huán)形緩沖區(qū)的定義及特點(diǎn)
環(huán)形緩沖區(qū)指的是一塊具有大小限制的循環(huán)緩沖區(qū)。其特點(diǎn)是數(shù)據(jù)寫滿后,將覆蓋寫入最早的數(shù)據(jù),保證了緩沖區(qū)數(shù)據(jù)的實(shí)時(shí)更新。在網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)和音視頻設(shè)備驅(qū)動(dòng)模塊中,環(huán)形緩沖區(qū)的應(yīng)用是很普遍的。由于其高效性和占用空間少的優(yōu)點(diǎn),被廣泛使用。
三、環(huán)形緩沖區(qū)的實(shí)現(xiàn)原理
1.環(huán)形緩沖區(qū)的結(jié)構(gòu)
環(huán)形緩沖區(qū)由以下結(jié)構(gòu)體組成:
“`
struct ring_buffer {
int head; //寫入位置
int tl; //讀取位置
int size; //緩沖區(qū)尺寸
int empty; //緩沖區(qū)是否為空
char buffer[]; //緩沖區(qū)首地址
};
“`
其中,head表示寫入位置,tl表示讀取位置。size表示緩沖區(qū)大小,empty用于判斷緩沖區(qū)是否為空。最后是一個(gè)char類型的數(shù)組,即存放緩沖區(qū)數(shù)據(jù)的空間。該數(shù)組是通過變長數(shù)組來定義的,空間大小由參數(shù)傳入。
2.緩沖區(qū)的初始化
在實(shí)現(xiàn)緩沖區(qū)時(shí),首先需要進(jìn)行初始化。初始化過程如下:
“`
int ring_buffer_init(struct ring_buffer *ring, int size)
{
//設(shè)置緩沖區(qū)各個(gè)成員的初始值
void *buffer = malloc(size);
if(!buffer) {
return -1;
}
memset(ring, 0, sizeof(struct ring_buffer));
ring->buffer = buffer;
ring->size = size;
ring->empty = 1;
return 0;
}
“`
上述代碼中,首先通過malloc函數(shù)分配內(nèi)存空間,如果分配失敗則直接返回錯(cuò)誤。之后使用memset函數(shù)將ring_buffer結(jié)構(gòu)體中除buffer以外的成員全部初始化為0,再將緩沖區(qū)的大小、空狀態(tài)以及buffer成員的值進(jìn)行初始化。
3.緩沖區(qū)的讀寫操作
對于環(huán)形緩沖區(qū)的讀寫操作,需要考慮以下兩個(gè)場景:
(1)寫入數(shù)據(jù)時(shí),如果緩沖區(qū)已滿,則覆蓋最早寫入的數(shù)據(jù)。
(2)讀取數(shù)據(jù)時(shí),如果緩沖區(qū)為空,則等待有數(shù)據(jù)寫入。
緩沖區(qū)的寫入操作代碼如下:
“`
static int ring_buffer_write(struct ring_buffer *ring, const char *data, int len)
{
int size = ring->size;
int count = 0;
while(len) {
//計(jì)算可以寫入數(shù)據(jù)的空間
int avl = ring->head – ring->tl;
if(avl
avl = size + avl;
}
//如果緩沖區(qū)已滿,則覆蓋最早的數(shù)據(jù)
if(avl == size – 1) {
ring->tl = (ring->tl + 1) % size;
count++;
continue;
}
//計(jì)算可寫入數(shù)據(jù)長度
int empty = size – avl – 1;
int n = len
//寫入數(shù)據(jù)到緩沖區(qū)
memcpy(ring->buffer + ring->head, data, n);
ring->head = (ring->head + n) % size;
len -= n;
data += n;
ring->empty = 0;
count++;
}
return count;
}
“`
緩沖區(qū)的讀取操作代碼如下:
“`
static int ring_buffer_read(struct ring_buffer *ring, char *data, int len)
{
int size = ring->size;
int count = 0;
while(len) {
//計(jì)算可以讀取的數(shù)據(jù)長度
int avl = ring->head – ring->tl;
if(avl
avl = size + avl;
}
//如果緩沖區(qū)為空,則等待有數(shù)據(jù)寫入
if(avl == 0 && ring->empty) {
continue;
}
//計(jì)算可讀取數(shù)據(jù)的長度
int n = len
//將數(shù)據(jù)從緩沖區(qū)中讀取到buffer
memcpy(data, ring->buffer + ring->tl, n);
ring->tl = (ring->tl + n) % size;
len -= n;
data += n;
//如果緩沖區(qū)為空,則設(shè)置狀態(tài)
if(avl == n) {
ring->empty = 1;
}
count++;
}
return count;
}
“`
四、應(yīng)用場景
1. 網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)
在Linux設(shè)備驅(qū)動(dòng)中,網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)是一類適合使用環(huán)形緩沖區(qū)的模塊。網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)需要進(jìn)行數(shù)據(jù)交換,而且通常在數(shù)據(jù)到達(dá)時(shí)并不知道需要的長度,這時(shí)候使用環(huán)形緩沖區(qū)能夠很好地解決這個(gè)問題。在Linux內(nèi)核中,TCP/IP協(xié)議棧中的rx_ring和tx_ring都是基于環(huán)形緩沖區(qū)實(shí)現(xiàn)的。
2. 音視頻設(shè)備驅(qū)動(dòng)
音視頻設(shè)備驅(qū)動(dòng)同樣需要使用緩沖區(qū)對數(shù)據(jù)進(jìn)行存儲和交換。在這種情況下,使用環(huán)形緩沖區(qū)能夠比較好地解決速度不一致的問題。例如,當(dāng)音頻設(shè)備的輸入速度比輸出速度慢時(shí),使用環(huán)形緩沖區(qū)能夠保證數(shù)據(jù)不會因?yàn)榫彌_區(qū)大小的限制而丟失。
五、
本文對Linux環(huán)形緩沖區(qū)的定義、實(shí)現(xiàn)原理及應(yīng)用場景進(jìn)行了詳細(xì)介紹。環(huán)形緩沖區(qū)作為一種高效、占用空間少的數(shù)據(jù)結(jié)構(gòu),在網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)、音視頻設(shè)備驅(qū)動(dòng)等模塊中被廣泛應(yīng)用。對于使用操作系統(tǒng)的程序員來說,掌握環(huán)形緩沖區(qū)的原理及其應(yīng)用場景是十分重要的。
相關(guān)問題拓展閱讀:
- Linux中的緩沖區(qū)和緩存內(nèi)存有什么區(qū)別
- ArcGis中緩沖區(qū)是干什么用的
- 環(huán)形緩沖區(qū)大小和反寫閾值
Linux中的緩沖區(qū)和緩存內(nèi)存有什么區(qū)別
在Linux系統(tǒng)下,我們一般不需要去釋放內(nèi)存,因?yàn)橄到y(tǒng)已經(jīng)將內(nèi)存管理的很好。但是凡事也有例拿枝爛外,有的時(shí)候內(nèi)存會被緩存占用掉,導(dǎo)致系統(tǒng)使用SWAP空間影響性能,此時(shí)就需要執(zhí)行釋放內(nèi)存(清理緩存)的操作了。
Linux系統(tǒng)的緩存機(jī)制是相當(dāng)先進(jìn)的,他會針對dentry(用于VFS,加速文件路徑名到inode的轉(zhuǎn)換)、Buffer Cache(針對磁盤塊的讀寫)和Page Cache(針對文件inode的讀寫)進(jìn)行緩存操作。但是在進(jìn)行了大量文件操作之后,緩消漏存會把內(nèi)存資源基本用光。但實(shí)際上我們文件操作已經(jīng)完成,這部分緩存已經(jīng)用不到了。這個(gè)時(shí)候,我們難道只能眼睜睜的看著緩存把內(nèi)存空間占據(jù)掉么?
所以,我們還是有必要來手動(dòng)進(jìn)行Linux下釋放內(nèi)存的操作,其實(shí)也就是釋放緩存的操作了。
要達(dá)到釋放緩存的目搭檔的,我們首先需要了解下關(guān)鍵的配置文件/proc/sys/vm/drop_caches。這個(gè)文件中記錄了緩存釋放的參數(shù),默認(rèn)值為0,也就是不釋放緩存。他的值可以為0~3之間的任意數(shù)字,代表著不同的含義:
0 – 不釋放
1 – 釋放頁緩存
2 – 釋放dentries和inodes
3 – 釋放所有緩存
知道了參數(shù)后,我們就可以根據(jù)我們的需要,使用下面的指令來進(jìn)行操作。
首先我們需要使用sync指令,將所有未寫的系統(tǒng)緩沖區(qū)寫到磁盤中,包含已修改的 i-node、已延遲的塊 I/O 和讀寫映射文件。否則在釋放緩存的過程中,可能會丟失未保存的文件。
#sync
接下來,我們需要將需要的參數(shù)寫進(jìn)/proc/sys/vm/drop_caches文件中,比如我們需要釋放所有緩存,就輸入下面的命令:
#echo 3 > /proc/sys/vm/drop_caches
此指令輸入后會立即生效,可以查詢現(xiàn)在的可用內(nèi)存明顯的變多了。
要查詢當(dāng)前緩存釋放的參數(shù),可以輸入下面的指令:
#cat /proc/sys/vm/drop_caches
#free -m
對于清除swap,只有先關(guān)閉swap了,用:
#swapoff -a
而后啟用swap,因?yàn)橹皇乔宄?,不是說不要用swap的嘛 :
#swapon -a
Linux 自動(dòng)釋放內(nèi)存腳本
發(fā)表于119 天前 ? 技術(shù)文章 ? 暫無評論
腳本下載
腳本內(nèi)容:
#! /bin/bash
# cache釋放:
# To free pagecache:
sync
sync
#echo 1 > /proc/sys/vm/drop_caches
# To free dentries and inodes:
#echo 2 > /proc/sys/vm/drop_caches
# To free pagecache, dentries and inodes:
echo 3 > /proc/sys/vm/drop_caches
# 說明,釋放前更好sync一下,防止丟數(shù)據(jù)。
利用系統(tǒng)crontab實(shí)現(xiàn)每天自動(dòng)運(yùn)行:
crontab -e
輸入以下內(nèi)容:
00 00 * * * /root/Cached.sh
每天0點(diǎn)釋放一次內(nèi)存,這個(gè)時(shí)間可以根據(jù)自己需要自行設(shè)置,我的服務(wù)器情況是每天自動(dòng)釋放一次就OK了
在設(shè)置這個(gè)腳本的時(shí)候,發(fā)生了一系列的問題
在測試運(yùn)行./Cached.sh時(shí)提示錯(cuò)誤:Permission denied 權(quán)限的問題
解決方法:
chmod +x .Cached.sh
或
chmod 777 Cached.sh
接著又出現(xiàn)錯(cuò)誤提示:/bin/bash^M: bad interpreter: No such file or directory
這是因?yàn)樵趙indows下編輯的.sh文件編碼格式和linux下不一樣,轉(zhuǎn)換一下編碼格式即可:
dos2unix Cached.sh
緩沖鎮(zhèn)瞎區(qū)與特定的塊設(shè)備相肆鋒關(guān)聯(lián),包括文件系統(tǒng)元數(shù)據(jù)的緩存以及頁面跟蹤。緩存只御雹空包含已停放的文件數(shù)據(jù)。
也就是說,緩沖區(qū)記住目錄中的內(nèi)容、文件權(quán)限是什么,并跟蹤從某個(gè)塊設(shè)備中寫入或讀取到哪些內(nèi)存。
緩存只包含文件本身的內(nèi)容。
ArcGis中緩沖區(qū)是干什么用的
ArcGis中緩沖區(qū)是干什么用的
緩沖區(qū)的作用
1、制圖可以用于美化地圖
2、處理數(shù)據(jù)可以用來緩沖區(qū)多少米外的數(shù)據(jù)
緩沖劑是干什么用的?
化學(xué)工程中的緩沖劑常稱為酸堿穩(wěn)定劑,一般是鹽類,如強(qiáng)酸弱堿或弱酸強(qiáng)堿鹽類,在反應(yīng)或保存中逐漸釋出鹽中的酸或堿以保持穩(wěn)定的酸堿值.
緩沖液是干什么用?
在生化研究工作中,常常需要使用緩沖溶液來維持實(shí)驗(yàn)體系的酸堿度。研究工作的溶液體系pH值的變化往往直接影響到研究工作的成效。 緩沖溶液的配制 只要知道緩沖對的PK值,和要配制的緩沖液的pH值(及要求的緩沖液總濃度),就能按公式計(jì)算和的量。這個(gè)算法涉及對數(shù)換算,較麻煩,前人為減少后人的計(jì)算麻煩,已為我們總結(jié)出pH值與緩沖液對離子用量的關(guān)系列出了表格。只要我們知道要配制的緩沖液的pH,經(jīng)查表便可計(jì)算處所用緩沖劑的比例和用量。例如配制500nmpH5.8濃度為0.1M磷酸緩沖液。 經(jīng)查表知pH5.8濃度為0.2M Na2HPO48.0毫升,而0.2M Na2HPO492.0毫升。依此可推論出配制100ml0.1M的磷酸緩沖液需要0.1M Na2HPO48.0毫升,而0.1M Na2HPO4需要92.0毫升。 計(jì)算好后,按計(jì)算結(jié)果準(zhǔn)確稱好固態(tài)化學(xué)成分,放于燒杯中,加少量蒸餾水溶解,轉(zhuǎn)移入50ml容量瓶,加蒸餾水至刻度,搖勻,就能得到所需的緩沖液。 各種緩沖溶液的配制,均按表格按比例混合,某些試劑,必須標(biāo)定配成準(zhǔn)確濃度才能進(jìn)行,如醋酸、氫氧化鈉等。另外,所有緩沖溶劑的配制念穗計(jì)量都能從以上的算式準(zhǔn)確獲得。
緩沖區(qū)是干什么的什么叫給緩沖區(qū)寫數(shù)據(jù)?
不知道你說的緩沖區(qū)是不是關(guān)鍵鏈中的緩沖區(qū)?如果是,那就是用來保護(hù)關(guān)鍵鏈的
linux內(nèi)核的環(huán)形緩沖區(qū)是干什么
就像人類的心臟是供血的一樣. Linux的內(nèi)核就是Linux的心臟,是操作系統(tǒng)必不可少的一部分.也相當(dāng)于電腦硬件的CPU.
OEM分區(qū)是干什么用的
oem分區(qū)一般只有品牌機(jī)特別是聯(lián)想才豎數(shù)有的,就是檢測硬盤和系統(tǒng)用的,一般就幾百兆大小的分區(qū),平時(shí)也沒啥用處,不用管它,就是重裝系統(tǒng)時(shí)有時(shí)候會默認(rèn)往這里面裝,但因?yàn)榭臻g不足導(dǎo)致裝系統(tǒng)失敗,這點(diǎn)了解下就可以
Photoshop中的選區(qū)是干什么用的
選區(qū)就是選擇一塊區(qū)域,因?yàn)橐粡垐D片中,你要對某個(gè)地方進(jìn)行操作,電腦并不知道,我們有眼睛可以看到,但電腦不能感知,怎么辦那,我們就用選區(qū)工具把要操作的地方進(jìn)行選取,產(chǎn)生流動(dòng)的螞蟻線,電腦就知道了。這就是選區(qū)。那么由于圖片的復(fù)雜性,做選區(qū)的方法也有很多種,比如,套索工具,直線套索,磁性套索,還有魔術(shù)棒,等這些都是做選區(qū)的。只有做完選區(qū)才能對其實(shí)施操仔纖卜作。
Recovery的分區(qū)是干什么用的
用來在系統(tǒng)有問題的時(shí)候恢復(fù)備份用的,
一般這個(gè)分區(qū)是廠商劃分出來
放系統(tǒng)備份 存儲的是還原使用的文件!
不建議刪除 如果系統(tǒng)崩潰,
用此分區(qū)還原到出廠時(shí)候的那個(gè)系統(tǒng)。
ph緩沖劑四硼酸鈉是干什么用的
硼砂緩沖溶液(0.01M,25℃時(shí)候pH=9.18)—溶解3.81g十水四硼酸鈉于水中,然后稀釋到1L。防止大氣中二氧化碳;除了使用的時(shí)候?qū)⑵孔右恢比o。
環(huán)形緩沖區(qū)大小和反寫閾值
100MB,閾值百分之80。寫入的鉛戚kv對達(dá)到了百分之八十則槐高陵發(fā)生溢寫,溢寫的時(shí)候要先對鍵值對按照分區(qū)號念宏進(jìn)行分區(qū),相同分區(qū)按照KEY的字典序排序。
linux 環(huán)形緩沖區(qū)的介紹就聊到這里吧,感謝你花時(shí)間閱讀本站內(nèi)容,更多關(guān)于linux 環(huán)形緩沖區(qū),Linux環(huán)形緩沖區(qū)原理及應(yīng)用解析,Linux中的緩沖區(qū)和緩存內(nèi)存有什么區(qū)別,ArcGis中緩沖區(qū)是干什么用的,環(huán)形緩沖區(qū)大小和反寫閾值的信息別忘了在本站進(jìn)行查找喔。
成都網(wǎng)站推廣找創(chuàng)新互聯(lián),老牌網(wǎng)站營銷公司
成都網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián)(www.cdcxhl.com)專注高端網(wǎng)站建設(shè),網(wǎng)頁設(shè)計(jì)制作,網(wǎng)站維護(hù),網(wǎng)絡(luò)營銷,SEO優(yōu)化推廣,快速提升企業(yè)網(wǎng)站排名等一站式服務(wù)。IDC基礎(chǔ)服務(wù):云服務(wù)器、虛擬主機(jī)、網(wǎng)站系統(tǒng)開發(fā)經(jīng)驗(yàn)、服務(wù)器租用、服務(wù)器托管提供四川、成都、綿陽、雅安、重慶、貴州、昆明、鄭州、湖北十堰機(jī)房互聯(lián)網(wǎng)數(shù)據(jù)中心業(yè)務(wù)。
新聞標(biāo)題:Linux環(huán)形緩沖區(qū)原理及應(yīng)用解析 (linux 環(huán)形緩沖區(qū))
標(biāo)題路徑:http://www.dlmjj.cn/article/djoeiij.html


咨詢
建站咨詢
