自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

vinowan的专栏

vinowan@foxmail.com

  • 博客(41)
  • 资源 (1)
  • 收藏
  • 关注

原创 flashP2P协议rtmfp解析

1      协议介绍Real-Time Media Flow Protocol(简称RTMFP)是Flash和Flash之间基于UDP的点对点传输协议,由Adobe公司在2008年在Flash 10.0中发布,随后在Flash10.1中加入了Groups功能。2      常见用法rtmfp在Flash 10中的典型使用场景如下图:它有如下特点:l  使用Cirrus

2015-05-23 15:08:04 5847

原创 Zookeeper源码分析(11)- FollowerRequestProcessor

FollowerRequestProcessor是Follower的request processor链条中的第一个,它的主要作用就是把读操作发送到后面的processor来处理,并把写操作封装成为Request请求发送给Leader来处理 FollowerRequestProcessor是一个异步处理的processor,调用processRequest只是把请求发到queuedRe

2014-03-26 17:36:34 1432

原创 Zookeeper源码分析(10)- FinalRequestProcessor

FinalRequestProcessor负责把已经commit的写操作应用到本机,对于读操作则从本机中读取数据并返回给client,这个processor是责任链中的最后一个 FinalRequestProcessor是一个同步处理的processor,主要的处理逻辑就在方法processRequest中:如果request.hdr != null,则表明request是写操作,

2014-03-26 17:35:57 1492

原创 Zookeeper源码分析(9)- ToBeAppliedRequestProcessor

ToBeAppliedRequestProcessor是Leader的一个内部类,主要是为了维护Leader类的toBeApplied队列,这个队列中保存了已经完成投票(即commit)的proposal,但是这些proposal还没有应用到本机的内存中(这个工作是由FinalRequestProcessor来完成的) 它的processRequest函数的处理逻辑如下:先传递给F

2014-03-26 17:35:20 1273

原创 Zookeeper源码分析(8)- CommitProcessor

这个processor主要负责将已经完成本机submit的request和已经在集群中达成commit的request匹配,并将匹配后的request交给nextProcessor(即ToBeAppliedRequestProcessor)处理 这是个异步处理的processor,它有两个入口:一个是前面的processor调用的processRequest,它把request放到

2014-03-26 17:34:38 2198

原创 Zookeeper源码分析(7)- SyncRequestProcessor

这是个异步处理的processor,启动后会有一个线程异步获取队列中的request并处理 这个 processor负责把写request持久化到本地磁盘,为了提高写磁盘的效率,这里使用的是缓冲写,但是会周期性(1000个request)的调用flush操作,flush之后request已经确保写到磁盘了,这时会把请求传给AckRequestProcessor继续处理 这个proc

2014-03-26 17:33:33 2371

原创 Zookeeper源码分析(6)- ProposalRequestProcessor

这个Process会把request分发到两条责任链上,一条用于把修改操作写到本地磁盘,另一条负责把得到commit的request来修改本地的状态 这是个一个同步处理的processor,但后续的两个process(SyncRequestProcessor和CommitProcessor)都是异步提交的,这样就保证了这个process的处理不会被柱塞 这个processor的处理

2014-03-26 17:31:12 1602

原创 Zookeeper源码分析(5)- PrepRequestProcessor

这个Processsor是责任链里的第一个,这是一个异步处理线程,提交的请求会保存在队列submittedRequests中,然后由线程异步的取出来执行 线程的主要处理逻辑是在pRequest函数中,他的主要逻辑如下:为修改状态的操作建立相应的TxnHeader和Record对象,修改操作包括:OpCode.create:创建节点OpCode.delete:删除节点

2014-03-26 17:30:32 1885

原创 Zookeeper源码分析(4)- Follower执行流程

QuromPeer线程Leader选举完成之后,Peer确认了自己是Follower的身份,在QuromPeer的主线程中执行Follower的逻辑(followLeader函数)根据投票结果获得Leader的server id和address(findLeader函数)尝试连接Leader,失败会重试5次(connectToLeader函数),连接成功后建立输入输出流

2014-03-26 17:29:40 1412

原创 Zookeeper源码分析(3)- Leader执行流程

QuromPeer线程Leader选举完成之后,Peer确认了自己是Leader的身份,在QuromPeer的主线程中执行Leader的逻辑创建Leader对象,并创建Server绑定在QuorumAddress上,用于和其他Follower之间相互通信调用Leader::lead函数,执行Leader的真正的逻辑调用ZooKeeperServer::loadDat

2014-03-26 17:28:19 3102

原创 Zookeeper源码分析(2)- zookeeper的选举流程

发起选举流程有两种情况:server刚启动的时候,server的状态初始化为LOOKING状态server发生异常,切换到LOOKING状态server有4中状态LOOKING:初始状态,表示在选举leaderFOLLOWING:跟随leader的角色,参与投票LEADING:集群的leaderOBSERVING:不参与投票,只是同步状态

2014-03-26 17:26:40 2216

原创 Zookeeper源码分析(1)- Zookeeper的启动流程

zookeeper的主类是QuorumPeerMain,启动时读取zoo.cfg配置文件,如果没有配置server列表,则单机模式启动,否则按集群模式启动,这里只分析集群模式根据配置初始化quorumPeer对象,并启动quorumPeer线程,这里主要做了几件事情读取保存在磁盘上的数据,包括db的snapshot和txnlog,zookeeper的存储结构另外专门讲述

2014-03-26 17:25:26 2157 1

原创 folly源码分析(4)- ConcurrentSkipList.h

这里主要实现了多线程环境下的skiplist,读操作(count, find, skipper)都是lock free的,写操作(remove, add)也只是小范围的加了锁 主要的用法如下:Sample usage:  typedef ConcurrentSkipListSkipListT; shared_ptrsl(SkipListT::createIn

2012-11-18 15:13:52 2444

原创 folly源码分析(3)- ThreadLocalPtr

通过声明ThreadLocalPtr对象,可以动态增减thread local对象。基本思路如下:1)通过__thread而不是pthread_getspecific来声明thread local对象,因为这样速度快2)通过全局唯一的StaticMeta对象(静态类型)来管理全局的thread local对象,StaticMeta对象中包含一个对象指针数组(ThreadEn

2012-11-18 15:10:52 1975

原创 folly源码分析(2)- ProducerConsumerQueue.h

无锁队列,支持一个读线程和一个写线程设计思想:队列预先分配,通过std::atomic类型的readIndex和writeIndex来标识读和写的位置,然后通过原子操作这两个索引,可以实现不加锁的目的核心代码如下:template bool write(Args&&... recordArgs) { auto const currentWrite =writeInd

2012-11-18 15:08:05 2618

原创 folly源码分析(1) - Conv.h

Conv是一个类型转换的库,主要实现了字符串到整数和浮点数的转换,性能要比snprintf和strtol要好上一些。double和string的来回转换主要是用google的开源项目double conversion来实现的,这里按下不表我们主要考察int和string的来回转换的实现其中int->string的关键代码是,可以看到是非常简单的查表操作:extern con

2012-11-18 15:06:26 2323

原创 libhdfs源码分析(5)

最后我们来分析一下数据流的关闭流程FSDataInputStream::close的流程如下:1. 实际调用的是DFSClient::DFSInputStream的close方法2. 关闭blockReader,关闭socketFSDataOutputStream::close的流程如下:1. 实际是调用DFSOutputStream::close方法2.

2012-04-09 12:42:59 610

原创 libhdfs源码分析(4)

我们再来分析一下写数据流程1. 由前可知DistributedFileSystem::create和DistributedFileSystem::append方法都会返回FSDataOutputStream对象,而其实返回的都是FSDataOutputStream的子类DFSClient::DFSOutputStream2. 当我们调用write时,其实我们调用的是DFSOutpu

2012-04-09 12:39:22 610

原创 libhdfs源码分析(3)

接下来我们分析一下数据的读流程1. 由DistributedFileSystem::read的实现可知,读数据实际是调用DFSClient::DFSDataInputStream的read函数,DFSDataInputStream是DFSInputStream的一个wrapper,所以实际调用的是DFSInputStream的read函数2. read函数首先会判断当前文件偏移pos是否超

2012-04-09 12:35:48 838

原创 libhdfs源码分析(2)

我们在hdfsOpenFile中看到,根据flags的不同,libhdfs会分别调用open、create、append函数,我们接下来再分析一下他们的流程Filesystem::open的流程如下:1. Filesystem::open是一个抽象方法,它的实际实现是在DistributedFileSystem::open中  public FSDataInputStream

2012-04-09 12:10:37 827

原创 libhdfs源码分析(1)

libhdfs是hdfs的c++客户端,提供了操作hdfs的基本接口,对于典型的读写场景,使用libhdfs的流程如下:// 建立连接1. hdfsFS hdfsConnectAsUserNewInstance(const char* host, tPort port, const char *user , const char **groups, int groups_size )//

2012-04-09 11:51:59 1686

转载 时间管理

时间黑洞:产生源于大脑不善于记忆的特点,大脑喜欢做的是创造性的思维,只有对大脑形成强烈刺激的事情才会被存储下来,因此那些极具规律性、比较枯燥,或者是目的性不强、没有主动性的事情,将会很容易被遗忘。        解决方案:      第一步:将所有的任务放入工作篮,不论是谁在什么时候交给我的任务,统统放进工作篮里。      第二步:将可以置之不理的任务清除掉;将必须在某天处理或者

2012-02-22 23:01:36 424

转载 老板靠什么带团队?

我总结了一下,大概有七种方式,简称PLORHIM(普罗西姆)P. 下属跟着你,觉得前途无量(Prospect)L:  下属跟着你,学(Learn)到了东西(技能,经验,见识)O: 下属跟着你,得到很多权力和尝试的机会(Opportunity)R: 下属跟着你,觉得自己的价值得到了体现和认可(Recognition)H. 下属跟着你,觉得很开心(Happine

2011-12-17 18:56:21 5366

转载 Linux 新增系统调用的启示

最近在研究 Linux 内核的时间子系统,为下一篇长文《服务器程序中的日期与时间》做准备,无意中注意到了 Linux 新增的几个系统调用的对编写服务器代码的影响,先大致记录在这里。这篇博客也可算作前一篇《多线程服务器的常用编程模型》的一个注脚。1. 服务器程序的风格可能在变新的创建文件描述符的 syscall 一般都支持额外的 flags 参数,可以直接指定 O_NONBLOCK

2011-11-17 08:56:40 386

原创 浅析boost asio中的event loop (5)

到了这里,我们已经分析了event loop的基本流程了,接下来就要从使用者的角度来分析一下,event loop一般会管理两类时间,一类是fd的读写,还有一类是timer到期,这里先讨论fd的读写boost asio中将fd抽象为以下几类servicedatagram_socket_service:UDP socketraw_socket_service:基本的socket

2011-11-09 22:48:23 2212

原创 浅析boost asio中的event loop (4)

我们再来分析一下epoll_reactor 从前文我们知道boost asio会根据编译选项来选择reactor,对于Linux来说一般都是epoll,而对于2.4的内核就是select_reactor了,和Java里通过Interface来实现这种“策略模式”不同,C++一般是通过模版来实现,这种方式的好处就是不需要像Java中的Interface那么严格,可以有不同的返回类型或者不同的

2011-11-09 22:15:52 1137

原创 浅析boost asio中的event loop (3)

我们再来看看task_io_service的实现task_io_service提供的最主要的接口如下:1) run:Run the event loop until interrupted or no more work.size_t run(boost::system::error_code& ec){ ec = boost::system::error_code(); /

2011-11-09 17:58:40 1309

原创 浅析boost asio中的event loop (2)

boost asio的event loop是通过io_service类实现的,这是一个模版类,但它的声明文件和实现文件做了分离,声明文件是io_service.hpp,而它的实现文件是impl/io_service.ipp,通过在io_service.hpp的末尾加上#include 来实现分离io_service的声明中最重要的一个成员变量#if defined(BO

2011-11-09 16:22:41 1091

原创 浅析boost asio中的event loop (1)

版本boost 1.43.0boost asio是boost中提供的一个网络库,提供了异步IO的C++接口,它和libevent、libev处于同一个层级。本文分析了Linux x86环境boost asio的实现机制。1. Proactor和Reactor模式Proactor和Reactor都是并发编程中的设计模式。在我看来,他们都是用于派发/分离IO操作

2011-11-09 14:22:35 2602

原创 boost shared_ptr实现浅析

版本boost 1.43.0头文件shared_ptr是boost中最强大的智能指针,基于C++非常精巧的实现了“引用计数”的功能shared_ptr只有两个类成员变量T * px; // contained pointerboost::detail::shared_count pn; // reference count

2011-11-06 20:06:51 2242

原创 C++ TR1 && TR2中的boost

C++新标准TR1以及正在制定的TR2都用到了很多来之boost中的库,对应关系如下:TR1:smart ptrfunctionbindhash set && hash tableregextuplearrayrandomTR2的候选有:Boost.AsioBoost.SignalsBoost.FilesystemBoost.Anyboost::lexc

2011-11-06 17:53:54 2504

转载 Thread-Local Storage

Thread-local storage (TLS) is a mechanism by which variables are allocated such that there is one instance of the variable per extant thread

2011-08-08 19:08:31 533

转载 Built-in functions for atomic memory access

在linux2.6.18之后,删除了和头文件,编译器提供内建(built-in)原子操作函数。需要在gcc编译选项中指明CPU类型。如gcc -marth=i686 -o hello hello.c。 type可以是以下类型:intunsigned intlo

2011-08-06 17:26:07 686

原创 bigtable reviews

Bigtable: A Distributed Storage System for Structured Data作为Google架构的三大件之一,Bigtable是一个介于RDBMS和Key-Value存储之间的存储系统,比RDBMS的扩展性好,但又比key-value多了一

2011-07-24 15:07:59 636

原创 FAWN Reviews

FAWN: A Fast Array of Wimpy NodesFAWN是为了在Data Center中为服务器省电而设计的一个分布式存储系统,整体结构类似Dynamo,比较有趣的是它采用了SSD作为存储媒介。关于SSD,一些需要知道的数字:随机读:2~3w随机写:2~3k顺序

2011-07-15 18:12:10 457

原创 Zookeeper Zab Reviews

[1] ZooKeeper: Wait-free coordination for Internet-scale systems[2] A simple totally ordered broadcast protocol分布式系统中的一致性协议(consistency prot

2011-07-15 17:46:19 1058

原创 Hadoop最佳实践

1. 简介Hadoop是Apache自由软件基金会资助的顶级项目,致力于提供基于map-reduce计算模型的高效、可靠、高扩展性分布式计算平台。2. Map-Reduce应用场景作为一种受限的分布式计算模型,Map-Reduce计算模型有其擅长的领域,也有其不擅长的方面:条款1:map-reduce计算模型适用于批处理任务,即在可接受的时间内对整个数据集计算某个特定的查询的结

2010-05-30 09:16:00 1267

原创 annotated CMakeFile

此文档中提到的cmake file针对的是awesome-3.1-rc2中的CMakeLists.txt和awesomeConfig.cmake,后者是一个cmake模块,awesome的源代码结构是in-place build。 awesomeConfig.cmake//设置变量set(PROJECT_AWE_NAME awesome)set(PROJECT_AWECLIEN

2010-05-29 21:10:00 896

原创 从spserver看HS-HA模式

序在互联网企业里,*nux下的C/C++编程主要的焦点还是server开发,关于不同的server模型,在UNP第30章里有过简单的讨论,这里得出的结论就是多线程和多进程的server模型效率较高。但书中缺乏对多路复用机制的讨论,而当前主流的server模型则是epoll+multi-threads/multi-processes,lighttpd就属于这种模型。本文将探讨一个更加高效的ser

2010-05-29 21:02:00 737

原创 Concept Checks in STL

Matt Austern在Generic Programming and the STL中提出了Concept、Model、Refinement的概念,实际上是换汤不换药,就是类似于Class、Object、SubClass的概念,只不过是在Template的语义下面解释的而已,唯一的差别就是在Template下,类型是implicit的,对类型的要求比较松散。而所谓的Concept Checks

2010-05-29 20:46:00 765

空空如也

空空如也

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

TA关注的人

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