无锁编程(七) - 实战

数据与进程对等的处理

场景:某服务需要支持海量用户,在一台物理机器上运行了多个进程/线程。对于数据应该如何处理以保证安全快速的访问数据呢?

解决方案:“分”

分号段

分进程

分端口

分库分表

clip_image002

单一生产者与单一消费者

场景:

网络接入进程与逻辑处理进程通过共享内存通讯。我们要如何进行设计?

通常的实现:读写加锁

示例:无锁内存队列的实现

image

append_data(srcbuf, buflen)

int usedSize = (m_head->size + m_head->endPos – m_head->beginPos) % m_head->size;

int leftSize = m_head->size – usedSize;

if (leftSize < buflen) return -1;

_copy_to_queue();

Int newpos = ….;

m_head->endPos = newpos;

take_data(dstbuf, buflen)

if (m_head->beginPos == m_head->endPos) return -1;

_copy_from_queue();

_do_copy_data();

int newpos = ….;

m_head->beginPos = newpos;

进程运行中重新加载配置(双缓存)

场景:

1、 进程需要可以动态加载配置,我们需要怎么做?

2、 进一步,如果配置非常复杂,各个配置具有一定的依赖性,配置检查错误的话加载配置将会失败。我们如何设计才能安全、动态、无锁的加载配置?

通常的实现:

重启进程

发送信号

创建管理端口

示例1:直接访问共享内存

clip_image006

示例2:双配置缓冲区的实现

clip_image008

代码:

cfg_t* get_cur_cfg

return cfg_list + cur_idx;

load_cfg

int another = 1 – cur_idx;

_load_cfg(cfg_list + another);

cur_idx = another;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值