自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 tcmalloc锁粒度

ThreadCacheTCMalloc减少了多线程程序中的锁争用情况。对于小对象,因为ThreadCache,每个线程对小对象的获取直接从该线程的ThreadCache获取,几乎已经达到了零争用。但当ThreadCache中的可用空间用完后,还是会需要向CentralCache申请空间。CentralCache全局只有一个,这时候需要锁了,因为可能会有多个ThreadCache向CentralCa...

2018-03-22 17:27:55 754

转载 tcmalloc总结

总体结构在tcmalloc内存管理的体系之中,一共有三个层次:ThreadCache、CentralCache、PageHeap,如上图所示。分配内存和释放内存的时候都是按从前到后的顺序,在各个层次中去进行尝试。基本思想是:前面的层次分配内存失败,则从下一层分配一批补充上来;前面的层次释放了过多的内存,则回收一批到下一层次。这几个层次从前到后,主要有这么几方面的变化:线程私有性:ThreadCac...

2018-03-22 16:56:24 1198

转载 C++智能指针的简单实现

template <typename T>class smart_ptrs {public: smart_ptrs(T*); //用普通指针初始化智能指针 smart_ptrs(smart_ptrs&); T* operator->(); //自定义指针运算符 T& operator*(); //自定义解引用运算符 ...

2018-03-20 16:36:35 466

转载 工厂模式

工厂模式属于创建型模式,大致可以分为三类,简单工厂模式、工厂方法模式、抽象工厂模式。首先介绍简单工厂模式,它的主要特点是需要在工厂类中做判断,从而创造相应的产品。当增加新的产品时,就需要修改工厂类举个例子就明白了。有一家生产处理器核的厂家,它只有一个工厂,能够生产两种型号的处理器核。客户需要什么样的处理器核,一定要显示地告诉生产工厂。下面给出一种实现方案。[cpp] view plain copy...

2018-03-16 13:42:35 373

原创 装饰模式

装饰模式:一个类有一些核心功能;但随着业务改变,需要能够在核心功能之外加一些功能。装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案,提供比继承更多的灵活性。给某个对象,而不是整个类,添加一些功能。就增加功能来说,装饰器模式比相比生成子类更加灵活。适用性:       1、在不影响其它对象的情况下,以动态、透明的方式给单个对象添加职责。       2、处理那些可以撤销的职责。 ...

2018-03-16 11:33:16 217

原创 策略模式

策略模式:策略模式针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。就是一个继承体系,用虚函数实现。通过给类再传递一个类,具体的操作由传入的类做决定。class Strategy{public: virtual void Algrithm();};class Strategy1:public ...

2018-03-16 10:58:30 192

原创 代理模式

代理模式(Proxy)C++实现尽管Decorator的实现部分与代理相似,但Decorator的目的不一样。Decorator为对象添加一个或多个功能,而代理则控制对对象的访问。作用:       为其他对象提供一种代理以控制对这个对象的访问。适用性:       在需要用比较通用和复杂的对象指针代替简单的的指针的时候,使用代理模式。       1、远程代理,也就是为一个对象在不同的地址空间提...

2018-03-16 10:41:05 215

转载 《C++ 沉思录》阅读笔记——句柄类(智能指针)

在上一篇博文里,我介绍了代理类的相关内容,如果记性好的朋友,应该已经对代理类有了比较深入的认识。在设计代理类的过程中,我们遇到的核心问题是:内存的分配和编译时类型未知对象的绑定。我们通过让所有子类自定义一个 copy 函数,来返回自身的复制,这种方式来解决需要我们自己来管理内存的繁琐,又通过定义代理类绑定子类的类型,通过一个基类指针来保存子类这种方式来实现运行时绑定。但对代码的追求是永无止尽的,虽...

2018-03-16 10:24:12 468

转载 c++11 内存模型解读

在C++11标准中,一个重大的更新就是引入了C++多线程内存模型。本文的主要目的在于介绍C++多线程内存模型涉及到的一些原理和概念,以帮助大家理解C++多线程内存模型的作用和意义。1. 顺序一致性模型(Sequential Consistency)在介绍C++多线程模型之前,让我们先介绍一下最基本的顺序一致性模型。对多线程程序来说,最直观,最容易被理解的执行方式就是顺序一致性模型。

2017-12-22 15:38:52 3533 2

转载 c++11 内存模型解读

关于乱序说到内存模型,首先需要明确一个普遍存在,但却未必人人都注意到的事实:程序通常并不是总按着照源码中的顺序一一执行,此谓之乱序,乱序产生的原因可能有好几种:编译器出于优化的目的,在编译阶段将源码的顺序进行交换。程序执行期间,指令流水被 cpu 乱序执行。inherent cache 的分层及刷新策略使得有时候某些写读操作的从效果上看,顺序被重排。以上乱序现象虽然来源不同

2017-12-22 15:09:45 259

转载 并发编程系列之一:锁的意义

背景 C/C++语言的并发程序(Concurrent Programming)设计,一直是一个比较困难的话题。很多朋友都会尝试使用多线程编程,但是却很难保证自己所写的多线程程序的正确性。多线程程序,如果涉及到对共享资源的并发读写,就会产生资源争用(Data Race)。解决资源争用,最直接的想法是引入锁,对并发读写的数据进行保护(更高级的则包括无锁编程—— Lock Free Pr

2017-12-20 15:44:30 522

原创 用fallocate进行"文件预留"或"文件打洞"

什么是空洞文件?“在UNIX文件操作中,文件位移量可以大于文件的当前长度,在这种情况下,对该文件的下一次写将延长该文件,并在文件中构成一个空洞,这一点是允许的。位于文件中但没有写过的字节都被设为 0。” 如果 offset 比文件的当前长度更大,下一个写操作就会把文件“撑大(extend)”。这就是所谓的在文件里创造“空洞(hole)”。没有被实际写入文件的所有字节由重复的 0 表示。空洞是否占用硬

2017-12-16 23:04:09 20065

原创 leveldb:DBIter

DBIter的作用Leveldb数据库的MemTable和sstable文件的存储格式都是InternalKey(userkey, seq, type) => uservalue。 DBIter把同一个userkey在DB中的多条记录合并为一条,综合考虑了userkey的序号、删除标记、和写覆盖等等因素。DBIter只会把userkey最新(seq最大的就是最新的,相同userkey的老记录(se

2017-12-02 17:58:53 888 1

原创 c++11:右值引用与转义语义和移动构造函数的关系

右值引用右值右值是指表达式结束时就不再存在的临时对象。右值由两个概念构成将亡值:如将要被移动的对象,T&&函数返回值,move返回值纯右值:如非引用返回的临时变量,表达式产生的临时变量,原始字面量和lamba表达式右值引用右值引用就是对一个右值进行引用的类型。标记为T&&,因为右值不具名,所以我们只能通过引用的方式找到它。通过右值引...

2017-11-17 13:19:05 573 1

原创 c++11:std::function和bind

这两个的头文件都是#include <functional>std::function它是函数、函数对象、函数指针、和成员函数的包装器,可以容纳除了类成员(函数)指针之外的所有可调用函数。 以统一的方式处理函数、函数对象、函数指针。允许保存和延迟执行函数。 std::function object最大的用处就是在实现函数回调,使用者需要注意,它不能被用来检查相等或者不相等void G();st

2017-11-16 11:14:45 279

原创 c++11:lambda表达式

lambda 表达式可以方便地构造匿名函数,如果你的代码里面存在大量的小函数,而这些函数一般只被调用一次,那么不妨将他们重构成 lambda 表达式。C++11 的 lambda 表达式规范如下:[ capture ] ( params ) mutable exception attribute -&gt; ret { body } (1) [ capture ] ( params...

2017-11-15 23:04:30 323

原创 rocksdb线程池设计

特点可以设置线程池中线程的优先级,然而只有linux系统支持。可以动态增加或减少线程池中线程数量。接口class ThreadPool { public: virtual ~ThreadPool() {} // Wait for all threads to finish. // Discard those threads that did not start // execu

2017-11-15 22:20:20 1805

转载 rocksdb对Write Stalls的调优

当我们持续大量插入数据的时候,会发现到了某一个时间,性能就突然下降了,如果突然出现了这样的情况,我们都会从 LOG 文件里或者 statistics 上面来确认是否出现了 write stall。Where Stall通常 write stall 会在几个地方出现Too many memtables当需要等待被 flush 到 level 0 的 memtable 到了或者超过了 max_write

2017-11-15 15:28:52 3953

转载 RocksDB 的常用调优参数

RocksDB 的参数以其数据多和复杂著称,要全部弄懂也要费一番功夫,这里也仅仅会说一下我们使用的一些参数,还有很多我们也需要后面慢慢去研究。ParallelismRocksDB 有两个后台线程,flush 和 compaction,两个都可以同时并行执行。在优先级上面,flush 是 HIGH,而 compaction 是 LOW,也就是 flush 的优先级会比 compaction 更高,这也

2017-11-15 15:11:27 19670

转载 RocksDB 介绍

RocksDB相对传统的关系数据库的一大改进是采用LSM树存储引擎。LSM树是非常有创意的一种数据结构,它和传统的B+树不太一样,下面先说说B+树。RocksDB相对传统的关系数据库的一大改进是采用LSM树存储引擎。LSM树是非常有创意的一种数据结构,它和传统的B+树不太一样,下面先说说B+树。B+ 树上图是B+树的一个例子。 B+树根节点和枝节点分别记录每个叶

2017-11-15 11:55:57 22503

转载 rocksdb合并原理

compaction主要包括两类:将内存中imutable 转储到磁盘上sst的过程称之为flush或者minor compaction;磁盘上的sst文件从低层向高层转储的过程称之为compaction或者是major compaction。对于myrocks来说,compaction过程都由后台线程触发,对于minor compaction和major compaction分别对应一组线程,通

2017-11-15 11:44:56 4581

转载 GDB调试命令小结

1.启动调试前置条件:编译生成执行码时带上 -g,如果使用Makefile,通过给CFLAGS指定-g选项,否则调试时没有符号信息。gdb program //最常用的用gdb启动程序,开始调试的方式gdb program core //用gdb查看core dump文件,跟踪程序core的原因gdb program pid //用gdb调试已经开始运行的程序,指定pid即可

2017-11-15 11:40:14 244

转载 分布式入门:副本控制

按某特定流程控制副本数据的读写行为,使副本满足一定的可用性及一致性的分布式协议。中心化副本控制协议:primary-secondary协议只有一个副本作为主副本,其余都是从副本。主副本作为中心节点负责数据更新、控制协调一致性。四大问题:1. 写> 写由主完成> 外部写请求发给主> 主进行并发控制,即确定并发请求的先后顺序> 更新操作发给从节点    GFS采

2017-11-13 14:43:22 533

转载 分布式系统的Quorum策略

分布式系统要做到数据一致性是不同于单点系统的,列入写入数据,客户端需要等待直到写入成功。因此分布式系统的设计中会运用一些“聪明”的协议、机制用以解决数据一致性、可靠性等问题,Quorum 机制就是其中的一种。1、分布式系统中的读写模型  分布式系统是由多个节点构成,多个结点意味着服务出现故障结点的概率增大,例如:网络异常、宕机。为了保证系统的正常,分布式系统通过多结

2017-11-13 14:19:57 415

原创 leveldb:DB::Open创建一个新数据库或者打开一个已存在的数据库

leveldb文件类型 上面的log文件,sst文件,临时文件,清单文件末尾都带着序列号,序号是单调递增的(随着next_file_number从1开始递增),以保证不会和之前的文件名重复。另外,注意区分db log与info log:前者是为了防止保障数据安全而实现的二进制Log,后者是打印引擎中间运行状态及警告等信息的文本log。 随着更新与Compaction的进行,LevelDB会不断生

2017-11-09 10:51:10 5104

转载 Raft算法赏析

1 leader选举1.1 刚开始所有server启动都是follower状态然后等待leader或者candidate的RPC请求、或者超时。上述3种情况处理如下:leader的AppendEntries RPC请求:更新term和leader信息,当前follower再重新重置到follower状态candidate的RequestVote RP

2017-11-08 13:14:29 2019

转载 Raft对比ZAB协议

Raft的实现copycat,由于Raft算法本身已经介绍的相当清晰,copycat基本上和Raft算法保持一致ZAB的实现ZooKeeper,由于ZooKeeper里面的很多实现细节并没有在ZAB里体现(ZAB里面只是一个大概,没有像Raft那么具体),所以这里讨论的都是ZooKeeper的实现一致性算法在实现状态机这种应用时,有哪些常见的问题:1 leader选举

2017-11-08 12:06:13 5112

转载 ZooKeeper的一致性算法赏析

1 ZAB介绍ZAB协议全称就是ZooKeeper Atomic Broadcast protocol,是ZooKeeper用来实现一致性的算法,分成如下4个阶段。先来解释下部分名词electionEpoch:每执行一次leader选举,electionEpoch就会自增,用来标记leader选举的轮次peerEpoch:每次leader选举完成之后,都会选举出一个

2017-11-07 17:48:51 4755

转载 leveldb和rocksdb在大value场景下的一些问题

Table of Contents1   问题1.1   compaction不可控.1.2   写放大1.3   其它问题2   小结Leveldb 2011年7月开源, 到现在有3年了, 原理上已经有很多文章介绍了, 我们就不多说.其中最好的是淘宝那岩写的 leveldb 实现解析 和 TokuMX作者写的那个300页ppt: A C

2017-11-05 16:56:54 6523

转载 Bigtable Merge-Dump存储引擎

单机存储引擎解决单机读写问题,Merge-Dump存储引擎设计成一种通用的存储引擎,同时支持数据写入,随机读取和顺序扫描功能。顺序扫描功能应用很广,比如MapReduce批处理,同一个广告主的所有关键词广告统计,用户浏览所有的收藏信息,淘宝卖家管理大量的商品等。简单的KV系统只需要支持随机读取,而类似Bigtable这样的通用表格系统需要考虑基于主键的顺序扫描功能。用户的操作首先写入到

2017-11-05 16:13:29 338

转载 分布式系统的数据结构

常用的数据结构包括:数组,队列,堆栈,链表,树(平衡二叉树,B树,Trie树,堆),哈希表,图,后缀数组,等等。其中,堆,图结构,Trie树及后缀数组解决特定问题,其它数据结构解决通用的查找,更新,删除操作。查找,更新和删除操作一般是O(1),O(logN)或者O(N),通用的数据结果大致可分为如下三种:1, 极端型;某些操作的算法复杂度为O(1),另外一些算法复杂度为O(N),比

2017-11-05 16:00:47 729 1

转载 磁盘I/O那些事

背景计算机硬件性能在过去十年间的发展普遍遵循摩尔定律,通用计算机的CPU主频早已超过3GHz,内存也进入了普及DDR4的时代。然而传统硬盘虽然在存储容量上增长迅速,但是在读写性能上并无明显提升,同时SSD硬盘价格高昂,不能在短时间内完全替代传统硬盘。传统磁盘的I/O读写速度成为了计算机系统性能提高的瓶颈,制约了计算机整体性能的发展。硬盘性能的制约因素是什么?如何根据磁盘I/O特性来

2017-11-02 22:33:50 8652

转载 MySQL索引原理(b+树)

MySQL索引原理##索引目的索引的目的在于提高查询效率,可以类比字典,如果要查“mysql”这个单词,我们肯定需要定位到m字母,然后从下往下找到y字母,再找到剩下的sql。如果没有索引,那么你可能需要把所有单词看一遍才能找到你想要的,如果我想找到m开头的单词呢?或者ze开头的单词呢?是不是觉得如果没有索引,这个事情根本无法完成?##索引原理除了词典,生活中随处可见索引的例

2017-11-02 21:59:03 799

原创 基数树(radix tree)

作用基数树(radix tree)是将long整数与指针键值相关联的机制,它存储有效率,并且可快速查询,用于整数值与指针的映射,对于长整型数据的映射,如何解决Hash冲突和Hash表大小的设计是一个很头疼的问题,利用radix树可以根据一个长整型(比如一个长ID)快速查找到其对应的对象指针。这比用hash映射来的简单,也更节省空间,使用hash映射hash函数难以设计,不恰当的hash函数可能增大

2017-10-27 15:31:21 7499 1

转载 向操作系统申请内存的两种方式:brk和mmap

如何查看进程发生缺页中断的次数?         用ps -o majflt,minflt -C program命令查看。          majflt代表major fault,中文名叫大错误,minflt代表minor fault,中文名叫小错误。          这两个数值表示一个进程自启动以来所发生的缺页中断的次数。发成缺页中断后,执行了那些操作?

2017-10-27 13:18:14 5442

转载 全局内存分配器:tcmalloc_sys_alloc

[TCMalloc] 全局内存分配器  TCMalloc 的全局分配器,处于 TCMalloc 的最底层,负责向操作系统申请和释放内存,接口有两个,定义在 src/system-alloc.h|.cc:extern void* TCMalloc_SystemAlloc(size_t bytes, size_t *actual_bytes,

2017-10-27 13:05:27 811

原创 PageHeap

作用PageHeap在TCMalloc中主要作用:作为Central Cache和操作系统之间的内存缓存,PageHeap对内存的管理是通过Span来管理的,而Central Cache向pageheap申请内存的基本单位就是span。关于Span的描述见上篇CentralCache。负责大块内存的申请和释放。空闲span的管理PageHeap有两种span的管理方式: 一个是用于管理内

2017-10-26 22:54:43 1033

原创 leveldb:TableCache以及BlockCache

概述前面分析了leveldb中cache机制的实现,下面来分析下leveldb基于cache机制实现的两个不同功能的cache,分别是table cache和block cache。table cache缓存的是sstable的索引数据,类似于文件系统中对inode的缓存;block cache是缓存的block数据,block是sstable文件内组织数据的单位,也是从持久化存储中读取和写入

2017-10-26 20:45:11 1717

原创 leveldb:write(如何处理并发写操作)

Put与Delete操作Status DB::Put(const WriteOptions& opt, const Slice& key, const Slice& value) { WriteBatch batch; batch.Put(key, value); return Write(opt, &batch);}Status DB::Delete(const WriteOptio

2017-09-29 14:07:33 5957

转载 C++11 右值引用和转移语义

新特性的目的右值引用 (Rvalue Referene) 是 C++ 新标准 (C++11, 11 代表 2011 年 ) 中引入的新特性 , 它实现了转移语义 (Move Sementics) 和精确传递 (Perfect Forwarding)。它的主要目的有两个方面:消除两个对象交互时不必要的对象拷贝,节省运算存储资源,提高效率。能够更简洁明确地定义泛型函数。左值与右

2017-09-26 22:41:11 246

空空如也

空空如也

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

TA关注的人

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