免费注册 查看新帖 |

Chinaunix

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

[C] Linux下对一段共享内存进行操作管理的若干疑问 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-04-11 16:28 |只看该作者 |倒序浏览
是这样,我首先用shmget创建一段共享内存,然后将磁盘上的一些文件内容载入到这个共享内存中,磁盘上的文件是以行为单位读取的,然后我的程序提供一些功能对这些共享内存中的数据进行增改删除等操作,但是我不太了解怎么对共享内存进行操作,我现在利用shmat()函数将共享内存映射到我的进程,然后获得一个指向这个共享内存起始地址的一个指针,我现在只能通过这个指针对共享内存进行操作,这个很不方便,请问有什么更好的办法么?

我现在的想法是写一些共享内存管理的函数,封装起来,对外提供接口,比如说shm_create(size_t)对外提供创建共享内存,shm_alloc(size_t)申请一段空间等等,这样可行吗?


请高手赐教,给与一些提示,谢谢

论坛徽章:
0
2 [报告]
发表于 2010-04-11 18:08 |只看该作者
好像一般这样做

没觉得有啥不方便的

跟操作普通内存一样

论坛徽章:
0
3 [报告]
发表于 2010-04-11 18:35 |只看该作者
但是比如有一段之前使用的共享内存我不需要了,要释放掉,在普通内存里我就可以用free(),但是共享内存中就不行,就要考虑有碎片的问题。。

我现在这样考虑,在进程的普通内存(堆或栈)中简历一个链表,接点的结构是:
struct xxx{
  unsigned long size;
  void *ptr;
  struct xxx *p_next;
}

然后我维护一个xxx接点的链表,每个接点的ptr成员指向共享内存中的一个地址,这个地址往后的size个单元都是其内容, 每次我要在共享内存中申请一个大小为size的内存时,我在普通内存中就增加一个节点,如果要释放我就再维护一个空闲链表.


不知道这样如何?

论坛徽章:
0
4 [报告]
发表于 2010-04-11 18:45 |只看该作者
你需要多进程通讯吗?如果不需要的话根本不必要使用共享内存!
按照你所描述的,你应该用mmap()去实现

论坛徽章:
0
5 [报告]
发表于 2010-04-11 18:56 |只看该作者
共享内存可以IPC_RMID

论坛徽章:
0
6 [报告]
发表于 2010-04-11 22:19 |只看该作者
需要使用多进程,其实是作一个类似共享内存数据库,服务端启动后,选择要操作的数据库,然后将磁盘上的数据载入共享内存,然后就可以对数据进行操作了,因为数据量比较大,而要效率要求比较高,大家给出出主意,我现在打算就写一系列共享内存操作管理的函数,就像我上面说的。

论坛徽章:
0
7 [报告]
发表于 2010-04-12 08:55 |只看该作者
回复 3# hsum


你要在共享内存里面搞链表本来就是比较麻烦的事情

并且链表里面的指针本来就不能使用malloc分配的 所以也谈不上free

论坛徽章:
0
8 [报告]
发表于 2010-04-12 08:56 |只看该作者
建议你先写一个内存分配的类专门用来分配你的共享内存

论坛徽章:
0
9 [报告]
发表于 2010-04-12 10:16 |只看该作者
需要使用多进程,其实是作一个类似共享内存数据库,服务端启动后,选择要操作的数据库,然后将磁盘上的数据 ...
hsum 发表于 2010-04-11 22:19



    你这个问题应该用内存数据库来解决比较好

论坛徽章:
0
10 [报告]
发表于 2010-04-12 13:44 |只看该作者
谢谢楼上的各位,这个问题我想了很久,如果真的要使用共享内存的话,我就得要写一个管理共享内存的类封装起来对外提供接口,这个比较复杂,而且感觉共享内存的映射机制效率还是有点不尽人意。

最理想的情况还是使用普通进程里面的stack和heap,效率高,而且方便,直接调用malloc()\free(),


但问题是,这个项目是我和几个同学一起参加一项比赛,比赛的要求就是使用共享内存,所以。。。。哎、。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP