找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 4418|回复: 4

ACE_Message_Block的分配器的使用方法

[复制链接]
发表于 2007-12-15 21:49:45 | 显示全部楼层 |阅读模式
作者:海阔天空
ACE_Messae_Block中结合了ACE_Allocator,使ACE_Message_Block更加灵活,本文中将简单介绍ACE_Message_Block和ACE_Allocator的使用方法,及注意事项。
  首先我们看看ACE_Message_Block的构着函数:

ACE_Message_Block (size_t size,
                     ACE_Message_Type type = MB_DATA,
                     ACE_Message_Block *cont = 0,
                     const char *data = 0,
                     ACE_Allocator *allocator_strategy = 0,
                     ACE_Lock *locking_strategy = 0,
                     unsigned long priority = ACE_DEFAULT_MESSAGE_BLOCK_PRIORITY,
                     const ACE_Time_Value &execution_time = ACE_Time_Value::zero,
                     const ACE_Time_Value &deadline_time = ACE_Time_Value::max_time,
                     ACE_Allocator *data_block_allocator = 0,
                     ACE_Allocator *message_block_allocator = 0);

    其中,使用了三个分配器,Allocator_stratey,data_block_allocator,message_block_allocator,这三个分配器是为ACE_Message_Block中两个对象及器本身分配内存的,data_block, 以及data_block指向的char*内存。
    如此构着三个分配器传入进去,就可以实现预先分配内存的效果。
     
msg_allocator_=new ACE_Cached_Allocator<ACE_Message_Block,ACE_SYNCH_MUTEX>(MsgCount);
    data_allocator_ =new ACE_Cached_Allocator<ACE_Data_Block,ACE_SYNCH_MUTEX>(BuffCount);
    buff_allocator_=new ACE_Cached_Allocator<MEM_BUF,ACE_SYNCH_MUTEX>(BuffCount);
   查看ACE_Message_Block的代码,可以发现,在调用其Release方法时,会先检查是否使用分配其,如果没有使用,直接delete掉,如果使用了分配器,则把内存归还给分配器。
    其中还必须注意一个参数,即locking_strategy,这是一把多线程同步的锁,其主要时在进行浅层拷贝或者release时进行线程安全控制。比如,在调用duplicate或者release时要增减引用计数器。
    下次在写怎样合理使用locking_strategy,使其不影响效率,:)
 楼主| 发表于 2007-12-15 21:51:58 | 显示全部楼层
简单地说是:

先创建分配器,

再创建ACE_Message_Block 的时候,把适当的分配器传给ACE_Message_Block的构造函数,这样使内存管理更灵活.
 楼主| 发表于 2007-12-15 21:55:15 | 显示全部楼层
ACE可以用于高度可预策、对时间要求极高的系统,比如说远程医疗,飞行器姿态控制等,一个端点向另一个端点发送一消息,如果由于时间问题,本来正确的消息也变成错误的消息了。

操作系统在进行内存管理的时候,分进行系统调用,而系统调用到底作了哪些细节操作,其实是未知的。比如,

Message* m = new Message(size)

有可能恰巧内存不足,要抛一个异常给用户代码;

有可能内存分配要影起Paging操作,要将内存作一些移动,以便成功获得新分配的内存.

总之,上述操作是不可预见运行时间的.这样的设计就很难满足刚才所说的对时间要求很高的系统.

而分配器则正是解决这个问题的.它牺牲系统系统的时间,从而换取系统的可预见性.分配器的实先是事先分配一定的内存,然后在需求要的时间再使用,从而避免直接调用不可预见的系统调用。

也许有人会说,我不用ACE一样可以这样做!是的,聪明的你完全可以做到这一点.

但是,ACE为你想得更多,你不但可以实现它,而可以作极小极小的变更,改变不同的内存分配策略,你可以用内存池,可以用Cache,可以静态分配,可以动态分配,而这些不同策略的变更,甚至可以通过参数的方式在运行时变更,几乎不用你修改代码。这一点你是否也想到了呢?
 楼主| 发表于 2007-12-15 21:55:38 | 显示全部楼层
"其中,使用了三个分配器,Allocator_stratey,data_block_allocator,
message_block_allocator,这三个分配器是为ACE_Message_Block中两个对象及器本身分配内存的,
data_block, 以及data_block指向的char*内存。""


ACE_Message_Block 当中 Allocator_strathey 是ACE_Data_block 的分配器,
data_block_allocator 这个分配器 和上面的区别在于不包含通过自身分配得到数据。

message_block_allocator 这个分配器用来在 duplicate (浅拷贝)时 创建一个新的 ACE_Message_Block

也就是说,通常使用当中,只需要创建一个分配器就可以了。

上面的方法仅仅解决了 ACE_Message_Block 分配数据块内存。

问题是new ACE_Message_Block 本身依然无法避免,下回分解?
 楼主| 发表于 2007-12-15 21:55:44 | 显示全部楼层
问题是new ACE_Message_Block 本身依然无法避免,下回分解?


placement new不就可以啊,不要的时候release
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-11-23 21:00 , Processed in 0.014016 second(s), 5 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表