关于memblock

memblock使用了共享内存技术,pulseaudio使用memblock来传递大块数据,这种用在进程间数据传递的时候是非常高效率的。

内存分配与使用

PA启动后先分一大块共享内存(mempool),如果没有启动参数指定的话, 这个mempool的总大小为64KB * 1024,因为采用共享内存技术,所以实际在运行的时候用多少内存就实际分配这么多,不会一下子需要64MB。对于mempool,系统调用下面的API 分配释放。

pool = pa_mempool_new(TRUE, 0);

 pa_mempool_free(pool);

对于64KB * 1024,64KB成为memblock,一共有1024个块。从pool申请block的API有多个,一般采用

block = pa_memblock_new (pool_a, sizeof(txt));

需要注意的是,一个内存块可以被共享,所以,他的释放函数有些非常规,从成对编程的原则考虑,你有一个new函数,必定有个对应的free(或者release,delete等)函数,确实这个函数

memblock_free(block);

但是你不应该直接调用这个free函数,你应该调用

pa_memblock_unref(block);

没有留意到这点,看代码的时候可能会觉得很奇怪。

现在有了block,但是还不能读写这个块中的内存,要想读写,如此这般

    x = pa_memblock_acquire(block);
    snprintf(x, pa_memblock_get_length(block), "%s", txt);
    pa_memblock_release(block);

传递数据的API

另外,memblock的模块提供了API用于传递memblock,这些API可用于大数据的传输。

首先建立一个export和inport,他们分别用来送数据和收数据

export_a = pa_memexport_new(pool_a, revoke_cb, (void*) "A");

 import_b = pa_memimport_new(pool_b, release_cb, (void*) "B");

 然后用这个API可以将数据送出

r = pa_memexport_put(export_a, mb_a, &id, &shm_id, &offset, &size);

上述调用的后四个参数用于获取这个传递的memblock,这四个数据可以很快的传递到其他进程,然后此进程可以调用

mb_b = pa_memimport_get(import_b, id, shm_id, offset, size);

来获取memblock。

接口灵活,效率也高

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值