自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

转载 leveldb(十):SSTable之1sstable文件的组成结构

个人总结:1.sstable是由很多种不同类型的block组成的,每种block的功能各自不同,详见下,但他们的存储格式都是相同的,都利用了共享前缀压缩以及二分查找的技巧。2.Leveldb对block的管理是读写分离的,读取后的遍历查询操作由Block类实现,block的构建则由BlockBuilder类实现。对于Block,它其实是把整个block的内容都读到内存data_上,而B

2017-07-31 14:49:34 591

转载 leveldb(九):log::Reader读日志

5 操作Log 2 5.3 读日志日志读取显然比写入要复杂,要检查checksum,检查是否有损坏等等,处理各种错误。5.3.1 类层次先来看看读取涉及到的类图,如图5.3-1。Reader主要用到了两个接口,一个是汇报错误的Reporter,另一个是log文件读取类SequentialFile。> Reporter的接口只有一个:void Co

2017-07-31 11:43:19 1247 1

转载 leveldb(八):log::Writer写日志

5 操作Log 1分析完KV在内存中的存储,接下来就是操作日志。所有的写操作都必须先成功的append到操作日志中,然后再更新内存memtable。这样做有两个有点:1可以将随机的写IO变成append,极大的提高写磁盘速度;2防止在节点down机导致内存数据丢失,造成数据丢失,这对系统来说是个灾难。在各种高效的存储系统中,这已经是口水技术了。5.1 格式在源码下的

2017-07-31 11:32:10 1140

转载 leveldb(七):Memtable

4 Memtable先写点最精妙的部分:我们在插入一条k/v记录时是把k和v整合在一起当成一个新的key插入到跳表里,因为我们的跳表里只有key没有value。查询(get)我们传入的仅仅是k,但跳表里的comparator是我们自己指定的,所以comparator会比较跳表中node里key的k部分和我们传入的k作比较,如果符合就把key的v部分返回。4.6 Comparator

2017-07-30 22:32:15 320

原创 leveldb(六):key的不同种类型

有5个key的概念,可能会让人混淆,下面就来一个一个的分析。 User_key;最简单的key了,就是用户传入的数据 Slice user_key;ParsedInternalKeyenum ValueType { kTypeDeletion = 0x0, kTypeValue = 0x1};//我们后面会讲到,我们对key进行delete操作时其实也是插入一条记录,只不过Value

2017-07-30 20:19:45 3964

转载 跳表SkipList

跳表是平衡树的一种替代的数据结构,但是和红黑树不相同的是,跳表对于树的平衡的实现是基于一种随机化的算法的,这样也就是说跳表的插入和删除的工作是比较简单的。下面来研究一下跳表的核心思想:先从链表开始,如果是一个简单的链表,那么我们知道在链表中查找一个元素I的话,需要将整个链表遍历一次。  如果是说链表是排序的,并且节点中还存储了指向前面第二个节点的指针的话,那么在查找

2017-07-30 16:47:17 204

原创 leveldb(五):SkipList跳表

跳表原理的简单介绍跳表是平衡树的一种替代的数据结构,但是和红黑树不相同的是,跳表对于树的平衡的实现是基于一种随机化的算法的,这样也就是说跳表的插入和删除的工作是比较简单的。下面来研究一下跳表的核心思想:先从链表开始,如果是一个简单的链表,那么我们知道在链表中查找一个元素I的话,需要将整个链表遍历一次。 如果是说链表是排序的,并且节点中还存储了指向前面第二个节点的指针的话,那么在查找一个节点时,仅

2017-07-30 16:44:23 1571

转载 STL容器学习总结

本文主要讨论C++标准库中的顺序容器及相应的容器适配器,这些内容主要涉及顺序容器类型:vector、list、deque,顺序容器适配器类型:stack、queue、priority_queue。      标准库中的容器分为顺序容器和关联容器。顺序容器(sequential container)内的元素按其位置存储和访问,顾名思义,这些内部元素是顺序存放的;顺序容器内的元素排列次序与元素值无

2017-07-27 00:11:28 155

转载 STL源码剖析---vector

vector容器概述      vector的数据安排以及操作方式,与array非常相似。两者的唯一区别在于空间的运用的灵活性。array是静态空间,一旦配置了就不能改变;要换个大(或小)一点的房子,可以,一切琐细都得由客户端自己来:首先配置一块新空间,然后将元素从旧址一一搬往新址,再把原来的空间释还给系统。vector是动态空间,随着元素的加入,它的内部机制会自行扩充空间以容纳新元素。因此,

2017-07-27 00:08:25 361

转载 我的常用linux小命令

这里并不是系统详细介绍每一个Linux命令,仅仅是记录本人在平时工作中经常用到的一些比较基础的命令及相关的参数,同时用了一些简单的例子来说明这些命令的用途,以及如何用多种命令来实现同一种功能。1、ls命令    要显示当前目录下的文件列表时,我经常就使用ls命令的以下三个参数。[plain] view plain copy-l 使

2017-07-26 22:15:35 138

转载 谨慎优化代码

看了本人前面关于“STL容器的删除元素问题”的博客后,相信大家对erase()函数的作用都已经有一定了解了,再使用的时候也会有所注意了,那么我们再看看下面的代码:[cpp] view plain copyvectorint> vec(5);    //插入数据  vec[0] = 0;  vec[1] = 1;  vec[2] =

2017-07-26 22:09:48 185

转载 STL容器的删除元素问题

STL的容器分为两类,一类是序列式容器,即数据顺序连续存储,如:vector、deque;另一类是关联式容器,即数据不连续存储,如:map、list、set。对于STL容器的数据删除操作,有一些需要注意的地方。1、序列式容器的数据删除       下面例子以容器list为例:[cpp] view plain copyfor (list

2017-07-26 22:05:08 214

转载 STL容器vector的内存问题

在STL的容器中,vector可以说是最容易理解和使用的容器了,以前使用数组的时候,如果不确定有多少数据要存储,就会预先分配一个大的数组,如果实际没有用到那么多,又会浪费很多的内存资源,如果不分配大的数组又担心不够用,有了vector之后,这些问题再也不用担心了,vector会动态的增长空间,当vector空间不足时会自动申请一片更大的内存空间,以存储新的数据。       vector动态内

2017-07-26 21:52:33 512

转载 判断STL list是否为空的小技巧

在STL中,list是一个双向循环链表,所谓循环链表就是指链表的头部和尾部是连接在一起的,下面两段代码实现的功能是一样的,但是执行过程却有所不同:[cpp] view plain copy//第一种  listint> lst1;  if (lst1.empty())  {      //do something  }    

2017-07-26 20:32:03 2416

转载 STL容器vector的下标运算符[]

对于容器vector,[]操作符的作用是获取相应位置上的值,有的时候使用不当就会造成问题,请看下面例子:[cpp] view plain copyvectorint> vec;  cout       上面的代码会出现Segmentation fault (core dumped),这是因为vec里面没有元素,还没有分配内存空间以存储

2017-07-26 20:27:46 1014

转载 STL容器map的下标运算符[]

在STL中,map是一个关联式容器,它提供一对一的数据处理能力,即其中每一个元素都是一个键值对,通过一个唯一的关键字,可以唯一映射到对应的数据值。而map中重载了下标运算符[],通过下标操作,开发人员可以很方便地根据关键字获取到对应的值。虽然使用方便,但是还是有一些地方容易出现问题,值得大家的注意。       下面代码的输出结果会什么呢?[cpp] view pl

2017-07-26 20:25:09 416

转载 string容易忽略的一些问题

在使用C的char*字符串时,我们常常会纠结以下的一些问题:分配的char*数组空间是否足够如何获取char*字符串的长度如何拼接两个char*字符串      可以说,string的出现,大家再也不用烦恼上面的一些问题了,string是一个类,里面封装了很多常用的操作函数以及成员变量,基本上可以满足我们绝大部分的字符串操作的需要。但是在使用string的过程中,还是有一些点需要注

2017-07-26 20:13:16 245

转载 traits编程技术

之前已经介绍过迭代器,知道了不同的数据结构都有自己专属的迭代器,不同的迭代器也有不同的特性,由于算法的接口是统一的,通过迭代器的不同属性,算法自动选择正确的执行流程,在完全任务的同时,也尽可能提高算法的执行效率。那算法如何获知迭代器的属性呢?这一光荣的任务就是traits完成的。在STL实现中,traits编程技术得到大量的运用,它利用了“内嵌类型”的编程技巧与C++的template参数推导功能

2017-07-26 16:07:42 337

转载 迭代器

一、迭代器作用       在设计模式中有一种模式叫迭代器模式,简单来说就是提供一种方法,在不需要暴露某个容器的内部表现形式情况下,使之能依次访问该容器中的各个元素,这种设计思维在STL中得到了广泛的应用,是STL的关键所在,通过迭代器,容器和算法可以有机的粘合在一起,只要对算法给予不同的迭代器,就可以对不同容器进行相同的操作。在这里提到了一个叫迭代器的东西,说得简单一点,就是一种

2017-07-26 15:32:37 230

原创 中心缓存:CentralCache

1.CentralCache的实现定义: static CentralFreeListPadded central_cache_[kNumClasses]; 每个数组元素对应一种size class的分配请求上述数组中每个元素,即CentralFreeList结构,只不过CentralFreeListPadded是CentralFreeList的一种对齐实现。结构图如下:2.CentralF

2017-07-24 23:31:58 1375

转载 从用户空间开始进行对文件的读过程

读:读取一个文件的时候,陷入系统调用,先检查数据是否在缓存中,如果没有则触发一次读盘操作,然后等待磁盘上的数据被更新到缓存中。 读取磁盘过程:调用文件系统层的readpages函数,使用各种文件系统层的get_block函数获取磁盘物理地址,存放到bh里(即buffer_head),使用bh构造bio,然后提交bio(一般使用submit_bio函数将数据bio提交到io的块设备层)。函数gener

2017-07-17 14:39:24 429

转载 C++命名规范(参考google C++规范)

写了很长时间的Java,对C++生疏了,那么就从C++的命名规范开始吧。 *为了从简,本blog copy自 http://blog.csdn.net/u012333003/article/details/20282277 也可以参考 http://www.cnblogs.com/ggjucheng/archive/2011/12/15/2289291.html 以后可以读读《

2017-07-14 22:56:54 845 1

转载 字符串常量存放在哪个存储区?堆栈的区别

字符串常量,放在哪个存储区呢?是“自动存储区”还是“静态存储区”中?比如:char *pstr="hello world!";这里,"hello world!"是一个字符串常量,pstr是在栈中的变量。我想问,字符串常量,在哪个内存区域分配空间呢?好像应该不是在“栈区“分配空间吧!!!一、预备知识—程序的内存分配一个由C/C++编译的程序占用的内

2017-07-14 19:05:55 2427

原创 leveldb(三):Slice

levelDB中Slice非常简单的数据结构,它包括length和一个指向外部字节数组的指针。为什么使用Slice,而不直接使用std::string呢?1、相比返回string,返回Slice的开销会小的多(没有拷贝(数据),Slice中没有实际数据,只有指向数据的指针,开销低,因为拷贝也只是拷贝了指针而已)。 2、leveldb允许key和value包含’\0’,不能返回以null结尾的c

2017-07-14 19:03:36 712

原创 zookeeper leader和learner的数据同步

数据同步在leader和follower启动期交互过程中,我们分析到整个集群完成leader选举后,learner会向leader服务器进行注册,当过半的learner服务器向leader完成注册后,就进入数据同步环节。简单讲,数据同步过程就是leader服务器将那些没有在learner服务器上提交过的事务请求同步给learner服务器。获取Learner状态在注册learner的最后阶段,lear

2017-07-13 09:39:22 4277

转载 C++11学习

C++11学习本章目的:当Android用ART虚拟机替代Dalvik的时候,为了表示和Dalvik彻底划清界限的决心,Google连ART虚拟机的实现代码都切换到了C++11。C+11的标准规范于2011年2月正式落稿,而此前10余年间,C++正式标准一直是c++98/03[①]。相比C++98/03,C++11有了非常多的变化,甚至一度让笔者大呼不认识C++了[②]。不过,作为

2017-07-13 08:20:59 303

原创 zookeeper leader和follower启动期交互过程

leader和follower启动期交互过程包括如下步骤。1.创建Leader服务器和Follower服务器完成leader选举后,各服务器会根据自己角色创建相应的服务器实例,并开始进入各自角色的主流程。代码位置:QuorumPeer.javaleader case LEADING: LOG.info("LEADING");

2017-07-12 19:39:02 1484

原创 zookeeper leader选举 源码分析

QuorumCnxManager:网络IO每台服务器启动的时候,都会启动一个QuorumCnxManager,负责各台服务器之间的leader选举过程中的网络通信。消息队列QuorumCnxManager这个类内部维护一系列的队列,用于保存接收到的,待发送的消息,以及消息的发送器。除了接收队列外,这里提到的所有队列都按SID分组形成队列集合。/*消息接收队列只有一个*/public final A

2017-07-12 11:39:17 783

原创 普通文件的readpage方法(do_mpage_readpage)

当所读文件所在的块并不在页高速缓存,我们需要使用readpage方法把页从磁盘读到内存中来,并加入到页缓存中去。 address_space对象的readpage方法存放的是函数地址,这种函数激活从磁盘到页高速缓存的io数据传送。对于普通文件,这个字段通常指向调用mpage_readpage( )函数的封装函数。如ext2文件系统的readpage方法:static int ext2_readpa

2017-07-11 17:55:16 2492

转载 普通文件的读流程分析

关于VFS的通用读,我们不做考虑,本文以如下函数为根,往下分析:[cpp] view plain copydo_generic_mapping_read(*ppos,*mapping,*desc)  本函数的目的是,从磁盘读数据到用户态,先是从*ppos开始的页,一直读到*ppos+desc->count 为止

2017-07-11 09:46:57 272

原创 块设备文件的readpage方法

块设备文件的readpage方法总是相同的。都是有blkdev_readpage( )函数实现的,它实际调用block_read_full_page( ):static int blkdev_readpage(struct file * file, struct page * page){ return block_read_full_page(page, blkdev_get_block

2017-07-10 22:52:18 1856

原创 leveldb(四):Cache

cache是怎么组织的cache中的每个元素既在一个双向的lru链表中,同时又在一个hash表中。 lru链表的作用是:当cache超过容量时淘汰掉最旧的元素, hash表的作用是:对cache中的元素进行快速定位。cache中的元素下面我们来看看cache中的元素是长啥样的,leveldb用LRUHandle结构体代表cache中的元素。struct LRUHandle { //node

2017-07-10 21:22:03 420

空空如也

空空如也

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

TA关注的人

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