免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
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
21 [报告]
发表于 2011-11-18 17:18 |只看该作者
本帖最后由 zylthinking 于 2011-11-18 17:22 编辑

当然还要你保证你的内存池里面的指针指向的都是共享内存块内部的地址。
算了, 想来想去, 你干嘛不使用多线程? 就是为了内存空间总和大或者一个进程死掉不影响其他的吗?

论坛徽章:
0
22 [报告]
发表于 2011-11-18 17:46 |只看该作者
当然还要你保证你的内存池里面的指针指向的都是共享内存块内部的地址。
算了, 想来想去, 你干嘛不使用多 ...
zylthinking 发表于 2011-11-18 17:18

用多进程的原因是。。。。原有框架是多进程的, 现在改不现实。

论坛徽章:
0
23 [报告]
发表于 2011-11-18 19:03 |只看该作者
本帖最后由 samzc2010 于 2011-11-18 19:15 编辑

这是你共享内存的全部过程?这个只是建立了一个映射内存。你的共享代码呢?shmxxx()函数呢?
按照你开贴描述的问题,我想你是不是需要共享内存?如果是,那么你可能需要使用的是SYSTEM V shared memory机制来实现进程间共享内存的需求。
如果是mmap内存映射或者是POSIX共享内存,那是另外一回事。你前面的问题和你给出的代码我有点晕了,不知道你到底想要实现什么效果?

以下是转来的一个一个说明:
Linux提供了内存映射函数mmap, 它把文件内容映射到一段内存上(准确说是虚拟内存上), 通过对这段内存的读取和修改, 实现对文件的读取和修改, 先来看一下mmap的函数声明:
头文件:
<unistd.h>
<sys/mman.h>
原型: void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offsize);
返回值: 成功则返回映射区起始地址, 失败则返回MAP_FAILED(-1).
参数:
addr: 指定映射的起始地址, 通常设为NULL, 由系统指定.
length: 将文件的多大长度映射到内存.
prot: 映射区的保护方式, 可以是:
PROT_EXEC: 映射区可被执行.
PROT_READ: 映射区可被读取.
PROT_WRITE: 映射区可被写入.
PROT_NONE: 映射区不能存取.
flags: 映射区的特性, 可以是:
MAP_SHARED: 对映射区域的写入数据会复制回文件, 且允许其他映射该文件的进程共享.
MAP_PRIVATE: 对映射区域的写入操作会产生一个映射的复制(copy-on-write), 对此区域所做的修改不会写回原文件.
此外还有其他几个flags不很常用, 具体查看linux C函数说明.
fd: 由open返回的文件描述符, 代表要映射的文件.
offset: 以文件开始处的偏移量, 必须是分页大小的整数倍, 通常为0, 表示从文件头开始映射.
    下面说一下内存映射的步骤:
用open系统调用打开文件, 并返回描述符fd.
用mmap建立内存映射, 并返回映射首地址指针start.
对映射(文件)进行各种操作, 显示(printf), 修改(sprintf).
用munmap(void *start, size_t lenght)关闭内存映射.
用close系统调用关闭文件fd.
注意事项:
在修改映射的文件时, 只能在原长度上修改, 不能增加文件长度, 因为内存是已经分配好的.

是啊, 我是这么干的, 你不是这个意思么?这是访问共享内存的方法。 其他的代码还需要不, 不要取笑我的 ...
vvumm 发表于 2011-11-18 17:03

论坛徽章:
0
24 [报告]
发表于 2011-11-18 19:45 |只看该作者
我建议你去看看SYSTEM V共享内存的实现吧
shmget
shmat
shmdt
shmctrl
几个函数实现了SYSTEM V IPC共享内存的方法。

我认为这个可能更加适合你,而不是mmap/munmap/msync函数实现的内存映射和文件关联机制。
如果不是这样的话,那就是我前面误解你的问题了。

论坛徽章:
0
25 [报告]
发表于 2011-11-18 23:27 |只看该作者
我建议你去看看SYSTEM V共享内存的实现吧
shmget
shmat
shmdt
shmctrl
几个函数实现了SYSTEM V IPC共享 ...
samzc2010 发表于 2011-11-18 19:45

那可能是我搞错了, 我一直认为 shmget, shmat ... 实现的效果跟 mmap 是一样的, 都是共享内存。 汗。。。我明天写段代码验证下, 非常感谢。

论坛徽章:
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
26 [报告]
发表于 2011-11-18 23:29 |只看该作者
你没搞错,他搞错了

论坛徽章:
0
27 [报告]
发表于 2011-11-19 12:17 |只看该作者
你知道你在说什么么?
你没搞错,他搞错了
zylthinking 发表于 2011-11-18 23:29

论坛徽章:
0
28 [报告]
发表于 2011-11-19 15:45 |只看该作者
回复 20# vvumm
  1. void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);
复制代码
mmap() creates a new mapping in the virtual address space of the calling process.
   The starting address for the new mapping is specified in addr.  The length argument specifies the length of the mapping.
      
MAP_FIXED
只选择指定的内存地址。如果由addr以及length指定的内在区域与其它已映射的内存区域有重叠,那么重叠的内存部分将被丢弃。如果指定的内存地址不可用,mmap()失败。如果指定了 MAP_FIXED , start 必须是内存页大小的整数倍。

那些指针指向的地址也要在共享内存里,所以还要自己实现malloc free函数
这里看看
http://sid.ethz.ch/debian/syslinux/syslinux-3.75+dfsg/dos/

希望没给你添乱

论坛徽章:
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
29 [报告]
发表于 2011-11-19 16:43 |只看该作者
你知道你在说什么么?
samzc2010 发表于 2011-11-19 12:17


你知道你在说什么么, 过来人???
查查 MAP_ANONYMOUS

论坛徽章:
0
30 [报告]
发表于 2011-11-19 16:55 |只看该作者
你除了乐于无聊的攻击和弄一些聊聊数语的废话,你还能干什么?
懒得理你,我很乐于帮助坛子里菜鸟的问题。你忙活着跟帖赚积分的么?
帮别人解答问题之前,自己先读清楚别人的问题,这是起码的基础。
我看你这号人也不懂这些吧。
你知道你在说什么么, 过来人???
查查 MAP_ANONYMOUS
zylthinking 发表于 2011-11-19 16:43
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP