免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4109 | 回复: 6
打印 上一主题 下一主题

[算法] 动态共享内存池设计 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-11-02 17:28 |只看该作者 |倒序浏览
在大型并发系统中进程之间通讯一般采用共享内存,成千上万不同大小的共享内存随时在创建,用完之后就立即释放,如果采用单个共享内存独立创建和释放,

多好的服务器也无法承载,唯有采用动态共享内存池,一次申请创建一块大的共享内存区,并划分成无数的小块内存,后续进程间通讯只需要memcpy赋值内存块,传递

内存块地址就ok。

1.首先在系统中开辟一块大的共享内存区10G,这块有个疑问:共享内存和服务器的物理内存有没有关系,最大共享内存能不能超过物理内存;

2.再次参考一般的二维哈希共享内存设计,10G空间可以存储最大数为100万个元素(下面结构体),10级Hash,每次赋值根据nKey定位,释放也可以根据nkey定位,

效率不用说,肯定很快。

struct KEY_INFO_T
{
    unsigned int nKey;
    unsigned int nLength;
    unsigned char* sValue[1024];//1K字节
};

但是上面的效率有个前提就是每次传递的数据不能超1k字节,如果将结构体改为以下10K字节(应该足够大),则可以存储10万个元素(下面结构体),10级Hash,

但是如果传递的消息只有1K的话,9K浪费了,比较可惜,如果服务器不能申请比较大的共享内存区,浪费之后没有空间就得等待,直接影响效率。

struct KEY_INFO_T
{
    unsigned int nKey;
    unsigned int nLength;
    unsigned char* sValue[1024*10];//10K字节

};

有没有更好的动态共享内存池设计方法,希望大家不吝赐教。

论坛徽章:
3
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:032015年亚洲杯之中国
日期:2015-04-22 15:52:45
2 [报告]
发表于 2015-11-03 17:22 |只看该作者
成千上万不同大小的共享内存随时在创建,用完之后就立即释放


谁见过这种模型?.....直接把作者拖出来打死---世界上不可能有比这种设计更垃圾的进程间通讯模型了.

所以一开始提出一个很高大上的问题, 结果问了一个弱弱的问题......
答题的心情都没有---只想说一句:
懒得回答"要怎么做", 而是"要做什么"本来就是无意义的事情.

论坛徽章:
0
3 [报告]
发表于 2015-11-03 18:16 |只看该作者
回复 2# hanxin83


    这个需求是肯定会有的,我们系统有上百个进程,每个进程有3个队列,每个队列的的消息内容部分用共享内存存储,便于进程间通信,

关键在于你怎么设计。

论坛徽章:
0
4 [报告]
发表于 2015-11-03 18:24 |只看该作者
鉴于申请太大的共享内存在映射时会影响到物理内存,还得想办法

将共享内存空间压缩,最初的设计方法浪费太多的内存。

论坛徽章:
36
子鼠
日期:2013-08-28 22:23:29黄金圣斗士
日期:2015-12-01 11:37:51程序设计版块每日发帖之星
日期:2015-12-14 06:20:00CU十四周年纪念徽章
日期:2015-12-22 16:50:40IT运维版块每日发帖之星
日期:2016-01-25 06:20:0015-16赛季CBA联赛之深圳
日期:2016-01-27 10:31:172016猴年福章徽章
日期:2016-02-18 15:30:3415-16赛季CBA联赛之福建
日期:2016-04-07 11:25:2215-16赛季CBA联赛之青岛
日期:2016-04-29 18:02:5915-16赛季CBA联赛之北控
日期:2016-06-20 17:38:50技术图书徽章
日期:2016-07-19 13:54:03程序设计版块每日发帖之星
日期:2016-08-21 06:20:00
5 [报告]
发表于 2015-11-03 20:53 |只看该作者
socket 收发包处理下,更优势的是能跨硬件

如果不是真有瓶颈,别提共享内存有多快,木桶理论

论坛徽章:
1
程序设计版块每日发帖之星
日期:2015-09-23 06:20:00
6 [报告]
发表于 2015-11-03 21:49 |只看该作者
本帖最后由 irp 于 2015-11-04 15:20 编辑

shared mem不管是page file backed or normal file backed, 要读写总是要耗RAM. 理论上reserve的地址空间可以大于RAM size, 假设你有4g RAM, 在64位os上mmap一个10g的文件应该不是问题。但是访问过程会引起不断的page fault, os会不断地swap来满足你的访问请求。通过MAP_POPULATE 可以reserve一个很大的连续的地址范围, 然后根据具体使用的尺寸分段提交。好处是提交的RAM是受workload大小影响的,workload小不会提交过多RAM,同时能保证虚拟地址是连续的。

论坛徽章:
15
2015七夕节徽章
日期:2015-08-21 11:06:172017金鸡报晓
日期:2017-01-10 15:19:56极客徽章
日期:2016-12-07 14:07:30shanzhi
日期:2016-06-17 17:59:3115-16赛季CBA联赛之四川
日期:2016-04-13 14:36:562016猴年福章徽章
日期:2016-02-18 15:30:34IT运维版块每日发帖之星
日期:2016-01-28 06:20:0015-16赛季CBA联赛之新疆
日期:2016-01-25 14:01:34IT运维版块每周发帖之星
日期:2016-01-07 23:04:26数据库技术版块每日发帖之星
日期:2016-01-03 06:20:00数据库技术版块每日发帖之星
日期:2015-12-01 06:20:00IT运维版块每日发帖之星
日期:2015-11-10 06:20:00
7 [报告]
发表于 2015-11-03 22:17 |只看该作者
回复 1# colin8080
照你这么说,申请多个不就得了,一个1K的池子,一个2K的池子,一个4K的池子,一个8K的池子,总之根据你的业务分配多种池子

   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP