共享内存的与位置无关分配?

18         共享内存的与位置无关分配?

在文档《ACE Programmer's Guide, The: Practical Design Patterns for Network and Systems Programming》中介绍了一种与位置无关的共享内存分配,但是实际上这种方式并不是太理想。按照文章中的介绍的方式,其实主要是采用ALWAYS_FIXED参数,使用制定的基地址作为共享内存的地址。同时使用辅助类保证2个进程使用相对地址使用共享内存。

      ACE_MMAP_Memory_Pool_Options options

        (ACE_DEFAULT_BASE_ADDR,

         ACE_MMAP_Memory_Pool_Options::ALWAYS_FIXED);

      ACE_NEW_RETURN (g_allocator,

                      ALLOCATOR (BACKING_STORE,

                                 BACKING_STORE,

                                 &options),

                      -1);

      ACE_DEBUG ((LM_DEBUG,

                  ACE_TEXT ("Mapped to base address %@/n"),

                  g_allocator->base_addr ()));

 

      showRecords ();

 

但是,首先要求大家能使用相同的基地址,按照ACE给出的例子。其给出默认基地址一个宏ACE_DEFAULT_BASE_ADDR(Linux下是0x80000000)。因为地址空间管理都是操作系统的负责的事情,所以要求使用同一块共享内存的2个进程分配的基地址是一样的是很不靠谱的事情。采用这种方式可能有2个后果,第一如果你要使用多个共享内存,你要自己计算管理进程空间,第二你程序可移植性很低,甚至会出现在一台机器上可以运行,在另外1台机器无法运行。所以大家慎用这个特性比较好。把程序的可靠运行寄托于运气好,这不应该是一个程序员的作风。

所以对于共享内存,如果希望实现与位置无关的分配,我个人的忠告如下:

l      一开始分配足够的空间,不要再进行扩展【注】。因为扩展共享内存可能意味着原来所有的共享内存相关指针会失效。

l      各自进程管理自己的地址空间,共享内存内部不要保存任何指针(特别不要在共享内存内保存指针),所有的地址都使用相对值。这样才能保证重入,和基础地址变化下不出现问题。

 

ACE Programmer's Guide, The: Practical Design Patterns for Network and Systems Programming》中间还提出过处理共享内存池封装,但考虑到涉及所有的共享内存地址的都要调整。不是太认可这种方式。

另外由于ACE的容器都使用了指针,不建议在共享内存中使用ACE的容器。

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值