学习计划¶
1 2021.07.19-2021.07.23¶
1.1 .gitignore 编写¶
- [x] https://github.com/github/gitignore/blob/master/Global/CVS.gitignore
- [x] https://zhuanlan.zhihu.com/p/52885189
1.2 gdb 使用¶
- [ ] https://wizardforcel.gitbooks.io/100-gdb-tips/content/load-executable-and-coredump-file.html
1.3 lambda 原理¶
- [x] https://ld246.com/article/1545790136502
1.4 外部链接性和内部链接性¶
- [x] 外部链接性和内部链接性
1.5 hook 钩子¶
- [x] hook 钩子
2 2021.07.26-2021.07.30¶
2.1 zookeeper¶
- [ ] https://zhuanlan.zhihu.com/p/108765831
- [ ] https://zookeeper.apache.org/doc/r3.7.0/zookeeperStarted.html
- 特点:
- 基于观察者设计模式的分布式服务管理框架
- 一主多副(1 个 leader 节点,多个 follower 节点)
- 半数以上节点存活,zookeeper 集群才能正常服务
- zookeeper 节点数最少 3 个,且一般为奇数
- zookeeper 数据结构类似 unix 文件系统(树),Znode 可以存数据,又可有子节点。(不同于文件和文件夹的概念)
2.2 cmake¶
2.3 设计模式¶
- [ ] http://c.biancheng.net/view/1390.html
2.4 Reactor 和 Proactor 模式¶
- [ ] https://zhuanlan.zhihu.com/p/95662364
- [ ] https://segmentfault.com/a/1190000018331509
2.5 GoogleTest GMock 使用¶
- [ ] https://google.github.io/googletest/primer.html
2.6 正则表达式¶
- [x] https://geek-docs.com/regexp/regexp-tutorials/regular-expressions-match-numeric-ranges.html
2.7 socket api¶
2.8 c pthread api 和 c++ thread api 对比¶
2.9 epoll¶
- [ ] https://www.jianshu.com/p/ee381d365a29
2.10 uml 类图,时序图¶
- [x] https://www.huaweicloud.com/articles/12644635.html
2.11 测试 - 打桩¶
- [x] https://zhuanlan.zhihu.com/p/67199540
3 2021.08.02-2021.08.06¶
3.1 REST(Resource Representational State Transfer)¶
是一种针对网络应用的设计和开发方式,可以降低开发的复杂性,提高系统的可伸缩性。 - [x] http://restful.p2hp.com/
3.2 openstack,docker,mesos,k8s 什么关系?¶
- [ ] https://www.zhihu.com/question/62985699
3.3 Docker¶
- [ ] https://yeasy.gitbook.io/docker_practice/install/windows
- [ ] https://zhuanlan.zhihu.com/p/365455200
3.4 Openstack¶
- [ ] https://zhuanlan.zhihu.com/p/35598437
3.5 curl(client URL)¶
在 Linux 中 curl 是一个利用 URL 规则在命令行下工作的文件传输工具,可以说是一款很强大的 http 命令行工具。它支持文件的上传和下载,是综合传输工具,但按传统,习惯称 url 为下载工具。
3.6 vim 技巧¶
- [ ] https://juejin.cn/post/6844903906766487565
3.7 vim 配置¶
- [ ] https://blog.51cto.com/zpf666/2335640
- [ ] http://www.wilson-blog.cn/post/2019/06/16/vim-apply.html
3.8 c 字符格式化符号¶
- [x] https://zh.cppreference.com/w/c/io/fprintf
3.9 c 数值类型长度¶
- [x] https://zh.cppreference.com/w/c/language/arithmetic_types
4 2021.08.16-2021.08.22¶
4.1 LSM Tree¶
LSM 树,即日志结构合并树 (Log-Structured Merge-Tree),将数据以顺序写形式写入磁盘,故写性能强,但会牺牲读性能 - [x] https://segmentfault.com/a/1190000039269078 - [x] https://www.codenong.com/cs105377370/
4.2 布隆过滤器¶
- [x] https://juejin.cn/post/6844904007790673933
4.3 levelDB¶
安装步骤
# 进入leveldb目录,执行以下指令
mkdir build && cd build
cmake -DCMAKE_BUILD_TYPE=Release .. && cmake --build .
make
sudo make install
- [x] https://zhuanlan.zhihu.com/p/67833030
- [ ] https://github.com/balloonwj/CppGuide/blob/master/articles/leveldb%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90/leveldb%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%901.md
- [ ] https://sf-zhou.github.io/leveldb/leveldb_01_data_structure.html
- [ ] https://juejin.cn/post/6844903751346716686
4.3.1 Slice¶
Slice 结构通过指针指向外部字符串,类似 string_view
5 2021.08.23-2021.05.27¶
5.1 数据库的分区/分库/分表¶
- [ ] https://zhuanlan.zhihu.com/p/342814592
5.2 2021.09.066-2021.09.12¶
5.2.1 网络相关 api¶
- getifaddrs、freeifaddrs
- getaddrinfo、freeaddrinfo
- inet_ntop、inet_pton
5.2.2 RDMA 网卡¶
目前 RDMA 有三种不同的硬件实现。分别是: 1. InfiniBand、 2. iWarp(internet Wide Area RDMA Protocol)、 3. RoCE(RDMA over Converged Ethernet)。 - [ ] https://cloud.tencent.com/developer/article/1420687
5.2.3 do{...}while(0) 的意义和用法¶
5.3 2021.09.13-2021.09.19¶
5.3.1 DDD 领域驱动设计¶
5.3.2 微服务¶
5.3.3 tomcat¶
5.3.4 nginx¶
5.3.5 systemctl¶
如何让一个可以程序由 systemctl 管理?需要在/usr/lib/systemd/system 目录下编写 unit 文件 - [ ] https://blog.csdn.net/c_circle/article/details/101677001 - [ ] https://www.linuxidc.com/Linux/2018-08/153545.htm - [ ] https://www.cnblogs.com/sparkdev/p/8472711.html#t2
5.3.6 网络心跳包机制¶
- [ ] https://zhuanlan.zhihu.com/p/77182846
为什么需要心跳机制? 考虑以下两种典型的即时通讯网络层问题情型:
1)情形一:一个客户端连接服务器以后,如果长期没有和服务器有数据来往,可能会被防火墙程序关闭连接,有时候我们并不想要被关闭连接。例如,对于一个即时通讯软件来说,如果服务器没有消息时,我们确实不会和服务器有任何数据交换,但是如果连接被关闭了,有新消息来时,我们再也没法收到了,这就违背了“即时通讯”的设计要求。
2)情形二:通常情况下,服务器与某个客户端一般不是位于同一个网络,其之间可能经过数个路由器和交换机,如果其中某个必经路由器或者交换器出现了故障,并且一段时间内没有恢复,导致这之间的链路不再畅通,而此时服务器与客户端之间也没有数据进行交换,由于 TCP 连接是状态机,对于这种情况,无论是客户端或者服务器都无法感知与对方的连接是否正常,这类连接我们一般称之为“死链”。
对于上述问题情型,即时通讯应用通常的解决思路:
1)针对情形一:此应用场景要求必须保持客户端与服务器之间的连接正常,就是我们通常所说的“保活“。如上所述,当服务器与客户端一定时间内没有有效业务数据来往时,我们只需要给对端发送心跳包即可实现保活。
2)针对情形二:要解决死链问题,只要我们此时任意一端给对端发送一个数据包即可检测链路是否正常,这类数据包我们也称之为”心跳包”,这种操作我们称之为“心跳检测”。顾名思义,如果一个人没有心跳了,可能已经死亡了;一个连接长时间没有正常数据来往,也没有心跳包来往,就可以认为这个连接已经不存在,为了节约服务器连接资源,我们可以通过关闭 socket,回收连接资源。
总之,心跳检测机制一般有两个作用:
1)保活; 2)检测死链。 针对以上问题情型,即时通讯网的另一篇:《为何基于 TCP 协议的移动端 IM 仍然需要心跳保活机制?》,也非常值得一读。
5.3.7 namespace 和 cgroup¶
namespace 是用来做资源隔离, cgroup 是用来做资源限制。 - [ ] https://segmentfault.com/a/1190000009732550
5.3.8 veth 虚拟以太网¶
- [ ] https://cdmana.com/2021/01/20210105172018266D.html
- [ ] https://bbs.huaweicloud.com/blogs/detail/149798
5.3.9 监控平台 Prometheus 和可视化面板 Grafana¶
- [ ] https://www.prometheus.wang/quickstart/use-grafana-create-dashboard.html
- [ ] https://grafana.com/grafana/
5.3.10 关于 CPU 的 User、Nice、System、Wait、Idle 各个参数的解释¶
- [ ] https://www.cnblogs.com/hapjin/p/6296296.html
- User:CPU 一共花了多少比例的时间运行在用户态空间或者说是用户进程 (running user space processes)。典型的用户态空间程序有:Shells、数据库、web 服务器……
- Nice:可理解为,用户空间进程的 CPU 的调度优先级,范围为 [-20,19]
- System:含义与 User 相似,System 表示 CPU 花了多少比例的时间在内核空间运行。分配内存、IO 操作、创建子进程……都是内核操作。这也表明,当 IO 操作频繁时,System 参数会很高。
- Wait:在计算机中,读写磁盘的操作远比 CPU 运行的速度要慢,CPU 负载处理数据,而数据一般在磁盘上需要读到内存中才能处理。当 CPU 发起读写操作后,需要等着磁盘驱动器将数据读入内存,从而导致 CPU 在等待的这一段时间内无事可做。CPU 处于这种等待状态的时间由 Wait 参数来衡量。
- Idel 表示:CPU 处于空闲状态时间比例。一般而言,idel + user + nice 约等于 100%
5.3.11 关于 free 结果 total、used、free、shared、buff/cache、available 分析¶
- [ ] https://www.shangmayuan.com/a/1da0109b552f4f4cacb9ba22.html
5.3.12 make 内建变量、函数¶
5.3.13 rpmbuild¶
- [ ] https://www.jianshu.com/p/283768d15601
5.4 2021.11.01-2021.11.05¶
5.4.1 统计 c++ 中重要的宏¶
5.4.2 valgrind 内存检测¶
5.4.3 系统级性能分析工具 perf¶
5.4.4 锁类型¶
参看资料 当加锁失败时,互斥锁用「线程切换」来应对,自旋锁则用「忙等待」来应对
5.4.4.1 自旋锁¶
- 特点:线程反复检查锁变量是否可用。由于线程在这一过程中保持执行,因此是一种忙等待。一旦获取了自旋锁,线程会一直保持该锁,直至显式释放自旋锁。
- 优点:自旋锁避免了进程上下文的调度开销,因此对于线程只会阻塞很短时间的场合是有效的。
- 缺点:单核 CPU 不适于使用自旋锁,这里的单核 CPU 指的是单核单线程的 CPU,因为,在同一时间只有一个线程是处在运行状态,假设运行线程 A 发现无法获取锁,只能等待解锁,但因为 A 自身不挂起,所以那个持有锁的线程 B 没有办法进入运行状态,只能等到操作系统分给 A 的时间片用完,才能有机会被调度。