自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(35)
  • 收藏
  • 关注

原创 C++ 值类别(value category)循序渐进(一)值类别是什么

学习C++比较深入点的朋友们对下面这些名词肯定不陌生:左值右值、左值引用、右值引用、移动语义、完美转发、std::forward、std::move,每一个都算不上浅显易懂,但无论是平常工作还是面试都可能遇到,这也是C++进阶必须要掌握的内容,这些其实都是一类问题或者说知识点,也就是值类别(value category),有章法地整体学习这一块内容比每个概念单个看有效得多,这里就开一个新系列来聊聊C++的值类别。整个内容主要以C++ 11之后的modern C++为准,这一块在C++的历史上变化还挺大的。

2022-09-19 23:16:51 1449 1

原创 C++编译知识笔记(三)——静态链接

目录一、空间与地址的分配1.1 相似段合并并确定装载地址1.2 确定符号地址二、符号解析与重定位2.1 符号解析2.2 重定位三、总结编译过后我们会得到.o格式的目标文件,每个c或者cpp文件都会生成一个.o,也就是一个编译单元对应一个.o,而要生成一个可执行程序,则需要各个编译单元之间协调配合,各个编译单元之间存在着各种调用关系,比如跨编译单元访问变量或者调用函数,简单来说将各个.o的内容组织成一个可执行文件的过程就是链接,而静态链接之所以叫静态是因为是在编译期提前做好,相对的有动态链接,后面也会写文章

2022-05-03 16:02:13 1136

原创 C++编译知识笔记(二)——Linux ELF文件解析

这篇文章会以一个目标文件为实例来详细聊一下Linux下的目标文件里究竟有什么,以及它和可执行文件所用到的格式ELF(Executable Linkable Format)

2022-05-02 17:26:31 2293

原创 C++编译期分支选择相关技术

程序员写的代码里,最核心的内容之一就是根据不同的条件判断执行不同的逻辑分支,也就是所谓的if else,而分支判断又可以分为运行时和编译期两种,本篇文章将介绍能够实现编译期分支选择的相关技术,包括函数重载、标签分发(tag dispatch)、模板特化、模板偏特化、if constexpr。

2022-01-31 21:37:01 2810 2

原创 C++11 类型支持之type traits

如果你是一个c++模板用户,大概率多多少少都接触过type traits这个概念,直译就是类型萃取,根据名字也能猜到是用于获取类型的,在c++ 11之前,stl就已经用到了相关技术了,比如迭代器使用相关的类型获取,《STL 源码剖析》有详细介绍,有兴趣的可以去看看。c++ 11更是引入了一个专门的头文件<type_traits>用来做type traits的相关事情,本篇就来聊聊type_traits。

2022-01-16 14:18:25 6203

原创 Modern C++核心内容(一)—— 函数模板和auto关键字的类型推导

目录一、函数模板中的类型推导2.1 ParamType是引用或者指针,但不是万能引用(Universal Reference)2.2 ParamType是万能引用(Universal Reference)2.3 ParamType既不是指针,也不是引用二、auto类型推导三、一些比较边角的情况说到C++的类型推导,绝大部分的C++ programmer都不陌生,多多少少在编码的过程中都会用到,尤其是进入C++ 11之后,就算不用函数模板也免不了会用auto,绝大部时候,即便不了解内部的推导规则,往往也能得

2021-11-28 22:56:43 1298

原创 Python3编码问题全总结

平常主要是写C++,但有时候也需要用到python、shell等脚本来做一些事情,其中最常见的一种应用就是文本处理,而要处理文本不可避免地就要和编码打交道,python3和python2相比在编码方面已经有了很大的进步,但有时候还是会碰到相关问题,以前没怎么特别关注过这块,都使用过程出了什么编码问题拿报错信息一搜照着改改就完事了,但没有彻底理解很容易走弯路,最近又碰到了一次编码问题,于是最近好好整理学习了下,实际上Python3编码相关的问题也分为好多类,这里就完整地总结一下python3里面最核心的编码相

2021-10-15 23:24:33 1198

原创 brpc源码解析(二十)—— 用于访问下游的Channel类详解

文章目录一、ChannelBase类定义二、Channel类基本定义三、Channel参数3.1 ChannelOptions定义3.2 根据ChannelOptions为Channel设置参数四、Channel初始化以前写过访问下游的一些源码解析,但更多的是从整个处理流程上过了一遍,能够快速地熟悉处理过程,但对每个组件地具体地细节并没有过多深入,有点走马观花的感觉。相比较于那会现在对整个brpc的熟悉程度也高了很多,因此打算换个角度逐个介绍下各个设计到的组件。Brpc的客户端和服务端的通信都是基于pr

2021-08-07 10:49:22 2845

原创 C++编译知识笔记(一)——基本知识

文章目录一、编译的基本步骤1.1 预处理阶段1.2 编译阶段1.3 汇编阶段1.4 链接阶段二、核心常用基本概念2.1 .o目标文件2.2 符号2.3 静态链接库2.4 动态链接库三、链接和加载3.1 .o文件和静态库的链接3.2 动态库的链接四、编译的关键参数—各种路径4.1 头文件搜索路径4.2 编译时库文件搜索路径4.3 运行时库文件搜索路径4.3.1 LD_PRELOAD环境变量4.3.2 RPATH4.3.3 LD_LIBRARY_PATH环境变量作为一个C++工程师,编译可以说是日常工作内容中

2021-06-27 23:16:05 584 3

原创 brpc源码解析(十九)—— 双buffer数据结构DoublyBufferedData详解

文章目录一、成员变量二、构造函数和析构函数2.1 构造函数2.2 析构函数三、内部类3.1 tls锁及用户数据Wrapper3.1 读辅助类ScopedPtr3.3 修改所用的Functor四、内部调用函数4.1 直接读取函数4.2 Wrapper增删函数五、外部调用函数5.1 读函数5.2 写函数六、总结在服务端开发中,我们经常会碰到需要热加载的情况,需要在不影响持续请求的情况下更新数据,双buffer是很常见的一种手段,具体概念这里不过多展开,相关资料很多,在brpc里,有一个叫DoublyBuffe

2021-06-01 22:55:55 3342 8

原创 C++同步机制之条件变量(std::condition_variable)

文章目录一、使用机制1.1 涉及的主要概念1.2 wait线程中的用法1.3 notify线程中的用法二、成员函数2.1 唤醒函数2.2 等待函数三、为什么需要互斥锁四、虚假唤醒五、示例对多线程编程有了解的对条件变量(condition_variable)这个概念一定不陌生,相较于另一种常见的同步机制互斥锁,条件变量是一种更高层次的同步手段,互斥锁用于保护一段临界区,也就是各个线程互斥地去访问同一块资源,这是一种很简单直接的同步手段,可以cover住很大一类的同步场景,比如多线程修改一个非线程安全的uno

2021-05-16 15:56:58 4806 3

原创 brpc源码解析(十八)—— MPSC队列ExecutionQueue详解

文章目录一、概述和特点二、生产和消费基本原理三、典型使用方式四、task node和相关内存分配五.启动ExecutionQueue代码解析六、提交、调度和执行相关代码解析6.1 任务提交调度6.2 执行用户函数6.3 新任务检查6.4 取消任务以前关于brpc写socket的一篇文章brpc源码解析(三)—— 请求其他服务器以及往socket写数据的机制里讲到了brpc往fd里写数据的一套机制,最近从朋友那得知原来这部分逻辑已经单独抽出来作为bthread一部分了,也就是ExecutionQueue,顾

2021-03-09 23:55:42 2478

原创 brpc源码解析(十七)—— bthread上的类futex同步组件butex详解

文章目录一、futex简介二、butex源码解析2.1 butex相关数据结构2.2 butex主要机制2.2.1 butex_wait2.2.2 butex_wake我们知道在linux 下,锁和其他一些同步机制都会用到futex,futex诞生后扮演着非常重要的角色,可以说futex是linux底层最重要的同步手段之一,无论是pthread_mutex还是semaphore都用到了futex,bthread作为基于pthread实现的一套线程库,自然也需要类似的线程同步机制,用于在bhtread上进行

2021-01-24 13:27:30 2494

原创 brpc源码解析(十六)—— 作为client的连接建立和处理详解

文章目录一.连接方式的定义二.连接方式的选择三.获取用于连接的socket3.1 获取指代具体下游服务的tmp_socket3.2 根据tmp_socket获取用于发送数据的socket3.3 连接以准备发送四.数据发送完毕后对连接的处理以前写过文章聊过brpc访问下游和发送数据的机制,但和下游连接的相关处理细节没有过多涉及,这里来聊下brpc client对于连接的相关处理。为了避免歧义,这里再贴一下官方文档对于socket的定义:*和fd相关的数据均在Socket中,是rpc最复杂的结构之一,这个结

2020-12-19 09:55:46 2445 5

原创 brpc源码解析(十五)—— bthread栈创建和切换详解

以前的文章讲到了bthread的相关机制,但主要是调度的规则等总体上的流程,关于bthread本身创建和切换相关的细节没有太多涉及,好久没更新博客了,今天来聊一下bthread是如何实现在pthread上进行创建和切换的。一.bthread的本质我们常说的linux线程指的是Light-weight process(轻量级进程,简成LWP), 在NPTL(Native POSIX Thread Library)的实现里,也就是pthread的实现里,是1:1的,也就是一个pthread对应一个LWP,而

2020-10-27 00:01:42 2561 17

原创 CentOS 6.3 上编译TensorFlow 2.4 so动态链接库

目录1. 环境和组件2. 编译步骤3. 收集产出的so和头文件用于编译自己的服务4. tips关于tensorflow(以下简称tf),在实际的生产环境里,经常会有在线预测的需求,用python训练好模型供在服务使用来进行实时的预测,很通行的一种做法是把tf编译成so动态库供c++的在线预测服务调用,关于这类的文章也不少,而且如果是用官方指定的Ubuntu,整个编译过程也很轻松愉悦,没什么坑,但很不幸的是,我们的线上机器主要是Centos 6.3的,不光不是Ubuntu,系统版本比较老,各种组件也比较老,

2020-08-12 22:16:10 608

原创 brpc源码解析(十四)—— 核心组件bvar详解(5)sampler详解

目录1. Sample2. SamplerCollector3. Sampler和ReducerSampler3.1 基类Sampler3.2 继承类ReducerSampler3.2.1 成员变量3.2.2 构造函数3.2.3 成员函数4. 总结这篇来聊一下bvar另外一个很重要的基础组件sampler,也就是采集器,像window等和时间窗口相关的类型需要使用sampler来定时采集,每一个需要采集的bvar对应一个sampler,sampler相关代码在sampler.h和sampler.cpp里,

2020-05-10 14:30:44 1605

原创 brpc源码解析(十三)—— 核心组件bvar详解(4)combiner详解

目录1. GlobalValue2. ElementContainer3. AgentCombiner3.1 定义3.2 内部结构体Agent3.3 成员变量3.3 构造函数和析构函数3.3 主要功能函数4. 总结前面介绍了agent,本篇我们来聊聊combiner,这也是bvar的一个特别重要的基础组件,整个combiner相关的都在combiner.h源文件里,由GlobalValue、El...

2020-04-18 09:53:15 1499

原创 brpc源码解析(十二)—— 核心组件bvar详解(3)AgentGroup类详解

目录1. 类基本定义2. 成员变量3. 函数3.1 Private函数3.1 Public的函数3. 总结上一篇从Reduce和Adder切人整体介绍了下bvar的实现机制,提到了combiner和agent,其中agent负责tls数据的管理和分配,也是bvar最核心的基本机制之一,本篇文章会根据源码介绍下agent的机制。AgentGroup类负责各个agent的分配和管理,采用了块存储。...

2020-04-08 22:06:33 1522

原创 brpc源码解析(十一)—— 核心组件bvar详解(2)Reducer类和Adder类解析

目录1. Reducer类2. Adder类3. 总结上一篇文章聊了下bvar的整体组织架构,本篇将从最基本的计数器Adder的使用出发,分析Reducer和Adder的源码来阐述下最基本也是最重要的bvar工作机制,后续再进一步深入分析相关基础组件和其他类型的bvar,我觉得这也是一个比较有效地阅读分析这种基础类库源码的方式。整个brpc源码解析系列其实也是这么一个组织结构,先从使用的部分切入...

2020-04-02 20:33:07 1594

原创 brpc源码解析(十)—— 核心组件bvar详解(1)简介和整体架构

目录1. 主要核心类及其作用2. 类变量和初始化3. push函数4. pop函数5. steal函数6. atomic_thread_fence(butil::memory_order_seq_cst)的必要性7. volatile_size函数Bvar是Brpc使用的多线程环境下的计数器类库,作为一个完善的rpc框架,在实际生产环境中统计诸如qps、连接数等各种数值是必须的,是服务监控的很重...

2020-03-28 21:07:26 4709

原创 brpc源码解析(九)—— 基础类WorkStealingQueue详解

目录1. 基本介绍2. 类变量和初始化3. push函数4. pop函数5. steal函数6. atomic_thread_fence(butil::memory_order_seq_cst)的必要性7. volatile_size函数前面介绍过,work stealing queue是bthread种的重要机制,worker给自己的队列里添加任务,消化任务,也如果空闲下来了就会去其他work...

2020-02-14 21:11:54 2850 19

原创 C++ memory order循序渐进(五)—— C++ memory order在编译器和cpu层面的具体实现

文章目录1.x86-642.ARMv8(AArch64部分)3.总结前面四篇文章主要介绍了c++ memory order的概念和使用,在实际的lock free编程中,知道这些基本就够了,定好了memory order剩下的事情编译器和cpu会给我们保证,但了解底层实现有助于加深理解,本篇文章就来介绍一下各种memory order在编译器和cpu层面的具体实现。前面说过,C++的memory...

2020-02-11 23:38:36 2735 10

原创 C++ memory order循序渐进(四)—— 在std::atomic_thread_fence 上应用std::memory_order实现不同的内存序

文章目录1. atomic_thread_fence分类和效果1.1 Release fence1.2 acquire fence1.3 full fence2. fence和同样memory order的原子操作同步效果的区别3. 利用atomic_thread_fence进行release acquire同步3.1 release Fence - atomic acquire 同步3.2 At...

2020-01-11 11:54:57 12291 7

原创 C++ memory order循序渐进(三)—— 原子变量上组合应用memory order实现不同的内存序

文章目录1.Relaxed ordering2.Release-Acquire ordering3.Release-Consume ordering4.Sequentially-consistent ordering5.总结前面介绍了c++里一共有六种memory order,要达到数据同步的效果,需要进行组合使用,我们可以在两个地方指定memory order,一是atomic变量(原子变量)...

2020-01-05 19:05:42 6046 38

原创 C++ memory order循序渐进(二)—— C++ memory order基本定义和形式化描述所需术语关系详解

目录1.c++的六种memory_ordermemory_order_relaxedmemory_order_consumememory_order_acquirememory_order_releasememory_order_acq_relmemory_order_seq_cstSequenced-beforeCarries dependencyModification orderReleas...

2019-12-22 23:10:56 7071 13

原创 C++ memory order循序渐进(一)—— 多核编程和memory model

目录1. 多核编程面临的问题2. lock free2.1 lock free的定义2.2 Lock free 相关技术3. Memory model3.1 reorder类型和Memory model的强弱3.2 Compiler Barrier和Runtime Memory Barrier3.3 run time memory barrier4. c++ 11 memory order前面看...

2019-12-21 22:43:30 5041 3

原创 brpc源码解析(八)—— 基础类EventDispatcher详解

目录1.启动相关函数2.添加epoll_in事件函数3.添加epoll_out事件函数4.Run和RunThis函数5.获取EventDispatcher函数6.核心类变量前阵子比较忙,好久没有更新了,后续争取恢复更新频率,这次先更一篇相对简单的,介绍下EventDispatcher类,前面的文章涉及过这个概念, EventDispatcher,顾名思义,就是用来分发事件的,在brpc里面,因为...

2019-11-18 22:50:02 1879 4

原创 brpc源码解析(七)—— worker基于ParkingLot的bthread调度

前面已经介绍过了bthread的主要机制,但对于具体的调度细节没有过多涉及,本篇将在着重介绍下bhtread在各个worker(taskgroup)之间的调度方式。在brpc里,有个和调度相关的重要类ParkingLot,parking lot 本质上就是基于futex的wait/signal,以前没太多接触过futex,刚好趁着阅读brpc的源码熟悉下futex的机制。Futex是linux一...

2019-09-19 22:54:11 2762 21

原创 brpc源码解析(六)—— 基础类socket详解

目录1 基本介绍2 主要函数详解2.1 Create2.2 Address2.2 SetFailed2.3 Dereference1 基本介绍Socket在计算机领域通常指套接字,这里说的brpc里面的socket指的是一种用于方便在多线程环境下使用包括套接字在内的fd等资源的通用结构,前面的文章介绍brpc服务器启动以及发送接收请求相关内容的时候就多次设计到了这个数据结构。下面先贴一段官方文...

2019-09-10 23:12:29 3464 12

原创 brpc源码解析(五)—— 基础类resource pool详解

目录1.获取资源2.归还资源3.总结brpc是一个完整的rpc框架,其中用到了很多比较优秀的基础类,会看情况分析下这些类的源码,从这篇的resource pool开始,resource pool是很重要的基础类之一,顾名思义,就是资源池,是一个用于在多线程环境下进行资源分配和回收的类,可以理解为高度竞争环境下速度更快的new和delete。resource pool在brpc里面有着大量的使用,...

2019-08-28 23:40:43 4307 5

原创 brpc源码解析(四)—— Bthread机制

Bthread是brpc用到的一个线程库,也是brpc的核心之一,默认情况下,包括用户代码在内的绝大部分代码都是运行在bthread里的,bthread也是brpc实现高性能的基石。bhtread官方文档定义如下:bthread是baidu-rpc使用的M:N线程库,目的是在提高程序的并发度的同时,降低编码难度,并在核数日益增多的CPU上提供更好的scalability, cache loca...

2019-08-18 17:34:40 15808 20

原创 brpc源码解析(三)—— 请求其他服务器以及往socket写数据的机制

目录1.brpc请求其他server方式1.1 基于proto的rpc请求示例1.2 普通http请求示例:2.brpc写数据的机制brpc作为一个rpc框架,除了支持作为server当然也需要对调用其他server有良好的支持,这篇将着重介绍一下brpc访问其他server的具体过程以及与之相关的往socket写response的机制。1.brpc请求其他server方式brpc里发送数据...

2019-08-13 01:08:16 5978 22

原创 brpc源码解析(二)—— brpc收到请求的处理过程

作为rpc服务器,在启动过后,最主要的一个过程就是收到请求后的处理,而这就牵涉到一个网络编程相关最基本的部分:如何有效地处理socket传过来地数据。最典型的实现就是区分I/O线程和工作线程,一个或多个I/O线程负责从socket读取数据放入一个队列,然后一堆worker线程来从队列里取数据并处理,或者I/O线程读完数据直接交给worker,此类严格区分I/O线程和worker线程的机制会有几种典...

2019-07-29 23:39:45 11016 13

原创 brpc源码解析(一)—— rpc服务添加以及服务器启动主要过程

目录1.往server里添加Service(业务代码)2.设置服务器参数3.启动服务器平时的工作用到了baidu-rpc搭建rpc服务,作为戈君大神的大作,在没有开源的时候,这个c++ 的rpc框架在厂内就已经好评颇多,无论是性能、文档、还是代码注释都很优秀,内部使用范围特别广,17年开源,开源版本叫做brpc,开源后不少大厂都有使用,目前已经进入Apache孵化器,源码以及文档的地址如下:ht...

2019-07-10 00:08:39 13858 10

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除