环形缓存区的理解

在写之前先说下一些我们在开发过程中遇到的问题做一个简单的总结。

1、堆栈的使用

       我们知道堆和栈都是对内存的使用,栈是由操作系统来自行管理,比如函数里面的局部变量和函数的入参地址等,这些都属于栈分配地址空间,我们在使用的时候是无感知的,我们不需要去管他的申请和释放,只需要用就行了。然后堆是需要用户自己的申请,申请需要指定大小,一般起始地址不需要自己指定,系统会自己指定,我们代码使用的malloc或者new一个变量都是属于堆的使用,当我们使用完成不在需要的时候需要我们人工的去释放掉,告诉操作系统这块内存我用完了,之后不在用了。

2、内存碎片化问题

       像上面堆的的使用得过多,其中有使用大些的内存,也有使用小一点的内存,那么使用的过多了,频繁了,就会出现内存碎片话,我之前的博文也记录过内存碎片话的问题。导致内存的使用和剩余部分都不连续,东一块西一块的,如果这样多了的话cpu访问内存的效率就会降低,就会出现一些卡顿或者访问缓慢的问题,有时候电脑或者设备用的时间长了,机子会有些卡,但是重启系统后,机子就会好很多,这个内存碎片化也是导致机子卡的原因之一;比较好的系统会对内存碎片化进行优化,但是也仅仅是优化而已,不能完全消除这样的情况。

3、线程锁问题

       我们开发中可能会遇到多线程处理,多个线程访问同一款内存空间的时候就会用到线程锁,线程锁就是当其中一个线程正在访问这个内存的时候,就把这块内存锁起来,不让其他的线程来进行访问,这样的好处是什么,大家应该也大致明白。其实就是当一个线程正在处理这块内存的时候,如果不锁住,另外的线程也来访问的话就会出现数据操作不一致,导致这块内存的数据混乱的情况。

4、环形缓冲区

        前面说堆栈主要是让大家理解环形缓冲区是属于堆的范畴,便于理解,内存碎片化其实也是为了引出环形缓冲区,因为有了环形缓冲区就可以防止在处理大数据的时候内存碎片化,也可以加深大家的理解。最后的线程锁的概念,就跟环形缓冲区的读和写的界限有关,读不能超过写的指针地址,写不能超过读的指针地址;可以理解成读的时候,写的指针地址被锁住了,读不能超过它,写的时候,读的指针地址被锁住了,写不能超过它。其实真实情况那可能并不叫线程锁,这样提出来也只是为了方便理解而已,如有理解不当,欢迎评论区指正。

现在我们来说下环形缓冲区出现的原因如下:

       当有大量数据的时候,我们不能存储所有的数据,那么计算机处理数据的时候,只能先处理先来的,那么处理完后呢,就会把数据释放掉,再处理下一个。那么,已经处理的数据的内存就会被浪费掉。因为后来的数据只能往后排队,如果要将剩余的数据都往前移动一次,那么效率就会低下了,肯定不现实,所以,环形队列就出现了。核心原理是申请一段内存,我们通过特殊的让这段内存首尾相连的方法,形成一个闭环的内存地址,这样既可以继续处理源源不断的数据,又不用继续去申请新的内存空间在暂存新的数据,效率是不是极高。

        环形缓冲区是一项很好的技术,不用频繁的分配内存,而且在大多数情况下,内存的反复使用也使得我们能用更少的内存块做更多的事。

 大致原理:

        环形缓冲区通常有一个读指针和一个写指针。读指针指向环形缓冲区中可读的数据,写指针指向环形缓冲区中可写的缓冲区。通过移动读指针和写指针就可以实现缓冲区的数据读取和写入。在通常情况下,环形缓冲区的读用户仅仅会影响读指针,而写用户仅仅会影响写指针。如果仅仅有一个读用户和一个写用户,那么不需要添加互斥保护机制就可以保证数据的正确性。如果有多个读写用户访问环形缓冲区,那么必须添加互斥保护机制来确保多个用户互斥访问环形缓冲区。

        环形缓冲区所有的push和pop操作都是在一个固定 的存储空间内进行。而队列缓冲区在push的时候,可能会分配存储空间用于存储新元素;在pop时,可能会释放废弃元素的存储空间。所以环形方式相比队列方式,少掉了对于缓冲区元素所用存储空间的分配、释放。这是环形缓冲区的一个主要优势。

        环形缓冲区最重要的一个特点是写的速度和速度的匹配性问题,环形缓冲区一般是将数据先写入缓冲区内,然后有个写的指针位置,但是不能超过读的位置,因为数据还没被读取,你就去写了,就会造成数据还没被读就被新的数据覆盖,这样会造成数据丢失;读数据的时候也是一样,读取数据时候会记录读取的指针位置,读完后继续读,同样的道理读的指针也不能超过写的位置,这样就会读到之前读过的数据,造成数据重复。所以此时大家应该大致了解了这个环形内存空间的大小的关键性了,这个可以根据读的速度和写的速度来界定空间的大小,空间如果设置的太大,会造成内存浪费,有内存一直处于空闲状态,如果空间设置的太小,可能会造成读的速度快于写的速度,导致读的过程中会有短暂的等待时间,造成效率不是最高。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值