免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: BetonArmEE
打印 上一主题 下一主题

[C] 钢筋混凝土的UNIX C编程技巧(一、内存映射表)[原创] [复制链接]

论坛徽章:
0
21 [报告]
发表于 2004-11-04 16:45 |只看该作者

钢筋混凝土的UNIX C编程技巧(一、内存映射表)[原创]

做过一个比较,如果在使用共享内存的时候采用HASH在效率上能够提高很多。另外将记录放入共享内存中采用平衡二叉树的结构能够解决数据量大的时候的读写问题。
另外同意楼上说的,不一定需要记录级的锁,可以采用刷新的方法。
希望大家多多指教!

论坛徽章:
0
22 [报告]
发表于 2004-11-04 16:56 |只看该作者

钢筋混凝土的UNIX C编程技巧(一、内存映射表)[原创]

放到内存里是很常用的一种方法.
放到共享内存显然是为了让系统中有需要的进程都可以资源共享.
应该考虑给把内存中的数据重新组织.比如HASH或者AVL树.

关于更新的问题我曾经用过一个比较笨的办法,不过可以近乎实时的更新.
方法是在内存中开两片同样的区域,一边用于应用中的查找,另一边在更新,可以指定更新的间隔时间.更新完毕后将两块数据的角色对换.
优点是逻辑简单,调试容易,维护也简单.
缺点显然是大量的浪费了内存,所以这种做法不到万不得以,不是必须要求高效率,实时性很强的关键应用是不值得推荐的。
不过我觉得也不失为解决问题的一种办法,拿出来给大家参考.

论坛徽章:
0
23 [报告]
发表于 2004-11-04 17:12 |只看该作者

钢筋混凝土的UNIX C编程技巧(一、内存映射表)[原创]

楼上的方法如果在共享内存小的情况下应该是很好的一个解决办法,但是如果需要的内存空间大的话,就没有办法使用了。

希望学到更多东西......

论坛徽章:
0
24 [报告]
发表于 2004-11-04 17:19 |只看该作者

钢筋混凝土的UNIX C编程技巧(一、内存映射表)[原创]

数据量非常大的情况下,可以考虑不把全量数据LOAD进内存.
只LOAD部分,然后模拟LRU算法来做.
我原来是这么计划的,后来发现内存够了也就没管了.

论坛徽章:
0
25 [报告]
发表于 2004-11-04 18:33 |只看该作者

钢筋混凝土的UNIX C编程技巧(一、内存映射表)[原创]

方法是在内存中开两片同样的区域,一边用于应用中的查找,另一边在更新,可以指定更新的间隔时间.更新完毕后将两块数据的角色对换.


我倒是有点疑问。那个用于更新的是不是允许并发呢?如果允许,那么同样需要锁定机制。如果对整个区域加锁,那么任何更新无法同时运行,即使它们是更新不同的记录。如果需要细粒度的锁,那么复杂性就提升了。

既然都需要锁,如果为什么不直接使用一个区域,不过是使用读写锁而已。

而且更新完毕后两块数据的角色对换,这个操作也必须是一个原子操作才行。

总之,麻烦。

论坛徽章:
0
26 [报告]
发表于 2004-11-05 10:56 |只看该作者

钢筋混凝土的UNIX C编程技巧(一、内存映射表)[原创]

更新不存在并发问题,
在同一时间肯定只有一个线程(或进程)访问用于更新的那块空间.

两块数据块角色对换,只要设置一个指示器,给这个指示器加个锁就可以实现了.

论坛徽章:
0
27 [报告]
发表于 2004-11-05 13:52 |只看该作者

钢筋混凝土的UNIX C编程技巧(一、内存映射表)[原创]

不同的应用存在的效率瓶劲不同,应用的方法也不同!!!
还得看具体的环境!

论坛徽章:
0
28 [报告]
发表于 2004-11-05 18:03 |只看该作者

钢筋混凝土的UNIX C编程技巧(一、内存映射表)[原创]

在同一时间肯定只有一个线程(或进程)访问用于更新的那块空间


你要是这种情况的话,我估计只需要多一块内存可以容纳单条记录的就可以了。

先在这个私有内存中更新,填好后,直接将Read List中的某个指针“突然”指向这个刚刚填好的结构就可以了。不过这要求你最好使用单链表。一般32位机器对一个Int赋值都是原子操作。

论坛徽章:
0
29 [报告]
发表于 2004-11-05 20:39 |只看该作者

钢筋混凝土的UNIX C编程技巧(一、内存映射表)[原创]

将系统重要参数的数据表,在系统启动时导入共享MEM,包括在以后工作中通过对系统参数表修改,同时做到更新共享MEM,对提高系统性能很好.
但要是对当日明细表要是也这样做,哈哈!!!

论坛徽章:
0
30 [报告]
发表于 2004-11-06 00:11 |只看该作者

钢筋混凝土的UNIX C编程技巧(一、内存映射表)[原创]

对于专用系统,用到这个的确不错,我想作者的重点放在把数据库操作转换成了对内存操作,显然对于操作频繁的表来讲给数据库的压力减少了很多,
读于读取数据更有用吧,其实要考虑的事情还很多,更新的时候需要同时更新结构和数据库==,这些对于静态表来说可以不用考虑,如码表,它是固定的东西。所有有些人多虑了。简单的事情不要搞复杂,实用是第一位。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP