无锁编程(七) - 实战_无锁编程 双缓存_三丰SanFeng的博客-程序员秘密

技术标签: 编程基础  同步机制  C++  Linux  竞争  Linux同步机制与无锁编程  linux  无锁编程  

数据与进程对等的处理

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

解决方案:“分”

分号段

分进程

分端口

分库分表

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;

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/linux_bug/article/details/48688071

智能推荐

Spring定时器StopWatch_weixin_34107955的博客-程序员秘密

为什么80%的码农都做不了架构师?&gt;&gt;&gt; ...

mac上安装了windows虚拟机后,怎么和windows连同一个网络;虚拟机共享网络给宿主机使用,_mac 与虚拟机共享网络_浮沉即半生的博客-程序员秘密

1,虚拟机两块网卡2,连上VPN,将VPN的网络共享到第二块网卡3,第二块网卡设置一个IP,从MAC里面对应网络设置成路由4,先把虚拟机防火墙关闭使用MAC 过程中会遇到某些主机环境需要使用特定的vpn软件才能连接,这时只能安装虚拟机并安装相应的软件来访问,比如如下情况:客户主机只能使用这个软件来访问。开始时候尝试用ccproxy做转发,奈何虚拟机cpu和内存不足...

有安全研究者混入了PHP 8.0开发组!_落沐萧萧的博客-程序员秘密

经历了近半年的alpha版本测试后,PHP在2020年11月26号正式发布了8.0版本:https://www.php.net/releases/8.0/en.php今天我们就来浏览一下PHP 8.0中出现的主要特性,以及它给我们安全研究人员带来的挑战。命名参数 Named ArgumentsPHP 8 以前,如果我们需要给一个函数的第N个参数传参,那么这个参数前面的所有参数,我们都需要传参。但是实际上有些参数是具有默认值的,这样做显得多此一举。比如,我们要给htmlspecia..

the key specified to compute a hash value is expired_GlenPeng的博客-程序员秘密

the key specified to compute a hash value is expiredCRMKey过期...

三极管漏电流导致MOS无法关断,根源在于开关电源纹波过大……_weixin_34232744的博客-程序员秘密

今日做两个项目,传感器测试仪和电机测试仪,cortexA8架构,Android操作系统,手持外形设计。硬件做到硬件调试阶段,MOS管无法关闭问题调了2天也没解决,一直怀疑是MOS端问题。设计如下图:EN控制12V电源的通断,此设计在我以前设计的手持端用过,是经过验证可以使用的设计,虽然有改进余地。但是到了这里MOS管永远常开,测量R6下端电压为7.2V,使得VGS=-3V以上...

开发者福利!Twitter 推出开源 iOS 文本编辑器 API_程序员大咖的博客-程序员秘密

Python实战社群Java实战社群长按识别下方二维码,按需求添加扫码关注添加客服进Python社群▲扫码关注添加客服进Java社群▲技术编辑:宗恩丨发自 思否编辑部近日,Twitter ...

随便推点

LAYA 3D编辑器(unity3D)使用教程(基础课)_laya3d_编程之力的博客-程序员秘密

目标;把模型师制作的3D文件显示到Laya舞台中以跑酷为案例,模型师分别制作好了建筑模型和动画模型(猫)先讲第一个,把一个房子显示到舞台中接着讲第二个让猫在舞台中动起来

用Python实现 学生信息管理系统_Miku丨无形的博客-程序员秘密

项目要求:读完题目,首先我们要确定程序思路我们要全部通过类去实现也就是 我们要实现管理员、学生、讲师、课程、教师五个类管理员类class Administration(object): def __init__(self): self.data = self.__load() self.login_data = {} def __load(self) -&gt; list: try: Adm = open(

前端学习笔记:管理多个版本的node和angular/cli_angular/cli 多版本_wujiayucn的博客-程序员秘密

在同一个机器上需要不同版本的node环境,对应的angular/cli的版本也就不同。使用nvm来进行安装和管理安装nvm(mac/linux版)下载wget https://raw.githubusercontent.com/creationix/nvm/v0.33.11/install.shbogon:~ wjy$ wget https://raw.githubuser...

饼状图报错:Uncaught TypeError: Cannot read property ‘getAttribute‘ of null_无人之岛08的博客-程序员秘密

1、错误描述 谷歌浏览器 火狐浏览器 TypeError: Cannot read property 'getAttribute' of null at Object.s.init (echarts-all.js:1) at buildChart (map.js:720) at b.$scope.queryChart (map.js:138) at map.js:175 at angular....

编译vim时You need to install a terminal library; for example ncurses.解决_guyue35的博客-程序员秘密

编译vim时You need to install a terminal library; for example ncurses.解决You need to install a terminal library; for example ncurses. - 享受技术带来的快乐 - 博客频道 - CSDN.NET  http://blog.csdn.net/jdsjlzx/artic

java 序列化和反序列化实现克隆_qi7210577的博客-程序员秘密

package com.clone.test;import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;pu

推荐文章

热门文章

相关标签