- 博客(33)
- 收藏
- 关注
原创 对网络库协程的思考——读brpc有感
bthread的作用之一:将Reactor中的同步IO改异步IO。理论上Reactor效率不如Proactor,具体表现在虽然Reactor模型避免了等待可读/可写事件就绪的时间,但是read/write调用本身的时间是不可避免的(即内核缓冲区和用户缓冲区之间的数据拷贝是占用当前线程CPU时间的),而Proactor却可以避免这个时间,所以效率更高。那么为什么说Proactor效率更高呢?虽然Proactor不需要等待read/write本身,但只是把读写处理时间转交给了操作系统内核线程,总的处理时间并
2022-05-24 15:30:26
373
原创 分布式存储探索
分布式存储探索一些概念CAP理论的真实含义(CAP理论中的P到底是个什么意思? - 四猿外的回答 - 知乎 https://www.zhihu.com/question/54105974/answer/1643846752)CAP定理指的是在一个分布式系统中,一致性(Consistency)、可用性(Availability)、分区容错性(Partition tolerance)这三个要素最多只能同时实现两点。C:数据一致性。即强一致性,写请求的变化能立即反映到读请求中。如果节点间无法保证一致性
2022-05-24 15:29:18
257
原创 brpc源码分析——线程模型
brpc线程模型从一个server的启动过程谈起,我们这里以echo server为例:int main(int argc, char* argv[]) { // gflags介绍:https://blog.csdn.net/lezardfu/article/details/23753741 // Parse gflags. We recommend you to use gflags as well. GFLAGS_NS::ParseCommandLineFlags(&
2022-03-14 16:27:42
3276
原创 brpc源码分析——数据报处理过程
brpc数据包处理过程前面我们提到brpc会在Server::Start中将listened_fd加入众多EventDispatcher之一,让epoll监听其EPOLLIN事件,我们将从listened_fd的可读事件触发来讲解一个数据包如何被接收 + 处理 + 响应。OnNewConnections我们知道Socket::ProcessEvent会调用listened_fd的回调事件:s->_on_edge_triggered_events,此回调函数在Acceptor::StartAcc
2022-03-14 16:27:17
728
原创 brpc环境配置
基本上跟着官网的指导走就可以,但是当前版本的CMAKE有点问题。如果说你想运行example子文件夹下的样例程序,那么按照教程输入以下指令:$ cd example/echo_c++$ cmake -B build && cmake --build build -j4$ ./echo_server &$ ./echo_client然后在cmake -j4时就会报错Fail to find brpc,定位到子CMakeLists.txt文件后可以发现以下判断语句:if(
2022-01-28 20:55:20
1374
原创 Seastar源码阅读(三)future
Seastar futurepromise with future一个future对象必须绑定在一个promise对象上,当promise::set_value()被调用时,该future对象变为就绪态。我们以一个future的常见用途为起点分析:template <typename Clock = steady_clock_type, typename Rep, typename Period>future<> sleep(std::chrono::duration<
2022-01-28 20:48:31
860
原创 Seastar源码阅读(二)—事件循环
Seastar事件循环reactor::do_runSeastar应用中的每个线程都会调用reactor::do_run()函数,进入事件循环,do_run()函数主要做以下工作:注册各种poller,它们被保存在_pollers数据结构(std::vector<pollfn*>类型)中。异步future等待网络栈启动,当所有线程的网络栈都启动后reactor正式启动(_start_promise.set_value())。设置空闲时间检测定时器load_timer,当CPU足够空闲
2022-01-24 10:04:11
643
原创 Seastar源码阅读(一)启动过程
Seastar启动过程Seastar程序的启动是通过调用run或run_deprecated函数来完成的,用户传入命令行参数和需要执行的主函数体即可。run, run_deprecatedrun是对run_deprecated的简单包装,所以我们只谈论后者。run_deprecated主要做以下事情:使用boost::program_options加载选项描述并解析命令行选项。设置logger配置,如log level,log type等。调用smp::configure()启动reacto
2022-01-23 12:15:14
595
原创 Seastar Tutorial 简明教程
这是对于Seastar官方tutorial的部分翻译,同时也结合了自己的思考。IntroductionSeastar是一个用于在现代多核机器上编写高性能的复杂的服务端应用的C++库。Seastar是一个完整的异步编程框架,使用futures和continuations两个概念来抽象对于I/O事件的处理。因为现代处理器核心共享数据会带来很多惩罚,所以Seastor想要避免多个核心共享内存,而用消息传递机制取代之。Since modern multi-core and multi-socket ma
2022-01-23 12:13:52
1617
原创 seastar环境配置
官方教程在这里:https://github.com/scylladb/seastar/blob/master/HACKING.md按照步骤走,然后出现错误:执行sudo ./install-dependencies.sh时失败,大意是libfmt-dev安装失败。如果出现更多错误,可以先尝试https://askubuntu.com/questions/1305141/failed-to-fetch-security-undermined-error-ip-91-189-91-38-80-in
2022-01-20 00:19:39
1174
原创 levelDB布隆过滤器实现分析
levelDB布隆过滤器实现布隆过滤器是这样一个数据结构,它可以用来判断某些元素是否可能已存在(于下一层的存储介质中);它可能把不存在的元素误认为已存在,但不会把已存在的元素误认为不存在。所以如果布隆过滤器认为一个元素不存在,那么它就真的不存在,如果它认为一个元素已存在,那么它只是可能存在。原理布隆过滤器的底层是一个位数组结构。每次add一个元素,布隆过滤器都将使用k个哈希函数对此元素分别计算得到k个哈希值,哈希值模位数组长度的结果对应位数组中一个位置,然后布隆过滤器将这k个位置都置为1.每次fi
2022-01-16 10:40:46
352
原创 云风coroutine库源码分析
项目介绍-coroutine云凤写过一个简易协程库,介绍如下:It’s an asymmetric coroutine library (like lua).You can use coroutine_open to open a schedule first, and then create coroutine in that schedule.You should call coroutine_resume in the thread that you call coroutine_open,
2021-11-30 20:39:39
297
原创 protobuf底层编码格式一览
protobuf底层编码格式首先要认识protobuf支持的几种编码方式和它们对应的数据类型:wire-typemeaningused for0varintint32, int64, uint32, uint64, sint32, sint64, bool, enum164-bitfixed64, sfixed64, double2length-delimitedstring, bytes, embedded messages, packed repeate
2021-11-27 18:01:37
1054
原创 内存对齐和alignof,alignas
内存对齐和alignof,alignas内存对齐的原因:某些硬件平台不支持对未对齐对象的访问对齐后,访问效率更高内存对齐要求:任何K字节的基本对象的地址必须是K的倍数。为了实现这个要求,结构体中会有一些填充字节,即padding;另外,结构体的末尾可能也需要一些填充,这样结构体数组中的每个结构体元素都会满足对齐要求,即alignment。举例说明:struct S1 { int i; // size: 4 char c; // size: 1 // 3 bytes pad
2021-11-24 10:57:20
633
原创 ZooKeeper使用入门教程-C语言版
ZooKeeper使用入门教程-C语言版假设你已经完成了复杂的Zookeeper Server和C client安装。参考资料:http://zookeeper.apache.org/doc/r3.5.9/zookeeperProgrammers.htmlhttps://www.cnblogs.com/haippy/archive/2013/02/23/2921100.html背景因为要做分布式框架,看大家说ZooKeeper适合做服务注册与发现模块,所以考察了一下这个Zoo Keeper,发现
2021-11-10 14:07:18
3256
3
原创 grpc C++ 安装踩坑
安装过程按照这个来的:https://grpc.io/docs/languages/cpp/quickstart/坑1——网络问题在执行git clone --recurse-submodules命令时,因为网络错误导致一些依赖包下载失败,这种网络问题有几种解决方法:移民使用gitee,但是要把所有的依赖库都移植一遍,非常麻烦不断重试,直到成功这里采用法三,怎么重试呢?进入刚克隆的grpc文件夹,执行git submodule update --init命令就可以只重试依赖包而不是整个gr
2021-10-23 14:25:33
542
原创 一文看懂C++ lambda表达式
原文链接:https://mp.weixin.qq.com/s?__biz=MzkxMzI5NDI2OA==&mid=2247483663&idx=1&sn=5270c0c75ca260935215d615129a261b&chksm=c17e97dcf6091eca30a4f998e4cb878ed35bf5b1d597aeb7b78f4b188bfcc9f12d80d26fb084&token=1767427365&lang=zh_CN#rd前言C++
2021-10-19 14:14:00
402
原创 folly SpinLock源码分析
folly SpinLock源码分析概述SpinLock是对自旋锁的简单实现,因为SpinLock类仅仅是对MicroSpinLock的简单包装,所以本文主要讲述MicroSpinLock的实现。后者的实现文件是folly/synchronization/MicroSpinLock.h。设计-MicroSpinLock唯一的数据成员就是一个uint8_t,它被作为一个值或为FREE或为LOCKED的原子变量使用:struct MicroSpinLock { enum { FREE = 0,
2021-10-15 10:13:06
580
原创 C++类的特种函数生成机制
C++类的特种函数生成机制规则参考Effective Morder C++上的说明:默认构造函数:仅当类中不包含用户声明的构造函数时才生成。析构函数:默认生成,当基类的析构函数为虚时,派生类的默认析构函数为虚函数。拷贝构造函数:仅当类中不包含用户声明的拷贝构造函数时才生成。如果该类声明了移动操作,那么拷贝构造函数将被定义为删除的。拷贝赋值运算符:仅当类中不包含用户声明的拷贝赋值运算符时才生成。如果该类声明了移动操作,那么拷贝赋值运算符将被定义为删除的。移动构造函数和移动赋值运算符:仅当类中不
2021-09-13 13:35:43
650
1
原创 RVO返回值优化
RVO返回值优化标准Copy Elision拷贝省略,即避免函数返回值对象或者传递参数为值对象时触发复制 / 移动构造函数。RVO即Return Value Optimization,是针对返回值的Copy Elision,可细分为NRVO(Named Return Value Optimization,具名返回值优化)和URVO(Unknown Return Value Optimization,匿名返回值优化)。C++17之前,标准对此行为没有规定,但大多数编译器都默认开启两项优化,可以添加编译
2021-08-31 17:18:31
303
原创 C++程序退出机制
C++程序退出机制从几个std函数入手分析:std::exit,用于正常流程退出,由用户显式调用。(main()函数返回 = 调用main内部局部变量的dtor + std::exit(0))。std::terminate,用于异常流程退出,一般由库函数调用。std::abort,直接终止程序。其中只有std::exit()函数会执行清理动作,比如调用析构函数和执行std::atexit注册过的函数。另外,std::asssert()断言失败时会输出错误信息 + 调用std::abort()
2021-08-23 21:10:50
9393
1
原创 muduo中的reactor模式实现浅析
muduo中的reactor模式实现浅析最近刚刚看完了陈硕大神的《Linux多线程服务端编程》,对muduo源码也略有阅读,故作此总结。Reactor模型先来看看定义:The reactor design pattern is an event handling pattern for handling service requests delivered concurrently to a service handler by one or more inputs. The service ha
2021-08-19 14:03:57
666
原创 探查C++ name mangling
什么是name mangling?C++编译器会为代码中的每个函数签名生成全局唯一的名字,以方便后续定位和引用,这个名字是由函数名和函数参数组合而成的,不考虑返回值(这是合理的,因为在cpp语法中:函数签名相同但返回值不同的函数声明被认为是具有二义性的非法声明)。怎么查看mangled name?可以使用nm工具探查编译后的目标文件:g++ -c t.cppnm t.o如果t.cpp中这么写:int foo(bool x) { return 42;}int foo(int x)
2021-08-02 13:29:00
645
原创 std::future和std::async,std::packaged_task,std::promise的交互
std::future和std::async,std::packaged_task,std::promise的交互std::future是C++标准库对一次性事件的表述,而std::async,std::packaged_task,std::promise是三种驱动异步任务的方式,三者各有方法返回一个对应的std::future,调用方可以使用它来获取返回值。std::async(一般)会立即在另一个线程中执行任务,std::packaged_task会在主动调用operator()时在另一线程中执行任
2021-07-15 17:02:13
153
原创 信号屏蔽与处理
信号来源与处理有多种产生信号的方式:用户在终端中按下快捷键,shell将产生信号发送至前台进程组。如Ctrl-C触发SIGINT信号,Ctrl-Z产生SIGTSTP信号,Ctrl+\产生SIGQUIT信号。硬件异常产生信号,如除数为0产生SIGFPE信号,无效的内存引用产生SIGSEGV信号。程序调用kill系统调用发送信号给指定进程/进程组。相关软件条件发生,例如SIGURG,SIGPIPE,SIGALRM等。进程可告知内核采取三种动作之一处理到来的信号:忽略此信号。内核将不会通知进
2021-06-03 22:32:02
815
原创 UNP前六章 回射服务模型 解析
本文试对UNP一书中截止到第六章的回射服务模型进行剖析,重点在于讲解代码为什么怎么做。下面的代码分别对应书中的5-12 tcpserv04.c,6-13 strcliselect02.c。服务器代码:#include <unp.h>void sig_chld(int signo) { pid_t pid; int stat; while ((pid = waitpid(-1, &stat, WNOHANG)) > 0) { pr
2021-05-16 19:12:27
134
原创 C++Primer二刷重要知识点总结
时隔半年,最近开始第二遍看C++ Primer,发现自己之前有很多理解不透彻的语法细节或STL库使用,故写下此博客以做总结。第二章—占坑–
2021-03-08 14:19:28
169
4
原创 关于MIT6.828_HW9_barriers xv6 homework9的一些问题
最近在学MIT6.828,做了HomeWork9:barriers。大意就是实现一个线程屏障,多个线程都会调用barrier()函数,然后要求所有的线程都进入此barrier函数后才能依次离开barrier。我的实现是这样的:static void barrier(){#define wait() pthread_cond_wait(&bstate.barrier_cond, &bstate.barrier_mutex)#define notify() pthread_cond_
2021-02-21 11:28:55
407
2
原创 macos使用C++-connector连接mysql环境配置
macos使用C+±connector连接mysql环境配置多有借鉴:https://blog.csdn.net/zhang35/article/details/106724791/其实官网的教程只说明了最终步骤,但是你去执行一定会报错。错误可以分为两种:找不到头文件(如mysql.h)找不到lib库(如libssl.1.1.dylib)第一个问题需要你指定头文件所在的目录,其实就是两个目录/usr/local/mysql/include,/usr/local/mysql-connector
2021-02-01 21:45:55
2956
8
原创 HDU1847解题思路
HDU1847(巴什博弈)思路:因为是最后一次取的人胜利(巴什博弈定义),所以对先手来说,要确保自己取完后后手不能立刻获胜思考,当 n 为 2^k 时,先手胜利f;当 n 不是 2 ^ k 时,先手要想获胜,就要保证在自己取数之后的状态是"后手"获胜的状态,比如 n6 时,先手可以取1,2,4,又知道 n2,4,5 时状态为"先手"胜利,那么最终后手胜利又当 n7 时,先手如果取4, 又知道 n3 时状态为"后手"胜利,所以最终先手胜利进一步归纳,可以发现当n从1逐渐增加时,先后手的胜利者为
2020-10-27 22:56:20
297
原创 WSL+Valgrind+Clion
记录以下搭建WSL工具链的过程首先要修改镜像源,https://www.cnblogs.com/mydailycoding/p/12375273.htmlevget.com/video/2616g++啥的直接安装–essential安装https://www.linuxidc.com/Linux/2018-09/154165.htm官方https://blog.jetbrains.com/clion/?s=wsl...
2020-06-22 17:46:42
1300
1
原创 配置web服务器步骤详细记录(多有借鉴)
阿里云JAVAWEB部署环境配置配置文档1. java和tomcat的环境配置这里尤其注意(1)把阿里云服务器的安全组规则设置上8080/8080,重启后有几分钟的延迟。(2)在linux中使、用firewall-cmd --state查看防火墙状态,确保为running,并且使用firewall-cmd --permanent --add-port=8080/tcp打开8080端口此文最...
2020-03-31 21:09:49
865
原创 JavaWeb纲要
Java学习纲要JavaSE(待补充)IOJavaWebServlet- 文件目录架构(待补充)- HTTP请求和HTTP响应- Servlet的构建基础- 获取请求内容和响应请求- ServletConfig和ServletContext待补充。。。这是一个笔记型博客,可以快速查阅内容JavaSE(待补充)IOJavaWebServlet- 文件目录架构(待补充)- HTTP请求和...
2020-03-30 19:19:10
191
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人