2021 年 10 年后端开发程序员最新《C/C++Linux 服务器开发》学习路线总结,建议收藏
前言
从事开发行业也有 10 多年了,在摸爬滚打的工作这段时间里,深知了有一个「完整的知识体系」是非常重要的。当事人非常后悔没有在大学期间知道这个道理……
众多大厂招人的需求也是非常注重此方面,毕竟我们不能单单只是一个只会写代码的程序员,更应该成为一个全面的工程师,能够迅速解决工作上的需求及众多问题。
特此,我根据多年的开发经验总结了一份较为全面的【C/C++Linux 服务器开发】 成长路线知识点,我自己也是在跟着这份思维导图进一步的学习,希望这份路程也能伴随大家的成长。
以下是整理的学习路线视频链接:C/C++Linux服务器开发/Linux后台架构师-学习视频
特此说明下:
所有学习资料和高清思维导图的获取的方式见文章末尾(机智的你,应该发现图就有途径)
一. 精进基石
1、数据结构与算法
1.1 面试必聊的排序与 KMP:
插入排序
快速排序
希尔排序桶排序
基数排序
归并排序
字符串匹配
KMP 算法
1.2 随处可见的红黑树:
红黑树的应用场景 进程调度 cfs,内存管理
红黑树的数学证明与推导
手撕红黑树的左旋与右旋
红黑树添加的实现与添加三种情况的证明
红黑树删除的实现与删除四种情况的证明
红黑树的线程安全的做法
分析红黑树工程实用的特点
1.3 磁盘存储链式的 B 树与 B+树:
磁盘结构分析与数据存储原理
多叉树的运用以及 B 树的定义证明
B 树插入的两种分裂
B 树删除的前后借位与节点合并
手撕 B 树的插入,删除,遍历,查找
B+树的定义与实现
B+树叶子节点的前后指针
B+树的应用场景与实用特点
B+树的线程安全做法
1.4 海量数据去重的 Hash 与布隆过滤器,bitmap:
hash 的原理与 hash 函数的实现
hash 的应用场景
分布式 hash 的实现原理
海量数据去重布隆过滤器
布隆过滤的数学推导与证明
1.5 图论算法,dijkstra,dfs,bfs,动态规划:
图的构建与需求应用场景
dijkstra 的实现
经典动态规划问题
2、设计模式
2.1 创建型设计模式
单例模式
工厂方法模式与抽象工厂模式
原型模式
2.2 结构型设计模式
适配器模式
代理模式
桥接模式
组合模式
2.3 行为型设计模式
策略模式
观察者模式
责任链模式
状态模式
3、工程管理
3.1 手写:Makefile/cmake/configure
Makefile 的规则与 make 的工作原理
单文件编译与多文件编译
Makefile 的参数传递
多目录文件夹递归编译与嵌套执行 make
Makefile 的通配符,伪目标,文件搜索
Makefile 的操作函数与特殊语法
configure 生成 makefile 的原则
cmake 的写法
3.2 操作:git/svn 与持续集成
git 的工作流程
创建操作与基本操作
分支管理,查看提交历史
git 服务器搭建
3.3 Linux 系统运行时参数命令
进程间通信设施状态
ipcs Linux 系统运行时长
uptime CPU 平均负载和磁盘活动
iostat 监控,收集和汇报系统活动 sar
监控多处理器使用情况
mpstat 监控进程的内存使用情况 pmap
系统管理员调优和基准测量工具 nmon
密切关注 Linux 系统 glances
查看系统调用 strace
ftp 服务器基本信息 ftptop
IO 监控 iotop
电量消耗和电源管理 powertop
监控 mysql 的线程和性能 mytop
系统运行参数分析 htop/top/atop
Linux 网络统计监控工具 netstat
显示和修改网络接口控制器 ethtool
网络数据包分析利刃 tcpdump
远程登陆服务的标准协议 telnet
获取实时网络统计信息 iptraf
显示主机上网络接口带宽使用情况 iftop
二. 高性能网络设计
1、网络编程
1.1 网络 io 与 select,poll,epoll:
socket 与文件描述符的关联
sigio 的异步通知
多路复用 select/poll
手撕 epoll 单线程,多线程,多进程的多种写法
代码实现 LT/ET 的区别
1.2 reactor 的原理与实现
epoll 封装
send_cb/recv_cb/accept_cb reactor 多核实现
跨平台(select/epoll/kqueue)的封装 reactor
1.3 http/https 服务器的实现
reactor sendbuffer 与 recvbuffer 封装 http 协议
http 协议格式
http2.0 与 http3.0
有限状态机 fsm 解析 http
https 的工作流程
https 证书配置
1.4 websocket 协议与服务器实现
reactor sendbuffer 与 recvbuffer 封装 websocket 协议
websocket 握手流程
websocket 协议头封装
tcp 分包与粘包的解决方案
websocket 数据流的编解码
2、网络原理
2.1 服务器百万并发实现
同步处理与异步处理的数据差异
网络 io 线程池异步处理
ulimit 的 fd 的百万级别支持
sysctl.conf 的 rmem 与 wmem 的调优
conntrack 的原理分析
2.2 redis,memcached,nginx 网络组件
redis 单线程 reactor 的实现
memcached 的多线程 master-worker 的 reactor 实现
nginx 的多进程 reactor 的实现
多进程 reactor 的坑点,惊群,共享内存
2.3 posix API 与网络协议栈
connect,listen,accept 与三次握手 listen 参数 backlog syn 泛洪的解决方案
close 与四次挥手
11 个状态迁移
大量 close_wait 与 time_wait 的原因与解决方案
tcp keepalive 与应用层心跳包
拥塞控制与滑动窗口
2.4 udp 的可靠传输,QUIC,KCP
udp 的优缺点
udp 高并发的设计方案
qq 早期为什么选择 udp 作为通信协议
udp 可靠传输原理
quic 协议的设计原理
quic 的开源方案 quiche
kcp 的设计方案与算法原理
3、自研框架:协程框架实现 NtyCo
3.1 协程的设计原理与切换汇编实现
协程存在的 3 个原因
同步与异步性能,服务端异步处理,客户端异步请求
协程原语 switch,resume,yield,
协程切换的三种实现方式,setjmp/longjmp, ucontext
汇编实现 寄存器讲解
协程初始启动 eip 寄存器设置
协程栈空间定义,独立栈与共享栈的做法
协程结构体定义
3.2 协程的调度器实现与性能测试
调度器的定义分析
超时集合,就绪队列,io 等待集合的实现
协程调度的执行流程
协程接口实现,异步流程实现
hook 钩子的实现
协程实现 mysql 请求
协程多核方案分析
协程性能测试
4、自研框架:用户态协议栈 NtyTCP
4.1 tcp/ip 设计
用户态协议栈的存在场景与实现原理
netmap 开源框架
eth 协议,ip 协议,udp 协议实现
arp 协议实现
icmp 协议实现
4.2 tcp/ip 定时器与滑动窗口的实现
tcp 协议头实现
tcp 控制块的实现
滑动窗口的实现
重传定时器,坚持定时器,time_wait 定时器,keepalive 定时器
4.3 Epoll 的实现
epoll 数据结构封装与线程安全实现
协议栈 fd 就绪回调实现
epoll 接口实现
LT/ET 的实现
三. 基础组件实现
1、池式组件
服务端 reactor 事件封装
libevent 接口分析
event_base_new, event_add, event_del, event_base_loop
memcached 网络模块分析
libev 的主要数据结构
EV_WATCH, EV_WATCH_LIST libevent 与 libev 性能对比
1.1 线程池与性能分析
线程池的异步处理使用场景
线程池的组成 任务队列 执行队列
任务回调与条件等待
线程池的动态防缩
扩展:nginx 线程池实现对比分析
1.2 ringbuffer 与内存池实现
内存池的应用场景与性能分析
内存小块分配与管理
内存大块分配与管理
手写内存池,结构体封装与 API 实现
避免内存泄漏的两种万能方法
定位内存泄漏的 3 种工具
扩展:nginx 内存池实现
1.3 异步请求池 http/mysql/redis/dns
异步请求处理流程
King 式四元组,create,commit,callback, destory
异步请求框架封装
应用协议 redis/dns/http 请求封装
1.4 mysql/redis 连接池的实现
连接池性能的影响的 2 个因素,tcp 连接和 mysql 认证
连接请求归还策略
连接超时未归还策略
链接断开重连策略
连接数量最优策略
2、高性能组件
2.1 原子操作 CAS 与锁实现原理实现
互斥锁的使用场景与原理
自旋锁的性能分析
原子操作的汇编实现
2.2 消息队列与无锁实现
有锁无锁队列性能
内存屏障 Barrier
数组无锁队列设计实现
链表无锁队列设计实现
2.3 定时器方案 红黑树 时间轮 最小堆
定时器的使用场景
定时器的红黑树存储
时间轮的实现
最小堆的实现
分布式定时器的实现
2.4 try/catch 组件的实现
setjmp/longjmp
try/catch 宏定义实现
try/catch 嵌套
try/catch 线程安全
线程私有数据 pthread_key
3、开源组件
3.1 libevent/libev 框架实战的那些坑
服务端 reactor 事件封装
libevent 接口分析
event_base_new, event_add, event_del, event_base_loop
memcached 网络模块分析
libev 的主要数据结构
EV_WATCH, EV_WATCH_LIST
libevent 与 libev 性能对比
3.2 异步日志方案 log4cpp
日志库性能瓶颈分析
异步日志库设计与实现
批量写入与双缓存冲机制
奔溃后的日志找回
3.3 应用层协议设计 ProtoBuf/Thrift
IM,云平台,nginx,http,redis 协议设计
如何保证消息完整性
手撕 protobuf IM 通信协议
protobuf 序列化与反序列化
protobuf 编码原理
3.4 Openssl 对称加密与非对称加密
对称加密与非对称加密
hash 的数据结构与使用
内存分配与管理
抽象 IO BIO 的具体实现
base64 编码的原理
RSA 的使用场景与数学证明
https 证书操作与原理分析
3.5 Json 数据解析/Xml 解析器和工具包
cjson,jsoncpp,repidjson 接口应用
json 序列化和反序列化
TinyXML2 接口应用
XML 序列化和反序列化
XML/json 不同应用场景
3.6 字符编码 Unicode 原理及编程实践
字符集与字符编码的关系
UTF8/UTF16/UTF32 具体区别
mysql,redis,nginx 使用中的字符集问题分析
zlib 数据压缩
手撕 zlib 压缩与解压
nginx 中的 zlib 实现原理
四. 中间件开发
1、MySQL
1.1 MySQLSQL 语句,索引,视图,存储过程,触发器
MySQL 体系结构,SQL 执行流程
SQL CURD 与高级查询
视图,触发器,存储过程
MySQL 权限管理
1.2 MySQL 索引原理以及 SQL 优化
索引,约束以及之间的区别
B+树,聚集索引和辅助索引
最左匹配原则以及覆盖索引
索引失效以及索引优化原则
EXPLAIN 执行计划以及优化选择过程分析
1.3 MySQL 事务原理分析
事务的 ACID 特性
MySQL 并发问题 脏读,不可重复读,幻读
事务隔离级别
锁的类型,锁算法实现以及锁操作对象
S 锁 X 锁 IS 锁 IX 锁
记录锁,间隙锁,next-key lock
插入意向锁, 自增锁 MVCC 原理剖析
1.4 MySQL 缓存策略
读写分离,连接池的场景以及其局限
缓存策略问题分析
缓存策略强一致性解决方案
缓存策略最终一致性解决方案
2 种 mysql 缓存同步方案 从数据库与触发器+udf
缓存同步开源方案 go-mysql-transfer
缓存同步开源方案
canal 原理分析
3 种缓存故障,缓存击穿,缓存穿透,缓存雪崩
1.5 MySQl 集群方案与 Replication 原理
分库分表:水平分库,垂直分库,水平分表,垂直分表
MySQl 官方三种集群方案 replication,Fabric,Cluster
三个开源集群方案 MMM, MHA, Galera Cluster
2、Redis
2.1 Redis 相关命令详解及其原理
string,set,zset,list,hash
分布式锁的实现
lua 脚本解决 ACID 原子性
Redis 事务的 ACID 性质分析
2.2 Redis 协议与异步方式
Redis 协议解析
特殊协议操作
订阅发布
手撕异步 redis 协议
2.3 存储原理与数据模型
string 的三种编码方式 int,raw,embstr
双向链表的 list 实现 字典的实现,hash 函数
解决键冲突与 rehash 跳表的实现与数据论证
整数集合实现
压缩列表原理证明
2.4 主从同步与对象模型
对象的类型与编码
字符串对象
列表对象
哈希对象
集合对象
有序集合
类型检测与命令多态
内存回收
对象共享
对象空转时长
2.5 集群方案主从复制/哨兵/集群与持久化
redis 的 3 种集群方式 主从复制,sentinel,cluster
4 种持久化方案
大厂的那些分布式缓存方案
3、Nginx
3.1 Nginx 反向代理与系统参数配置 conf 原理
Nginx 静态文件的配置
Nginx 动态接口代理配置
Nginx 对 Mqtt 协议转发
Nginx 对 Rtmp 推拉流
Openresty 对 Redis 缓存数据代理
3.2 进程间通信与 Slab 共享机制
shmem 的三种实现方式
原子操作
nginx channel
信号 信号量
文件锁,互斥锁
slab 共享内存
如何解决"惊群"问题 如何实现负载均衡
3.3 广告内容推送 Nginx 过滤模块的实现
Nginx Filter 模块运行原理
过滤链表的顺序
模块开发数据结构
ngx_str_t, ngx_list_t, ngx_buf_t, ngx_chain_t error 日志的用法
ngx_comond_t 的讲解
ngx_http_module_t 的执行流程
3.4 访问频率统计 Nginx handler 模块的实现
Nginx Handler 模块运行原理
ngx_module_t/ngx_http_module_t 的讲解
ngx_http_top_body_filter/ngx_http_top_header_filter 的原理
ngx_rbtree_t 的使用方法
ngx_rbtree 自定义添加方法
模块性能测试
3.5 Nginx http 状态机流程
Nginx 的核心数据结构 ngx_cycle_t, ngx_event_moule_t
http 请求的 11 个处理阶段
http 包体处理
http 响应发送
Nginx Upstream 机制的设计与实现
4、MongoDB
4.1 接口编程与文档操作
文档/集合/聚合函数操作
五种索引做法 单字段索引,复合索引,TTL 索引,全文索引,hash 索引
GridFS 存储大文件
WiredTiger 存储引擎
WiredTiger 的事务
journal 日志
4.2 集群方案与持久化备份
Master-Slave 的三个服务:Mongos/config/shard 服务
Replica Set 读写策略
Sharding 的实现与原理
三种 Mongodb 性能优化策略:时间同步,磁盘预读功能,内存管理
项目:MongoDB 跨数据中心的数据复制平台
抓取 Oplog 操作日志
日志分离
日志订阅
数据路由
Cache 同步
五. 开源框架分析及实战
1、Skynet
1.1 Skynet 设计原理
多核并发编程-多线程,多进程,csp 模型,
actor 模型 actor 模型实现-lua 服务和 c 服务
消息队列实现 actor 消息调度
1.2 skynet 网络层封装以及 lua/c 接口编程
skynet reactor 网络模型封装
socket/socketchannel 封装
手撕高性能 c 服务
lua 编程以及 lua/c 接口编程
1.3 skynet 重要组件以及手撕游戏项目
基础接口 skynet.send,skynet.call,skynet.response
广播组件 multicastd 数据共享组件
sharedatad datasheet
手撕万人同时在线游戏
2、ZeroMQ
2.1 消息队列与 ZeroMQ 的应用
REQ/REP 模型原理分析
PUB/SUB 模型原理分析
PUSH/PULL 模型原理分析
Router/Dealer 模型原理分析
2.2 ZeroMQ 源码分析:消息模型的实现
消息模型
消息传递模式
消息分帧
中间层代理
消息丢失处理
2.3 ZeroMQ 源码分析:网络机制与性能分析
零拷贝技术
消息高水位标记
无锁队列
可靠性设计
3、DPDK
3.1 DPDK 环境与 testpmd/l3fwd/skeleton
DPDK 环境参数讲解
多队列网卡的工作原理
CPU 亲和性
Burst 数据包的优缺点
DPDK 轮询模式 异步中断,轮询模式,混合中断轮询模式
virtio 与 vhost
3.2 DPDK 的用户态协议栈实现
内核网络接口 KNI 的实现原理
接收线程/发送线程/KNI 线程
内存数据结构 rte_mbuf, rte_mempool
端口数据结构 rte_kni, rte_kni_conf, rte_kni_ops, rte_eth_conf
协议数据结构 rte_ether_hdrrte_ipv4_hdr, rte_udp_hdr
数据处理接口 rte_eth_rx_burst,rte_kni_tx_burst,rte_pktmbuf_mtod
3.3 千万级流量并发的 DNS 处理
udp 协议包处理
dns 协议实现
配置文件解析
数据结构 rte_ring
trex 数据包性能测试
3.4 高性能数据处理框架 VPP
vpp 使用 vmxnet3
DPDK ACL 实现数据过滤
vpp web 应用
vpp 基础库 VPPInfra
高速查找路由表,CAM 表
3.5 DPDK 的虚拟交换机框架 OvS
OvS 三大组件 ovs-vswitchd, ovsdb-server, openvswitch.ko
OvS 报文处理机制
OvS 4 种数据路径
VXLAN 数据协议
六. Linux 内核源码
1、进程管理
1.1 进程原理与运行分析
task_struct 结构数据
进程的生命周期
进程优先级
进程状态迁移
写时复制
1.2 全方位剖析调度机制
调度器 stop/rt/deadline/cfs/idle
调度策略 SCHED_RR/SCHED_FIFO
smp 多核调度
1.3 锁与进程间通信
自旋锁的实现
互斥锁的实现
大内核锁 BKL-Big Kernel Lock
消息队列
共享内存
2、内存管理
2.1 内存原理与内存杂乱繁多的细节
uma 与 numa 的内存结构
tlb 的工作原理
mm_struct 结构体
页表与缺页异常
高速缓存
2.3 物理内存与虚拟内存管理
分配器原理
slab/slub/slob 分配器
不连续页原理
内存映射
伙伴算法
2.4 虚拟内存及 API 调用
进程内存映射
进程堆栈管理
用户空间与内核空间
系统调用 kmalloc/vmalloc
3、文件系统
3.1 虚拟文件系统
通用文件模型
VFS 结构
文件操作系统调用
file/inode 原理
3.2 无持久存储的文件系统
文件系统数据结构
管理/proc 数据项
系统控制机制
sysfs 数据结构
挂载文件系统
文件目录操作
sysfs 增加数据
3.3 磁盘文件系统
Ext2 文件系统
Ext3 文件系统
Ext4 文件系统
3.4 用户态文件系统 fuse
fuse 使用场景
fuse 原理
fuse 实现
用户态文件接口实现
4、设备驱动
4.1 实现进程间通信组件
file_operation 原理
系统调用的流程
ioctl 流程
请求中断
4.2 块设备运行原理
资源管理
I/O 调度
BIO 结构原理
PCI 总线原理
4.3 虚拟网络适配器的实现
网络结构体 net_device/net_device_ops
sk_buff 原理
网卡数据中断
网卡 mmap
七. 性能分析
1、性能工具
高性能代码构建系统 tundra
Http 压测工具 WRK
网站压测工具 webbench
2、调试库
内存调试性能分析工具 Valgrind
谷歌 C++测试框架 GoogleTest
内存分配跟踪库 MemTrack
3、内核跟踪与火焰图分析
内核探测 SystemTap
火焰图分析与生成
八. 分布式架构
1、架构实战
1.1 腾讯微服务 RPC 框架 Tars
Tars 微服务应用场景
RPC 协议的序列化与反序列化
路由管理 Registry
服务发布管理 Patch
分布式 MySQL 与分布式 Cache
服务发现与服务治理解决方案
1.2 容器化 Docker 与容器编排
Docker 镜像管理
镜像元数据管理与存储驱动
网络管理与 GRE 实现跨网络通信
Docker 容器安全解决方案
SElinux Dockerfile 的容器构建
编排三剑客 Fig/Compose/Swarm
编排小神器 Fleet
Flynn 体系架构与实现原理
1.3 容器化管理 k8s 与核心组件
k8s 使用场景
k8s 核心组件 APIServer, scheduler, controller manager, kubelet, kube-proxy
网络核心原理 单 pod 单 ip, pod 和网络容器
用户认证与 namespace 设计
2、架构原理
2.1 分布式注册服务中心 etcd
etcd 的应用场景与功能分析
强一致性 raft 算法原理
etcd 的分布式锁实现
单机部署与集群部署
2.2 内核级支持的分布式存储 Ceph
ceph 的集群部署
monitor 与 OSD
ceph 5 个核心组件
ceph 集群监控
ceph 性能调调优与 benchmark
2.3 快播核心技术揭秘 P2P 框架的实现
网关 NAT 表分析
NAT 类型,完全锥型 NAT,对称 NAT,端口限制锥形 NAT,IP 限制锥型 NAT
代码逻辑实现 NAT 类型检测
网络穿透的原理
网络穿透的 3 种情况
九. 上线项目实战
1、互联网并发云盘
1.1 fastdfs 架构分析和配置
fastdfs 架构分析
快速配置 fastdfs
上传文件逻辑分析
下载文件逻辑分析
1.2 fastdfs 存储原理
tracker,storage 分析
存储机制
支持断点续传
相同文件内容只保存一份
1.3 分布式 fastdfs 存储集群部署
同步机制
线性扩容
如何实现高可用
负载均衡
1.4 高负载 nginx/fastcgi
fastdfs-nginx-module 模块分析
fastcgi 请求与响应
nginx 与 fastcgi 如何通信
nginx-fastcgi-fastdfs 如何实现上传下载
1.5 文件传输和接口设计
云盘接口设计
云盘数据库设计
云盘文件上传,下载功能实现
云盘源码业务流程实现
1.6 产品上云公网发布/测试用例
使用云服务器的各种坑分析
fiddler 监控 http 请求,postman 模拟请求
wrk 测试接口吞吐量
jmeter 压力测试
2、微服务即时通讯
2.1 IM 即时通讯项目框架分析和部署
接入层、逻辑层、持久层架构划分
消息实时性分析
即时通讯数据库设计
单聊、群聊消息原理
群成员管理
未读消息原理
池化技术的使用
快速配置 IM 项目
2.2 IM 消息服务器/文件传输服务器
protobuf 通信协议设计
数据库分表设计
reactor 百万并发模型
login_server 负载均衡
登录请求响应模型
2.3 消息服务器/路由服务器
请求登陆逻辑
最近联系会话逻辑
查询用户在线主题
未读消息机制
单聊消息推拉机制
群聊消息推拉机制
路由转发机制
2.4 数据库代理服务器设计
main 函数主流程
响应流程
redis 缓存
消息计数(单聊和群聊)
未读消息机制
群成员管理
单聊群聊
2.5 文件服务器和 docker 部署
在线文件传输机制分析
离线文件传输机制分析
etcd 微服务注册与发现
docker 制作与部署
2.6 产品上云公网发布/公网测试上线
单元测试案例
testbench 如何设计
IM 项目性能压测
定制私有功能
云服务器部署
思维导图获取点击:导图
十、视频学习
每个人的学习方法不一样,个人认为视频是很好的学习的方式,当然也要质量不佳好的视频,有人一步一步的讲解教学,配合的相应的文档,学习起来效率更佳。
后记
技术的瓶颈是认知的问题,认知不是知其名,还需要知其因,更需要知其原。
祝大家早日成为大牛,以下 C/C++Linux 后端服务器开发高级架构系统学习视频点击:
版权声明: 本文为 InfoQ 作者【奔着腾讯去】的原创文章。
原文链接:【http://xie.infoq.cn/article/1a6ec059f9f78736e129e7213】。文章转载请联系作者。
评论