对于熟悉 c99 的人来说,Designated Initializers 并不算是什么新鲜事物,然而 c++直到 c++20 才正式支持这一特性。 虽然在 c++20 之前,像 GCC 这样的编译器通过扩展的形式已经对该特性做了支持,但是随着 c++20 将其纳入新标准,这一特性将在所有编译器中得到支持。
基本用法
Designated Initialization 是聚合初始化(Aggregate Initialization)的一种形式。 在 c++20 中,聚合类型(Aggregate types)是指:
- 数组类型
- 具备如下特性的 class 类型:
- has no private or protected...
前言
做存储开发,一定会经常涉及到 IO 相关的操作。而现在的高级编程语言,往往会帮助我们屏蔽 IO 操作的底层细节,虽然这样能降低开发门槛,提升效率,但是却也导致我们对 IO 底层操作实现的理解不够系统和深入。 所以呢,我一直想抽时间来系统整理一下 Linux IO 涉及的系统调用,以及相互之间的区别和联系,以加深对 IO 操作的理解。
IO 操作
fwrite
fwrite 是 c 语言标准库中的文件写入函数,其作用是向指定的文件中写入若干数据。调用 fwrite 实际上是将数据写入到了 c 标准库的 IO Buffer 中。
mmap
mmap 将一个文件或者其它对象映射进内存。文件被映射到多个页上,如果文件的大小不是...
1. 概览
要谈论 LevelDB 的 Compaction 就不得不从 LevelDB 的整个数据写入流程入手。LevelDB 的基本写入流程大致为:
- 数据先写入到 WAL 日志中,做持久化
- 然后数据同步到
mutable memtable
中 - 当
mutable memtable
大小达到Options.write_buffer_size
设置的大小时,就会变成immutable memtable
,并且创建一个新的mutable memtable
- 后台的 Compaction 线程会把
immutable memtable
dump 成 sstable 文件,并设置于 Level 0 层 - 当 Level i 达到一定条件后,...
拜占庭将军问题
简介
- 在可能存在叛军的情况下,采用合适的通讯协议,让多个将军达成共识,执行统一的作战计划
- 二忠一叛难题
- 它是分布式领域最复杂的容错模型
- 莱斯利·兰伯特(Leslie Lamport)The Byzantine Generals Problem
二忠一叛难题
- 总共有三个将军,其中一个作为指挥官
- 通过信使相互传递作战指令,进攻或者撤退
- 所有忠诚的将军必须执行统一的作战计划,忠诚的将军必须执行忠诚的指挥官发布的指令
- 假如 LIEUTENANT2 叛变,LIEUTENANT1 收到的作战指令就是“进攻,撤退”
- 假如 COMMANDER 叛变,LIEUTENANT1 和 LIEUTENANT2 收到...
背景
我们 laser 存储为了更好的跟引擎对接,适应其他团队的技术生态,决定开发一套 golang 的公共库来给大家使用。于是我们在公司私有的 gitlab 上新建了一个项目:git.yourcomp.com/ad/ads_core/adgo,并且我们想使用单一的 codebase 来管理所有的公共 library.
而且,为了更好的管理模块,我们统一使用了 go mod。
按照平时我们在 github 上拉取 go library 的惯例,我本以为直接使用go get git.yourcomp.com/ad/ads_core/adgo/xxx
就能直接拉取到相应的模块了,然而在开发完功能测试的时候却发现,事实并不是想象中那样。...