zoukankan      html  css  js  c++  java
  • 无锁编程(七)

    数据与进程对等的处理

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

    解决方案:“分”

    分号段

    分进程

    分端口

    分库分表

    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;

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    2020多校补题集
    2020牛客多校第10场C Decrement on the Tree树上路径删除
    主席树模板(查询区间第K大的元素)
    第一次小赛
    计算几何小知识整理
    咸鱼暂时退圈
    mysql 格式化时间
    mysql 中国省份城市数据库表
    CF786B Legacy (线段树优化建图模板)
    树上两点期望距离
  • 原文地址:https://www.cnblogs.com/linuxbug/p/4840138.html
Copyright © 2011-2022 走看看