Stephan14 Blog

享受编程,信仰技术

分布式系统模式

读书笔记

一致性内核(Consistent Core) 问题 在集群内部中存在部分数据(节点信息、数据分片信息等)需要保证强一致性(线性一致性),通常的方案是使用quorum写入方式,但是其系统的吞会随着节点的增加降低。 解决方案 集群内部再组建一个3或5个节点的小集群,通过relase机制在集群内部进行决策。最简单的接口如下: public interface ConsistentCore...

​C++获取exception栈

使用GDB调试C++进程

问题 当C++程序core dump的时候,有可能是程序中抛出了exception,但是上层的代码没有进行catch 这种exception导致的。同时,如何定位这种抛出exception的地方比较困难,这里提供一种通用的方式来定位抛出exception的函数。 例子 #include <iostream> #include <string> // #includ...

​Effective C++ 改善程序与设计的55个具体做法

读书笔记

让自己习惯c++ 条款03:尽可能使用const 以下2种写法意义相同 void f1(const Widget* pw); void f2(Widget const * pw); const和迭代器 std::vector<int> vec; const std:::vector<int>::iterator iter = vec.begin(); *it...

​网络 IO 演变发展过程和模型介绍

转载自腾讯技术工程微信公众号

在互联网中提起网络,我们都会避免不了讨论高并发、百万连接。而此处的百万连接的实现,脱离不了网络 IO 的选择,因此本文作为一篇个人学习的笔记,特此进行记录一下整个网络 IO 的发展演变过程。以及目前广泛使用的网络模型。 1.网络 IO 的发展 1.1网络 IO 的各个发展阶段 通常,我们在此讨论的网络 IO 一般都是针对 linux 操作系统而言。网络 IO 的发展过程是随着 linu...

The Tail At Scale

论文总结

为什么会存在抖动 响应时间的抖动会导致服务的各组件产生高的长尾延迟,而抖动的产生有很多原因,包括 共享资源:机器可能被争夺共享资源(如 CPU 核心、处理器缓存、内存带宽和网络带宽)的不同应用所共享,而在同一应用中,不同的请求可能争夺资源。 守护程序:后台守护程序可能平均只使用有限的资源,但在运行时可能会产生几毫秒的峰值抖动。 全局资源共享:在不同机器上运行的应用程序可能会争抢...

GFS论文总结

读书笔记

设计概述 设计预期 组件故障处于常态,系统需要能迅速侦测、冗余并灰度失效组件 系统能存储一定数量的大文件(通常是在100MB以上),同时也支持存储小文件,但是不需要对小文件进行优化 主要是2种读操作,分别是大规模的流式读取和小规模的随机读取(如果对性能有要求,可以将小规模的随机读取合并并排序,之后按照顺序批量读取) 主要是2种写操作,分别是大规模的顺序追加写和小规模的随机...

Linux服务端多线程编程

读书笔记

第一章:线程安全的对象生命周期管理 构造函数与多线程 构造函数做到多线程安全,唯一要求是在构造期间不要泄露this指针,即: 在构造期间不要注册任何回调函数 不要在构造期间把this指针传给跨线程对象 即使在构造函数最后一行也不可以,因为此类可能是基类 通常使用方式是二段式构造,即构造函数+initilalize()函数 析构函数遇到多线程存在问题 其他线程函数是...

C++类型转换

C++四种类型转换区别

背景 C 风格(C-style)强制转型如下: (T) expression // cast expression to be of type T 函数风格(Function-style)强制转型使用这样的语法: T(expression) // cast expression to be of type T 这两种形式之间没有本质上的不同,它纯粹就是一个把括号放在哪的问题。我...

C/C++ Volatile关键词深度剖析

Volatile关键词的三大特性

背景 最近写代码的时候使用到了volatile关键字,深入思考了一下volatile关键字的特性,并参照别人的文章验证了一下,所以在这里记录一下自己的验证结果。 特性 易变的 在介绍C/C++ Volatile关键词的”易变”性前,先让我们看看以下的两个代码片段,以及他们对应的汇编指令(以下用例的汇编代码,均为VS 2008编译出来的Release版本)。 测试用例一:非Volatil...

C++ 初始化

C++的各种初始化方式

C++小实验测试:下面程序中main函数里a.a和b.b的输出值是多少? #include <iostream> struct foo { foo() = default; int a; }; struct bar { bar(); int b; }; bar::bar() = default; int main() { foo a...