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;

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

  • 相关阅读:
    多线程2.md
    Python-多线程.md
    Python-Log-note.md
    记账本开发记录——第四天(2020.1.21)
    记账本开发记录——第三天(2020.1.20)
    记账本开发记录——第二天(2020.1.19)
    《构建之法——现代软件工程》读书笔记(一)
    记账本开发记录——第一天(2020.1.18)
    JAVA分级测试——选课系统(补发)
    转专业后补修C语言的一些体会(4)
  • 原文地址:https://www.cnblogs.com/linuxbug/p/4840138.html
Copyright © 2011-2022 走看看