长沙游记
Bash介绍
介绍Bash
Paxos算法
本文介绍Paxos算法,包含Basic Paxos,以及Raft作者提出的一个Multi Paxos的工程化实现方案。此外,我们还就Raft作者给出的Paxos习题进行探讨。
GCC 和 GLIBC编译
GCC 是 C 和 C++ 的编译器,GLIBC 是 C 库,两个是不同的 Repo。编译顺序是先 GCC 再 GLIBC,这是因为编译 GLIBC 时对 GCC 的版本有要求。
pthread_rwlock库的实现
pthread_rwlock系列函数是pthread库的读写锁函数。随着版本的不同,它的实现也不同。
本篇的组织是:
- 前置知识
- GCC的扩展内联汇编
- Futex
- 2.17和2.30两个版本的lowlevellock的实现
- 2.17和2.30两个版本的pthread_rwlock的实现
我们的结论是:
旧版GLIBC使用lowlevellock实现pthread_rwlock;
新版GLIBC使用原子操作实现pthread_rwlock。
因此具有不同的ABI
V8引擎编译
本文介绍在一个较老的环境下编译V8引擎,并全静态地链接到既有的游戏服务上。原因是我们必需一个很新的JS引擎,从而能支持WebAssembly。经过调研,我们认为使用V8是最好的。
我们的游戏服务使用GCC4.4.6,这是一个非常老的版本,甚至不能完整支持C++11标准,而即使是很老版本的V8都需要完整的C++11支持(GCC 4.8+);进一步地最新版本的V8需要C++14标准的支持,这不仅体现在v8.h中出现了诸如std::remove_cv_t
的C++14的标准库函数,还体现在C++14标准编译出来的库也没办法直接和原游戏的目标文件进行链接。因此我们的方案是将游戏中对V8强依赖的模块升级成C++14标准,主要步骤如下:
- 从源码构建GCC和GLIBC
- 从源码构建V8静态库v8_monolith.a
- 将V8静态库、libc++、GLIBC和游戏模块全静态链接
git基础概念和基础命令
下面的一些 git 命令,在使用时常常不知所以,容易混淆,其实原因是对 git 的机制并不了解,因此在本文中介绍相关。
reset hard/soft/mixed
1
2
3$ git reset --hard
$ git reset --mixed
$ git reset --softfetch/pull
1
2$ git fetch
$ git pullreset/revert
diff cached/HEAD
1
2
3
4
5$ git diff --cached
$ git diff --staged
$ git diff HEAD
$ git diff HEAD~1
$ git diff HEAD^rev-list/log
SVN从源码构建
本文讲解SVN从源码的构建流程,和其中遇到的一些问题。
Redis Sentinel实现原理分析
Sentinel(哨兵)监控Redis集群中Master状态,是Redis 的高可用性解决方案。它监视一系列Master-Slave集群(和其他Sentinel)。当某个Master下线时,自动将该Master下的某个Slave升级为Master。
Sentinel的代码阅读难度相对较大,这是因为它是时钟驱动的一个状态机,所以在逻辑上有点不是很连贯。
本文使用的版本和Redis底层对象实现原理分析这篇文章是相同的。有一些基础知识也在这篇文章中列出。
ELF文件链接和装载
本篇将主要结合CSAPP介绍ELF文件的格式,常用的分析工具如objdump和readelf,以及Linux程序链接和装载的流程。