免费注册 查看新帖 |

Chinaunix

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

[C] 请教多进程 share 一个 hash table, 怎么设计? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-11-17 09:10 |只看该作者 |倒序浏览
如题, 假设 hash 结构是:

  1. /* 简单起见, 结构体写成这样 */
  2. struct st_c  {int e, f, g; }
  3. struct st_b  {struct* st_c; char* pa, *pb; int a; }
  4. struct st_a  {struct* st_b; char* pc; int a; }
  5. struct hash { struct* st_a; int a, b, c; }
复制代码
最大的问题是很多指针, 每个指针指向的内容长度可能相差很大,而且短时间内会大量生成这些数据,临时分配内存
性能会很低(多进程共享),就想搞个共享的内存池(难在太多指针,且长度不一,hash 节点数末知), 大家有什么好的建议不?
谢谢。

论坛徽章:
0
2 [报告]
发表于 2011-11-17 09:26 |只看该作者
网上找找,有现存基于共享内存实现的

论坛徽章:
0
3 [报告]
发表于 2011-11-17 15:07 |只看该作者
网上找的不一定能用, 况且也很少跟我描述相似的资料。
再资询一下, 多进程共享一个 A 结构, A 结构包含 B 结构跟 char*
  1. struct A { struct B; char* pc; }
复制代码
A 可以保证一定在共享空间, 那 A 中的 B 跟 char* 分配内存时也必须在共享空间吗?
谢谢。

论坛徽章:
0
4 [报告]
发表于 2011-11-17 15:27 |只看该作者
那到没有必要。共享内存提供了一种让进程间可以进行数据交换的机制,可以说提供了一个接口让你访问进程间都感兴趣的数据。
你完全可以自己来定义共享内存的数据结构,至于说共享的数据结构代表的是一个结构还是一个类,又或者是一个函数等都无所谓。
这不是IPC shm关心的问题了,那是用户应该自己清楚的事情。
网上找的不一定能用, 况且也很少跟我描述相似的资料。
再资询一下, 多进程共享一个 A 结构, A 结构包含 ...
vvumm 发表于 2011-11-17 15:07

论坛徽章:
0
5 [报告]
发表于 2011-11-17 15:50 |只看该作者
回 4 楼, 我的意思是
  1. struct A { struct B; char* pc; }
复制代码
A 已经在共享空间了, 多进程当然可以共享了。 但 struct B 中可能含指针, char* pc 也要分配内存。
而多个进程同样需要共享 struct B 跟 char*pc 指向的内存, 那如果 char* pc 是系统分配内存,
当分配的进程挂掉后,  char* pc 指向的内存也没了, 怎么多进程共享?

论坛徽章:
0
6 [报告]
发表于 2011-11-17 16:52 |只看该作者
很显然,你这个问题已经和shm无关了。shm关心的就是A,至于A指向的内存空间或者对象
是否有效那是逻辑上应该保证的事情,这个和共享内存的机制毫无关系。这就是一个工程界面的
问题,你要清楚你的问题边界在哪里,然后再解决问题。解决了内存共享的问题,接下来你就要考虑
通过共享内存获取的接口操作的对象是否有效、内存是否合法、数值是否正确、操作是否允许,是否
要做相关的机制检查保证等等。这个取决于你的应用逻辑,和shm的实现机制已经没有关系了。
回 4 楼, 我的意思是A 已经在共享空间了, 多进程当然可以共享了。 但 struct B 中可能含指针, char* pc  ...
vvumm 发表于 2011-11-17 15:50

论坛徽章:
0
7 [报告]
发表于 2011-11-17 17:25 |只看该作者
很显然,你这个问题已经和shm无关了。shm关心的就是A,至于A指向的内存空间或者对象
是否有效那是逻辑上应 ...
samzc2010 发表于 2011-11-17 16:52

谢谢。按你的意思, 得出两点:
1、如果 A 已经多进程共享, 那么 A 的所有成员都可以多进程共享, 那怕 A 成员所在的内存不是共享区域。
2、必须有机制保证 A 的所有成员在任何时候都生效, 以便其他进程访问时不会出错。

是这样的话, 我还真不明白某进程(设为 process_F)用 malloc 分配了一块内存(设为mm_F), 这块内存通过 A 可以访问到。那么当 process_F 不小心挂掉后,
    Q1、其用 malloc 分配的内存(mm_F)怎么办, 写到文件? process_F 重启时再从文件恢复?
    Q2、process_F 还末恢复时,其他进程通过 A 访问这块内存(mm_F)时,返回 null? 还是可以从文件中获取到这些信息,并返回?
这样可行吗? 还是我完全理解错了?

请指教, thanks.

论坛徽章:
12
寅虎
日期:2013-12-04 20:37:4915-16赛季CBA联赛之广东
日期:2017-08-22 19:23:1215-16赛季CBA联赛之上海
日期:2016-06-18 23:05:05操作系统版块每日发帖之星
日期:2016-06-06 06:20:00操作系统版块每日发帖之星
日期:2016-06-05 06:20:00操作系统版块每日发帖之星
日期:2016-06-03 06:20:002015年辞旧岁徽章
日期:2015-03-03 16:54:152015年亚洲杯之巴勒斯坦
日期:2015-02-10 21:38:08卯兔
日期:2014-10-31 20:42:23申猴
日期:2014-06-11 17:15:10处女座
日期:2014-05-22 09:00:1815-16赛季CBA联赛之广夏
日期:2017-09-25 23:37:46
8 [报告]
发表于 2011-11-17 21:49 |只看该作者
在共享内存中不要使用指针,两个进程各自的虚拟空间是不同的。

如果非要使用,也应该使用偏移量。

论坛徽章:
0
9 [报告]
发表于 2011-11-18 09:01 |只看该作者
在共享内存中不要使用指针,两个进程各自的虚拟空间是不同的。

如果非要使用,也应该使用偏移量。
wait_rabbit 发表于 2011-11-17 21:49

这是由结构体成员决定的, 某个结构该用指针, 不好硬放个数组吧?
刚刚测试了, 共享内存区域的指针, 指向非共享内存区域的指针, 其他进程访问时, 会出段错误。

求解决方案。

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
10 [报告]
发表于 2011-11-18 10:20 |只看该作者
这是由结构体成员决定的, 某个结构该用指针, 不好硬放个数组吧?
刚刚测试了, 共享内存区域的指针,  ...
vvumm 发表于 2011-11-18 09:01


你使用 mmap 的时候, 将共享内存映射到相同的虚拟地址就行了; 只要映射的尽量早, 各个进程应该能够映射到相同地址
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP