- 博客(130)
- 资源 (2)
- 收藏
- 关注
原创 GFS论文笔记
GFS的设计目标分布式文件系统的共同设计目标:性能可伸缩性可靠性可用性GFS根据自己情况重新设计的目标:组件失效是常态事件,而不是意外事件,因此要有持续的监控、错误侦测、灾难冗余、自动恢复等机制不能以管理大文件的方式来管理小文件,所以IO操作和Block的尺寸都需要重新考虑数据的追加操作是性能优化和原子性保证的主要考量因素应用程序和文件系统API协同设计,提高整个系统的灵...
2019-05-30 12:28:35
888
翻译 Tip of the Week #74: Delegating and Inheriting Constructors
Tip of the Week #74: Delegating and Inheriting ConstructorsOriginally posted as totw/74 on 2014-04-21By Bradley White (bww@google.com)“Delegating work works, provided the one delegating works, too...
2019-03-07 10:50:01
540
原创 Envoy源码分析之ThreadLocal
ThreadLocal整体结构Envoy中严重依赖ThreadLocal,为了避免加锁Envoy会尽可能在单一线程中完成所有的事件,但是多个线程之间难免会有一些数据需要共享,还有可能需要读写,为了避免加锁Envoy将一些需要在线程之间共享的数据放在ThreadLocal中,当ThreadLocal中的数据需要更新的时候则会通过主线程将更新后的数据Post到各个线程中,交由各个线程来更新自己的Th...
2019-02-01 09:45:23
1391
原创 Envoy源码分析之Dispatcher
Dispatcher在Envoy的代码中Dispatcher是随处可见的,可以说在Envoy中有着举足轻重的地位,一个Dispatcher就是一个EventLoop,其承担了任务队列、网络事件处理、定时器、信号处理等核心功能。在Envoy threading model这篇文章所提到的EventLoop(Each worker thread runs a “non-blocking” event...
2018-11-02 10:09:08
1094
原创 6.824: Distributed Systems 课程讲义3
什么是一致性?分布式系统中,数据通常会通过复制进行冗余,当应用程序并发访问这些数据的时候,如果保证访问的数据是一致的。如果一个应用程序写入了新的数据,那么之后来访问数据的应用能否看到新增的数据呢? 这就是一致性问题了,通常一致性有几种类型:弱一致性读的时候可能会返回老数据,不保证能访问到新写入的数据。强一致性读的时候总是返回最新写入的数据。两者之间的关系强一致对于应用写入...
2018-10-29 14:25:26
579
翻译 Tip of the Week #65: Putting Things in their Place
Tip of the Week #65: Putting Things in their PlaceOriginally posted as totw/65 on 2013-12-12By Hyrum Wright (hyrum@hyrumwright.org)“Let me ’splain. No, there is too much. Let me sum up.” –Inigo Mo...
2018-10-21 21:29:55
402
翻译 Tip of the Week #64: Raw String Literals
Tip of the Week #64: Raw String LiteralsOriginally published as totw/64 on 2013-12-09By Titus Winters (titus@google.com)Updated 2017-10-23Quicklink: abseil.io/tips/64“(?:”(?:\\"|["])*"|’(?:\\’|[...
2018-10-21 16:20:38
370
翻译 Tip of the Week #61: Default Member Initializers
Tip of the Week #61: Default Member InitializersOriginally posted as Totw #61 on Nov 12, 2013by Michael Chastain (mec.desktop@gmail.com)Updated October, 2016Declaring Default Member Initializati...
2018-10-21 15:47:33
349
翻译 Tip of the Week #59: Joining Tuples
Tip of the Week #59: Joining TuplesOriginally published as totw/59 on 2013-10-21By Greg Miller (jgm@google.com)Updated 2018-01-24“Now join your hands, and with your hands your hearts.” –Henry VI,...
2018-10-21 15:14:40
382
翻译 Tip of the Week #55: Name Counting and unique_ptr
Tip of the Week #55: Name Counting and unique_ptrOriginally published as totw/55 on 2013-09-12by Titus Winters (titus@google.com)Updated 2017-10-20Quicklink: abseil.io/tips/55“Though we may know...
2018-10-21 14:23:56
328
翻译 Tip of the Week #49: Argument-Dependent Lookup
Tip of the Week #49: Argument-Dependent LookupOriginally posted as totw/49 on 2013-07-14“…whatever disappearing trail of its legalistic argle-bargle one chooses to follow…” –Antonin Scalia, U.S. v ...
2018-10-21 10:11:14
405
翻译 Tip of the Week #24: Copies, Abbrv
Tip of the Week #24: Copies, AbbrvOriginally posted as TotW #24 on Nov 26, 2012by Titus Winters, (titus@google.com) and Chandler Carruth (chandlerc@google.com)“To copy others is necessary, but to ...
2018-10-19 16:12:16
397
原创 日志采集中的关键技术分析
概述日志从最初面向人类演变到现在的面向机器发生了巨大的变化。最初的日志主要的消费者是软件工程师,他们通过读取日志来排查问题,如今,大量机器日夜处理日志数据以生成可读性的报告以此来帮助人类做出决策。在这个转变的过程中,日志采集Agent在其中扮演着重要的角色。作为一个日志采集的Agent简单来看其实就是一个将数据从源端投递到目的端的程序,通常目的端是一个具备数据订阅功能的集中存储,这么做的目的其...
2018-10-08 12:43:44
1535
翻译 Tip of the Week #11: Return Policy
Tip of the Week #11: Return Policy Originally posted as TotW #11 on August 16, 2012 by Paul S. R. Chisholm (p.s.r.chisholm@google.com) Frodo: There’ll be none left for the return journey. Sa...
2018-07-01 15:18:12
584
翻译 Tip of the Week #42: Prefer Factory Functions to Initializer Methods
Tip of the Week #42: Prefer Factory Functions to Initializer Methods Originally posted as totw/42 on 2013-05-10 By Geoffrey Romer (gromer@google.com) Revised 2017-12-21 “The man who build...
2018-04-02 22:02:07
461
翻译 Tip of the Week #36: New Join API
Tip of the Week #36: New Join API Originally published as totw/36 on 2013-03-21 By Greg Miller (jgm@google.com) Updated 2018-01-24 “I got a good mind to join a club and beat you over the ...
2018-04-02 22:01:17
459
翻译 Tip of the Week #10: Splitting Strings, not Hairs
Tip of the Week #10: Splitting Strings, not Hairs Originally published as totw/10 on 2012-08-16 By Greg Miller (jgm@google.com) Updated 2018-01-24 I tend to have an odd split in my mind. ...
2018-04-02 22:00:19
459
翻译 Tip of the Week #3: String Concatenation and operator+ vs. StrCat()
Tip of the Week #3: String Concatenation and operator+ vs. StrCat() Originally published as totw/3 on 2012-05-11 Updated 2017-09-18; revised 2018-01-22当一个reviewer说”不要使用string的连接操作,这不高效”,通常会让...
2018-04-02 21:58:57
520
翻译 Tip of the Week #1: string_view
Tip of the Week #1: string_view Originally published as totw/1 on 2012-04-20 By Michael Chastain (mec.desktop@gmail.com) Updated 2017-09-18What’s a string_view, and Why Should You Care?当我们创建一个
2018-04-02 21:48:34
710
原创 如何mock系统调用
背景 Linux下开发存储系统、网络库的时候会用到一系列Linux的系统调用,每一个系统调用都有一些出错的场景,有些场景很极端,比如内存使用达到上限、磁盘写满等,如果对其进行测试的话,很难去构造这样的一个场景,这个时候集成测试就显得力不存心了,只能靠单元测试来覆盖这些场景。现在的问题就是如何去mock这些系统调用,然后通过程序返回对应场景的错误码来模拟各种场景。也就是将对系统函数的依赖注入到程
2017-09-16 18:00:16
1743
原创 Linux信号专题FAQ
信号: 基本概念可重入、线程安全以及异步信号安全的区别? 参考可重入、线程安全和异步信号安全,需要强调的是异步信号安全,这个概念知道的人不多,平常大家在编写代码的时候也很少考虑这个因素,也不清楚哪些函数是异步信号安全的,哪些不是,典型的像printf就不是异步信号安全的,内部会加锁,但是平时很多人都喜欢在信号处理函数中调用。大多数情况下都不会出现问题的,所以让使用者错误的认为这是正确的写法。第
2017-09-13 00:26:11
947
原创 工作日记
Gitgit reset --hard 引入的一个问题git rebase 压缩提交及其基本原理git fast forward基本原理git merge tools p4merge基本介绍git revert merge commitC++C++11 和 C++14 对于sizeof的功能有差异,如下:#include <iostream>#include <unistd.h>#de
2017-07-21 21:32:18
918
原创 C++11 chrono入门
C++11引入chrono类来表示时间中的一些概念,以及进行时间相关的计算,这是因为传统使用算术的方式来表示时间间隔和时间点本身这是很模凌两可的。通过使用chrono类库,使用不同的类型来表示不同的时间概念,这有助于通过编译器在编译时来帮助程序员发现一些逻辑错误,为此chrono抽象了如下几个概念:duration 一个时间的duration表示的就是一个时间间隔,比如:3秒、3分钟、
2017-06-17 20:54:18
2471
原创 Effective Modern C++笔记汇总
Effective Modern C++ 目录Item 1: Understand template type deduction….待续
2017-06-05 16:09:58
12514
1
原创 Item42 Consider emplacement instead of insertion
如果你有一个容器,存放的是std::string类型,当你通过插入函数(如:insert、push_front、push_back或者是std::forward_list的insert_after)传递一个std::string类型的元素到容器中,逻辑上容器中就会有这个元素了。尽管这可能只是逻辑上的,但并不总是真的,考虑下面这段代码:std::vector<std::string> vs;
2017-06-05 14:27:30
1715
1
原创 Item41 Consider pass by value for copyable parameters that are cheap to move and always copied.
这个系列的文章来自于Effective Modern C++的读书笔记,我抽取了其中比较重要的,不容易理解的,平常我们开发过程中也不太在意的一些Item进行分析。 函数的参数传递方式有很多种,可以是值拷贝、传指针、传引用、甚至是移动。下面这个addName函数就是将外部传入的值存放到其内部的一个私有的容器中,为了让传递的过程更加高效,addName同时支持引用传递和移动两种方式。class W
2017-05-29 20:37:30
1351
原创 Item40 Use std::atomic for concurrency, volatile for specific memory
这个系列的文章来自于Effective Modern C++的读书笔记,我抽取了其中比较重要的,不容易理解的,平常我们开发过程中也不太在意的一些Item进行分析。 volatile关键字在C++中很少被使用,更准确来说是很少被正确使用,它的用途令人很迷惑,甚至这个关键字都不会出现在并发章节。因为这个关键字对于并发编程来说没有任何用处,但是在其他编程语言中这个关键字的用途却很大,因此很值
2017-05-05 22:47:59
1993
原创 Item39 Consider void futures for one-shot event communication
这个系列的文章来自于Effective Modern C++的读书笔记,我抽取了其中比较重要的,不容易理解的,平常我们开发过程中也不太在意的一些Item进行分析。 有的时候对于一个任务来说,希望有一种机制可以和另外一个任务进行通信,尤其是那种异步运行的任务,并且会出现一种特定事件的任务,另外一个任务需要等到这个事件的发生才能继续运行,典型的,可以是等待一个重要的数据结构进行初始化,或者是等待
2017-04-30 20:31:53
1746
原创 Item38 Be aware of varying thread handle destructor behavior
这个系列的文章来自于Effective Modern C++的读书笔记,我抽取了其中比较重要的,不容易理解的,平常我们开发过程中也不太在意的一些Item进行分析。在Item37中解释过一个状态为joinable的std::thread对象其底层对应一个系统线程。std::future对象和std::thread比较类似,一个future对象也对应着一个系统线程。尽管如此者两者在析构的时候其行为是不
2017-04-29 23:45:19
1309
原创 程序的机器级表示
2017年4月趁着临近毕业时间比较充裕,就买了一本深入理解计算机系统(第三版),这本书的第二版之前浅浅的读过一遍只对里面的编译与链接章节印象深刻,其他章节对我来说完全陌生,我深知这本书的好,于是重新拾起这本书。为了加深自己的记忆就开始写博客记录自己的读书笔记。第三章 程序的机器级表示gcc4.8 引入-Og选项,使得生成的代码更符合原始程序的结构。传送类指令的两个操作数不能指向内存位置。任何
2017-04-29 09:25:40
1580
原创 信息的表示与处理
2017年4月趁着临近毕业时间比较充裕,就买了一本深入理解计算机系统(第三版),这本书的第二版之前浅浅的读过一遍只对里面的编译与链接章节印象深刻,其他章节对我来说完全陌生,我深知这本书的好,于是重新拾起这本书。为了加深自己的记忆就开始写博客记录自己的读书笔记。第二章 信息的表示与处理如果值x是2的n次幂就可以很轻松的通过下面这个公式直接转换为十六进制。n = i + 4j 其中i在[0,3]范
2017-04-16 22:01:32
651
原创 Item37 Make std::threads unjoinable on all paths
这个系列的文章来自于Effective Modern C++的读书笔记,我抽取了其中比较重要的,不容易理解的,平常我们开发过程中也不太在意的一些Item进行分析。 每一个std::thread对象都有两种状态,一个是joinable状态,另外一个则是unjoinable状态。状态是joinable状态的std::thread对象其底层对应的是可以运行的线程。这个线程可以是阻塞的或者是等
2017-04-15 21:31:15
1465
原创 计算机系统漫游
2017年4月趁着临近毕业时间比较充裕,就买了一本深入理解计算机系统(第三版),这本书的第二版之前浅浅的读过一遍只对里面的编译与链接章节印象深刻,其他章节对我来说完全陌生,我深知这本书的好,于是重新拾起这本书。为了加深自己的记忆就开始写博客记录自己的读书笔记。第一章: 计算机系统漫游信息就是位+上下文,相同的二进制位在不同的上下文有着不同的含义Amdahl定律(阿姆达尔定律),其主要思想是当我
2017-04-10 16:22:31
827
原创 Item36 Specify std::launch::async if asynchronicity is essential
这个系列的文章来自于Effective Modern C++的读书笔记,我抽取了其中比较重要的,不容易理解的,平常我们开发过程中也不太在意的一些Item进行分析。 当你调用std::async执行一个函数或者是可调用对象的时候,你通常会试图让这个函数异步的执行,但是std::async并不是必须要这样做。只有通过给std::async指定运行的策略为异步的情况下函数才能确保一定是异步执行的
2017-03-29 17:44:16
1292
原创 Item35 Prefer task-based programming to thread-based
这个系列的文章来自于Effective Modern C++的读书笔记,我抽取了其中比较重要的,不容易理解的,平常我们开发过程中也不太在意的一些Item进行分析。 C++11第一次将并发引入到了语言和标准库中,这使得C++程序员们终于可以直接写跨平台的多线程程序了,不用再自己去写不同平台的线程封装了。C++11在引入线程相关的API的同时也引入了一些并发编程的高级组件例如tasks、fut
2017-03-29 12:08:23
1137
原创 Item34 Prefer lambdas to std::bind
这个系列的文章来自于Effective Modern C++的读书笔记,我抽取了其中比较重要的,不容易理解的,平常我们开发过程中也不太在意的一些Item进行分析。 C++11中的std::bind是对C++98中的std::bind1st 和std::bind2nd的改进和继承。而std::bind是在2005年的时候 作为标准库的一部分,起初是放在TR1规范中,拥有自己独立的命名空间st
2017-03-27 19:49:15
1893
原创 Item33 Use decltype on auto&& parameters to std::forward them
这个系列的文章来自于Effective Modern C++的读书笔记,我抽取了其中比较重要的,不容易理解的,平常我们开发过程中也不太在意的一些Item进行分析。 在C++14中最令人激动的特性当属通用lambda了,通用lambda指的就是使用auto来作为lambda的参数。实现通用lambda也是很方便的,我们知道lambda本质上是一个仿函数,也就是实现了operator()操作
2017-03-27 13:41:57
902
原创 C++ Dos and Don'ts
最小化头文件不要包含不必要的头文件尽量使用前向声明的方式,目的是为了减少编译时间What are forward declarations in C++?,并且在头文件发生改变的时候,减少重新编译的文件。将内部类移动到实现中// 内部类的声明class Whatever { public: /* ... */ private: struct DataStruct; std::
2017-02-16 00:41:19
883
原创 Item32 Use Init capture to move objects into closures
这个系列的文章来自于Effective Modern C++的读书笔记,我抽取了其中比较重要的,不容易理解的,平常我们开发过程中也不太在意的一些Item进行分析。 一些时候Lambda的值拷贝和引用两张捕获模式都没有办法满足你的需要,比如当你有一个可移动的对象,你希望可以将这个对象移动到闭包中,因为值拷贝的效率不高,引用捕获的话会导致生命周期的问题。很可惜C++11并没有提供将对象移动到闭包
2017-02-12 14:34:12
1061
原创 Item31 Avoid default capture modes
这个系列的文章来自于Effective Modern C++的读书笔记,我抽取了其中比较重要的,不容易理解的,平常我们开发过程中也不太在意的一些Item进行分析。 C++11中Lambda表达式给C++带来了很大的改变,通过Lambda可以很方便的创建一个函数对象,这对于C++的开发来说影响是巨大的,比如可以很方便的结合STL的一些算法,不用再单独创建函数来用,还有可以很好的结合std::u
2017-02-12 12:26:34
1138
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人