一、引言
在计算机中,缓冲区是一块内存区域,用于临时缓存输入或输出数据。Linux的内核中常用环形缓冲区,被广泛应用于网络设备驱动、音视频设备驱动等模块中。本文将对Linux环形缓冲区的原理及应用进行解析,旨在为读者提供更深入的了解。
二、环形缓冲区的定义及特点
环形缓冲区指的是一块具有大小限制的循环缓冲区。其特点是数据写满后,将覆盖写入最早的数据,保证了缓冲区数据的实时更新。在网络设备驱动和音视频设备驱动模块中,环形缓冲区的应用是很普遍的。由于其高效性和占用空间少的优点,被广泛使用。
三、环形缓冲区的实现原理
1.环形缓冲区的结构
环形缓冲区由以下结构体组成:
“`
struct ring_buffer {
int head; //写入位置
int tl; //读取位置
int size; //缓冲区尺寸
int empty; //缓冲区是否为空
char buffer[]; //缓冲区首地址
};
“`
其中,head表示写入位置,tl表示读取位置。size表示缓冲区大小,empty用于判断缓冲区是否为空。最后是一个char类型的数组,即存放缓冲区数据的空间。该数组是通过变长数组来定义的,空间大小由参数传入。
2.缓冲区的初始化
在实现缓冲区时,首先需要进行初始化。初始化过程如下:
“`
int ring_buffer_init(struct ring_buffer *ring, int size)
{
//设置缓冲区各个成员的初始值
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函数分配内存空间,如果分配失败则直接返回错误。之后使用memset函数将ring_buffer结构体中除buffer以外的成员全部初始化为0,再将缓冲区的大小、空状态以及buffer成员的值进行初始化。
3.缓冲区的读写操作
对于环形缓冲区的读写操作,需要考虑以下两个场景:
(1)写入数据时,如果缓冲区已满,则覆盖最早写入的数据。
(2)读取数据时,如果缓冲区为空,则等待有数据写入。
缓冲区的写入操作代码如下:
“`
static int ring_buffer_write(struct ring_buffer *ring, const char *data, int len)
{
int size = ring->size;
int count = 0;
while(len) {
//计算可以写入数据的空间
int avl = ring->head – ring->tl;
if(avl
avl = size + avl;
}
//如果缓冲区已满,则覆盖最早的数据
if(avl == size – 1) {
ring->tl = (ring->tl + 1) % size;
count++;
continue;
}
//计算可写入数据长度
int empty = size – avl – 1;
int n = len
//写入数据到缓冲区
memcpy(ring->buffer + ring->head, data, n);
ring->head = (ring->head + n) % size;
len -= n;
data += n;
ring->empty = 0;
count++;
}
return count;
}
“`
缓冲区的读取操作代码如下:
“`
static int ring_buffer_read(struct ring_buffer *ring, char *data, int len)
{
int size = ring->size;
int count = 0;
while(len) {
//计算可以读取的数据长度
int avl = ring->head – ring->tl;
if(avl
avl = size + avl;
}
//如果缓冲区为空,则等待有数据写入
if(avl == 0 && ring->empty) {
continue;
}
//计算可读取数据的长度
int n = len
//将数据从缓冲区中读取到buffer
memcpy(data, ring->buffer + ring->tl, n);
ring->tl = (ring->tl + n) % size;
len -= n;
data += n;
//如果缓冲区为空,则设置状态
if(avl == n) {
ring->empty = 1;
}
count++;
}
return count;
}
“`
四、应用场景
1. 网络设备驱动
在Linux设备驱动中,网络设备驱动是一类适合使用环形缓冲区的模块。网络设备驱动需要进行数据交换,而且通常在数据到达时并不知道需要的长度,这时候使用环形缓冲区能够很好地解决这个问题。在Linux内核中,TCP/IP协议栈中的rx_ring和tx_ring都是基于环形缓冲区实现的。
2. 音视频设备驱动
音视频设备驱动同样需要使用缓冲区对数据进行存储和交换。在这种情况下,使用环形缓冲区能够比较好地解决速度不一致的问题。例如,当音频设备的输入速度比输出速度慢时,使用环形缓冲区能够保证数据不会因为缓冲区大小的限制而丢失。
五、
本文对Linux环形缓冲区的定义、实现原理及应用场景进行了详细介绍。环形缓冲区作为一种高效、占用空间少的数据结构,在网络设备驱动、音视频设备驱动等模块中被广泛应用。对于使用操作系统的程序员来说,掌握环形缓冲区的原理及其应用场景是十分重要的。
相关问题拓展阅读:
在Linux系统下,我们一般不需要去释放内存,因为系统已经将内存管理的很好。但是凡事也有例拿枝烂外,有的时候内存会被缓存占用掉,导致系统使用SWAP空间影响性能,此时就需要执行释放内存(清理缓存)的操作了。
Linux系统的缓存机制是相当先进的,他会针对dentry(用于VFS,加速文件路径名到inode的转换)、Buffer Cache(针对磁盘块的读写)和Page Cache(针对文件inode的读写)进行缓存操作。但是在进行了大量文件操作之后,缓消漏存会把内存资源基本用光。但实际上我们文件操作已经完成,这部分缓存已经用不到了。这个时候,我们难道只能眼睁睁的看着缓存把内存空间占据掉么?
所以,我们还是有必要来手动进行Linux下释放内存的操作,其实也就是释放缓存的操作了。
要达到释放缓存的目搭档的,我们首先需要了解下关键的配置文件/proc/sys/vm/drop_caches。这个文件中记录了缓存释放的参数,默认值为0,也就是不释放缓存。他的值可以为0~3之间的任意数字,代表着不同的含义:
0 – 不释放
1 – 释放页缓存
2 – 释放dentries和inodes
3 – 释放所有缓存
知道了参数后,我们就可以根据我们的需要,使用下面的指令来进行操作。
首先我们需要使用sync指令,将所有未写的系统缓冲区写到磁盘中,包含已修改的 i-node、已延迟的块 I/O 和读写映射文件。否则在释放缓存的过程中,可能会丢失未保存的文件。
#sync
接下来,我们需要将需要的参数写进/proc/sys/vm/drop_caches文件中,比如我们需要释放所有缓存,就输入下面的命令:
#echo 3 > /proc/sys/vm/drop_caches
此指令输入后会立即生效,可以查询现在的可用内存明显的变多了。
要查询当前缓存释放的参数,可以输入下面的指令:
#cat /proc/sys/vm/drop_caches
#free -m
对于清除swap,只有先关闭swap了,用:
#swapoff -a
而后启用swap,因为只是清除,不是说不要用swap的嘛 :
#swapon -a
Linux 自动释放内存脚本
发表于119 天前 ? 技术文章 ? 暂无评论
脚本下载
脚本内容:
#! /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一下,防止丢数据。
利用系统crontab实现每天自动运行:
crontab -e
输入以下内容:
00 00 * * * /root/Cached.sh
每天0点释放一次内存,这个时间可以根据自己需要自行设置,我的服务器情况是每天自动释放一次就OK了
在设置这个脚本的时候,发生了一系列的问题
在测试运行./Cached.sh时提示错误:Permission denied 权限的问题
解决方法:
chmod +x .Cached.sh
或
chmod 777 Cached.sh
接着又出现错误提示:/bin/bash^M: bad interpreter: No such file or directory
这是因为在windows下编辑的.sh文件编码格式和linux下不一样,转换一下编码格式即可:
dos2unix Cached.sh
缓冲镇瞎区与特定的块设备相肆锋关联,包括文件系统元数据的缓存以及页面跟踪。缓存只御雹空包含已停放的文件数据。
也就是说,缓冲区记住目录中的内容、文件权限是什么,并跟踪从某个块设备中写入或读取到哪些内存。
缓存只包含文件本身的内容。
ArcGis中缓冲区是干什么用的
缓冲区的作用
1、制图可以用于美化地图
2、处理数据可以用来缓冲区多少米外的数据
缓冲剂是干什么用的?
化学工程中的缓冲剂常称为酸碱稳定剂,一般是盐类,如强酸弱碱或弱酸强碱盐类,在反应或保存中逐渐释出盐中的酸或碱以保持稳定的酸碱值.
缓冲液是干什么用?
在生化研究工作中,常常需要使用缓冲溶液来维持实验体系的酸碱度。研究工作的溶液体系pH值的变化往往直接影响到研究工作的成效。 缓冲溶液的配制 只要知道缓冲对的PK值,和要配制的缓冲液的pH值(及要求的缓冲液总浓度),就能按公式计算和的量。这个算法涉及对数换算,较麻烦,前人为减少后人的计算麻烦,已为我们总结出pH值与缓冲液对离子用量的关系列出了表格。只要我们知道要配制的缓冲液的pH,经查表便可计算处所用缓冲剂的比例和用量。例如配制500nmpH5.8浓度为0.1M磷酸缓冲液。 经查表知pH5.8浓度为0.2M Na2HPO48.0毫升,而0.2M Na2HPO492.0毫升。依此可推论出配制100ml0.1M的磷酸缓冲液需要0.1M Na2HPO48.0毫升,而0.1M Na2HPO4需要92.0毫升。 计算好后,按计算结果准确称好固态化学成分,放于烧杯中,加少量蒸馏水溶解,转移入50ml容量瓶,加蒸馏水至刻度,摇匀,就能得到所需的缓冲液。 各种缓冲溶液的配制,均按表格按比例混合,某些试剂,必须标定配成准确浓度才能进行,如醋酸、氢氧化钠等。另外,所有缓冲溶剂的配制念穗计量都能从以上的算式准确获得。
缓冲区是干什么的什么叫给缓冲区写数据?
不知道你说的缓冲区是不是关键链中的缓冲区?如果是,那就是用来保护关键链的
linux内核的环形缓冲区是干什么
就像人类的心脏是供血的一样. Linux的内核就是Linux的心脏,是操作系统必不可少的一部分.也相当于电脑硬件的CPU.
OEM分区是干什么用的
oem分区一般只有品牌机特别是联想才竖数有的,就是检测硬盘和系统用的,一般就几百兆大小的分区,平时也没啥用处,不用管它,就是重装系统时有时候会默认往这里面装,但因为空间不足导致装系统失败,这点了解下就可以
Photoshop中的选区是干什么用的
选区就是选择一块区域,因为一张图片中,你要对某个地方进行操作,电脑并不知道,我们有眼睛可以看到,但电脑不能感知,怎么办那,我们就用选区工具把要操作的地方进行选取,产生流动的蚂蚁线,电脑就知道了。这就是选区。那么由于图片的复杂性,做选区的方法也有很多种,比如,套索工具,直线套索,磁性套索,还有魔术棒,等这些都是做选区的。只有做完选区才能对其实施操仔纤卜作。
Recovery的分区是干什么用的
用来在系统有问题的时候恢复备份用的,
一般这个分区是厂商划分出来
放系统备份 存储的是还原使用的文件!
不建议删除 如果系统崩溃,
用此分区还原到出厂时候的那个系统。
ph缓冲剂四硼酸钠是干什么用的
硼砂缓冲溶液(0.01M,25℃时候pH=9.18)—溶解3.81g十水四硼酸钠于水中,然后稀释到1L。防止大气中二氧化碳;除了使用的时候将瓶子一直塞紧。
100MB,阈值百分之80。写入的铅戚kv对达到了百分之八十则槐高陵发生溢写,溢写的时候要先对键值对按照分区号念宏进行分区,相同分区按照KEY的字典序排序。
linux 环形缓冲区的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于linux 环形缓冲区,Linux环形缓冲区原理及应用解析,Linux中的缓冲区和缓存内存有什么区别,ArcGis中缓冲区是干什么用的,环形缓冲区大小和反写阈值的信息别忘了在本站进行查找喔。
成都网站推广找创新互联,老牌网站营销公司
成都网站建设公司创新互联(www.cdcxhl.com)专注高端网站建设,网页设计制作,网站维护,网络营销,SEO优化推广,快速提升企业网站排名等一站式服务。IDC基础服务:云服务器、虚拟主机、网站系统开发经验、服务器租用、服务器托管提供四川、成都、绵阳、雅安、重庆、贵州、昆明、郑州、湖北十堰机房互联网数据中心业务。
本文名称:Linux环形缓冲区原理及应用解析 (linux 环形缓冲区)
网站网址:http://www.csdahua.cn/qtweb/news38/355638.html
网站建设、网络推广公司-快上网,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 快上网