- 论坛徽章:
- 9
|
本帖最后由 wlmqgzm 于 2016-05-19 22:33 编辑
存储层的Mapping写线程自动扩展文件大小, 进行写入, 不需要线程间同步的情况下, 读线程高效自动跟随扩展是如何实现的?
前面比较困扰的 mapping文件自动扩展大小后, 采用传统方案, re maping地址大小等参数全部要变化, 层层通知高层代码带来代码复杂化, 低效化, 多线程互相通知同步等等问题, 以及随之带来的可能线程进程冲突的问题.
全新的解决办法: 废弃掉老代码, 实现底层代码智能化的解决方案, 轻松搞定.
现在由于采用了底层代码智能化的方式, 稳定平滑, 不需要通知高层代码, 对高层代码透明, 对多线程透明
关键实现:
在检测到 底层读请求超边界后调用, ,
生成新内存对象, 用第2组虚地址 +前一组老的虚地址 共同指向同一个物理地址,保证平滑扩展, 旧内存对象保护起来, 等以后第2次扩展的时候释放, 保护其他多线程的操作, 这部分是虚内存, 不是物理内存, 因此不用马上释放, 也不能马上释放.
利用原子量计数保护, 实现 扩展函数 线程可再入, 还是没有使用锁.
所有的Mapping代码全部是全新的高性能无锁设计, 支持 多线程 高效并发.
读线程 扩展跟随 功能代码通过 "原子量+3组写内存屏障" 的新技术方案,
// 原子量计数保护, 实现 扩展函数 线程可再入
// 先 生成新内存对象 写屏障保证顺序
/ 再切换地址, 写屏障保证顺序
// 最后切换文件长度, 写屏障保证顺序
实现了稳定平滑文件扩展, 不需要线程间通知, 不需要层层代码通知, 无锁设计, 代码 线程安全, 线程可再入 |
|