免费注册 查看新帖 |

Chinaunix

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

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

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

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

不是实时系统的话,这么做还可以。否则,数据库更新了,而共享内存还没有更新时,会有问题。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
32 [报告]
发表于 2004-11-08 22:28 |只看该作者

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

原帖由 "linux_newbie" 发表:
你这个应该只能在单进程且单线程环境中使用吧?
但是你又用到了共享内存,应该是特意用于可以并发的。

如果都是只读操作,例如你的FetchMapGGXTCS,这个到没有问题。
但是我看到你有一个函数UpdateMapGGXTCS,?.........


所以我说只适用于简单的查询和更新操作。
在银行搞开发的人都知道,每天晚上对帐的时候,“公共系统参数表”中的“当前对帐场次”只由一个进程更改,所以不会出现问题的。
我们的系统中使用了“内存流水”,这个共享内存中的一条记录结构可能存在被多个进程同时更改,这种情况我的“内存映射表”就不适用了。我们专门设计了“内存流水”操作函数库共享内存(加入了锁机制)。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
33 [报告]
发表于 2004-11-08 22:30 |只看该作者

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

[quote]原帖由 "lishenglin"]共享内存结构如果能设计成hash表的结构,查询效率会高很多。完全可以参考或使用std的hash容器的方法设计。[/quote 发表:


我们使用的是ansi c编译器

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
34 [报告]
发表于 2004-11-08 22:33 |只看该作者

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

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

关于更新的问题我曾经用过一个比较笨的办法,不过可以近乎实..........


我设计的共享内存存放数据的结构只是很简单的结构数组方式,楼上所说的是在我的基础上设计更合理的逻辑存放方式,非常值得考虑,谢谢 ^___^

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
35 [报告]
发表于 2004-11-08 22:35 |只看该作者

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

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

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


没错,当表数据比较大时还是使用表查询速度快,因为表使用了索引
当表数据不是很大时,使用内存便历更快些

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
36 [报告]
发表于 2004-11-08 22:38 |只看该作者

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

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


当然不会了,呵呵。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
37 [报告]
发表于 2004-11-08 22:53 |只看该作者

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

楼上很多朋友提到“内存映射表”的更新操作 需要 同时更新数据库表和内存表
我给出更新操作的回调函数,供大家批正,同样以“公共系统参数表”为例



  1. int UpdateCSZFromGGXTCSWhereCSXHProc( void *pvCondValue , void *pvUpdateValue , struct ggxtcs *pstGgxtcs )
  2. {
  3.         char *pcCSXH = (char *)pvCondValue ;
  4.        
  5.         ClearRight( pstGgxtcs->;csxh );
  6.        
  7.         if( STRCMP( pcCSXH , == , pstGgxtcs->;csxh ) )
  8.         {
  9.                 strcpy( dacCSXH , (char *)pvCondValue );
  10.                 strcpy( dacCSZ , (char *)pvUpdateValue );
  11.                
  12.                 EXEC SQL
  13.                         UPDATE        ggxtcs
  14.                         SET                csz=:dacCSZ
  15.                         WHERE        csxh=:dacCSXH ;

  16.                 if( sqlca.sqlcode )
  17.                 {
  18.                         EXEC SQL COMMIT;
  19.                        
  20.                         return 2;
  21.                 }
  22.                 else
  23.                 {
  24.                         EXEC SQL COMMIT;
  25.                        
  26.                         strcpy( pstGgxtcs->;csz , dacCSZ );
  27.                        
  28.                         return 0;
  29.                 }
  30.         }
  31.         else
  32.                 return 1;
  33. }
复制代码


再次强调,该更新操作只适用于简单非并发的更新操作,不希望楼下的再在更新的加锁问题上议论。复杂、并发的更新操作当然需要加锁,这是大家都知道的。
我写这篇的前提是:把某些记录比较少、查询、更新操作相对简单、操作非并发的数据库表放入共享内存来实现查询、更新,请大家不要把问题复杂化,我们不是在设计数据库系统。

谢谢广大同仁积极参与讨论,很多朋友提出的见解都能使我的设计更好的优化(比如,使用hash表代替结构数组),在此感谢楼上朋友们的精彩发言。
让我们分享自己的经验和技巧,共同成长,壮大中国unix程序员社群 ^___^

论坛徽章:
0
38 [报告]
发表于 2004-11-09 09:48 |只看该作者

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

收到

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

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

cu里真是卧虎藏龙啊!

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

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

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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP