├── .gitignore ├── C++ ├── common │ ├── 1. const.pdf │ └── 1. const.xmind ├── concurrent │ ├── 1. Linux 进程、线程与调度.pdf │ ├── 1. Linux进程、线程与调度.xmind │ ├── 2. 线程的创建与执行.pdf │ ├── 2. 线程的创建与执行.xmind │ ├── 3. async与future.pdf │ ├── 3. async与future.xmind │ ├── 4. 互斥量、lock_guard与unique_lock.pdf │ ├── 4. 互斥量、lock_guard与unique_lock.xmind │ ├── 5. 通知状态的改变—POSIX条件变量.pdf │ ├── 5. 通知状态的改变—POSIX条件变量.xmind │ ├── 6. 通知状态的改变—C++条件变量.pdf │ ├── 6. 通知状态的改变—C++条件变量.xmind │ ├── 7. POSIX 信号量.pdf │ └── 7. POSIX信号量.xmind ├── copy-control │ ├── 1. 拷贝构造与拷贝赋值.pdf │ ├── 1. 拷贝构造与拷贝赋值.xmind │ ├── 2. 左值、右值和移动语义.xmind │ ├── 2. 左值与右值.pdf │ ├── 3. 移动构造与移动赋值.pdf │ ├── 3. 移动构造与移动赋值.xmind │ ├── 4. 三五法则.pdf │ └── 4. 三五法则.xmind ├── functional │ ├── 1. lambda 表达式.pdf │ ├── 1. lambda 表达式.xmind │ ├── 2. 可调用对象 function.pdf │ └── 2. 可调用对象—function.xmind ├── smart-ptr │ ├── 1. C++管理资源的方式.xmind │ ├── 1. 堆、栈与 RAII.pdf │ ├── 2. RAII与智能指针.pdf │ ├── 2. RAII与智能指针.xmind │ ├── 3. shared_ptr.pdf │ └── 3. shared_ptr.xmind ├── template │ ├── 1. Template.pdf │ ├── 1. Template的基本使用.xmind │ ├── 2. 万能引用与类型推断问题.pdf │ ├── 2. 万能引用与类型推断问题.xmind │ ├── 3. 完美转发.pdf │ └── 3. 完美转发.xmind └── type │ ├── 1. 强制类型转换.pdf │ ├── 1. 强制类型转换.xmind │ ├── 2. 自动类型推断—auto.xmind │ ├── 2. 自动类型推断(auto).pdf │ ├── 3. decltype.pdf │ └── 3. decltype.xmind ├── Distributed-System ├── Basic Paxos.pdf ├── Basic Paxos.xmind ├── Gossip.pdf ├── Gossip.xmind ├── Raft.pdf ├── Raft.xmind ├── roadmap.png ├── 拜占庭将军问题.pdf └── 拜占庭将军问题.xmind ├── Linux-Network ├── 1. 信号.xmind ├── 10. epoll 原理剖析.xmind ├── 11. epoll_event.xmind ├── 12. HTTPS.xmind ├── 13. nginx.xmind ├── 2. 信号集与信号掩码.xmind ├── 3. 进程的创建.xmind ├── 4. DAEMON.xmind ├── 5. 进程间通讯简介.xmind ├── 6. 可靠传输协议—TCP.xmind ├── 7. TCP拥塞控制.xmind ├── 8. socket 编程问题一览(01).xmind ├── 9. socket 编程问题一览(02).xmind ├── DAEMON.pdf ├── HTTPS.pdf ├── TCP拥塞控制.pdf ├── epoll 原理剖析.pdf ├── epoll_event.pdf ├── nginx.pdf ├── socket 编程问题一览(01).pdf ├── socket 编程问题一览(02).pdf ├── 信号.pdf ├── 信号集与信号掩码.pdf ├── 可靠传输协议—TCP.pdf ├── 进程的创建.pdf └── 进程间通讯简介.pdf ├── Operating-System ├── Linux-Virtual-Memory.pdf └── Linux-Virtual-Memory.xmind ├── Psyduck.png ├── README.md ├── base-questions ├── README.md ├── images │ ├── 1619766123992.png │ ├── 1619767874908.png │ ├── 1620475785744.png │ ├── 1620610060394.png │ └── 1620785460173.png └── network │ ├── Enter-URL-On-Browser.md │ ├── HTTP-And-HTTPS.md │ ├── SYN-Flood.md │ ├── TCP-And-UDP.md │ ├── TCP-Connect-And-Close.md │ └── TCP-Reliability.md ├── database ├── InnoDB Group Commit.pdf ├── InnoDB Group Commit.xmind ├── InnoDB-Page.pdf ├── InnoDB-Page.xmind ├── InnoDB-WAL.pdf ├── InnoDB-WAL.xmind ├── InnoDB-undo-log与MVCC.pdf ├── InnoDB-undo-log与MVCC.xmind ├── MySQL Cost Based Optimizer.pdf ├── MySQL Cost Based Optimizer.xmind ├── MySQL JOIN 工作原理浅析.pdf ├── MySQL JOIN 工作原理浅析.xmind ├── Redis 主从复制.pdf ├── Redis 主从复制.xmind ├── Redis数据结构.pdf ├── Redis数据结构.xmind ├── etcd概述.pdf ├── etcd概述.xmind ├── 为什么MySQL使用B+Tree.pdf ├── 为什么MySQL使用B+Tree.xmind ├── 主键的选择.pdf ├── 主键的选择.xmind ├── 全局锁、表级锁以及行锁(上).pdf ├── 全局锁、表级锁以及行锁(上).xmind ├── 全局锁、表级锁以及行锁(下).pdf ├── 全局锁、表级锁以及行锁(下).xmind ├── 全局锁、表级锁以及行锁(中).pdf ├── 全局锁、表级锁以及行锁(中).xmind ├── 深入浅出 InnoDB Index.pdf ├── 深入浅出 InnoDB Index.xmind ├── 缓存更新的策略.pdf └── 缓存的更新策略.xmind ├── deliberate ├── 01. smart_ptr │ ├── main.cpp │ └── smart_ptr.hpp ├── 02. blocking_queue │ ├── blocking_queue.hpp │ └── main.cpp └── 03. signal_process │ └── main.c ├── go-concurrency ├── channel │ ├── alternately_print_test.go │ └── goroutine_leak_test.go ├── go.mod ├── memory │ └── memory_reordering_test.go └── mutex │ ├── mutex_test.go │ ├── once_test.go │ ├── race_test.go │ └── rwmutex_test.go ├── golang ├── G-M-P模型.pdf ├── G-M-P模型.xmind ├── GC.pdf ├── GC.xmind ├── channel.pdf ├── channel.xmind ├── map.pdf └── map.xmind ├── kubernetes ├── 为什么需要 Pod.pdf ├── 为什么需要 Pod.xmind ├── 声明式 API 是如何实现的.pdf └── 声明式 API 是如何实现的.xmind ├── materials ├── GMP.drawio ├── HTTPS.drawio ├── MQ-Design.drawio ├── MySQL-Join.drawio ├── README.md ├── docker.drawio ├── golang-map-and-channel.drawio ├── k8s.drawio ├── nginx-data-structure.drawio ├── nginx.drawio ├── paxos.drawio ├── redis-replication.drawio └── redo-log&binlog.drawio └── middleware ├── RabbitMQ.pdf └── RabbitMQ.xmind /.gitignore: -------------------------------------------------------------------------------- 1 | .idea/ -------------------------------------------------------------------------------- /C++/common/1. const.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/C++/common/1. const.pdf -------------------------------------------------------------------------------- /C++/common/1. const.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/C++/common/1. const.xmind -------------------------------------------------------------------------------- /C++/concurrent/1. Linux 进程、线程与调度.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/C++/concurrent/1. Linux 进程、线程与调度.pdf -------------------------------------------------------------------------------- /C++/concurrent/1. Linux进程、线程与调度.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/C++/concurrent/1. Linux进程、线程与调度.xmind -------------------------------------------------------------------------------- /C++/concurrent/2. 线程的创建与执行.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/C++/concurrent/2. 线程的创建与执行.pdf -------------------------------------------------------------------------------- /C++/concurrent/2. 线程的创建与执行.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/C++/concurrent/2. 线程的创建与执行.xmind -------------------------------------------------------------------------------- /C++/concurrent/3. async与future.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/C++/concurrent/3. async与future.pdf -------------------------------------------------------------------------------- /C++/concurrent/3. async与future.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/C++/concurrent/3. async与future.xmind -------------------------------------------------------------------------------- /C++/concurrent/4. 互斥量、lock_guard与unique_lock.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/C++/concurrent/4. 互斥量、lock_guard与unique_lock.pdf -------------------------------------------------------------------------------- /C++/concurrent/4. 互斥量、lock_guard与unique_lock.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/C++/concurrent/4. 互斥量、lock_guard与unique_lock.xmind -------------------------------------------------------------------------------- /C++/concurrent/5. 通知状态的改变—POSIX条件变量.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/C++/concurrent/5. 通知状态的改变—POSIX条件变量.pdf -------------------------------------------------------------------------------- /C++/concurrent/5. 通知状态的改变—POSIX条件变量.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/C++/concurrent/5. 通知状态的改变—POSIX条件变量.xmind -------------------------------------------------------------------------------- /C++/concurrent/6. 通知状态的改变—C++条件变量.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/C++/concurrent/6. 通知状态的改变—C++条件变量.pdf -------------------------------------------------------------------------------- /C++/concurrent/6. 通知状态的改变—C++条件变量.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/C++/concurrent/6. 通知状态的改变—C++条件变量.xmind -------------------------------------------------------------------------------- /C++/concurrent/7. POSIX 信号量.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/C++/concurrent/7. POSIX 信号量.pdf -------------------------------------------------------------------------------- /C++/concurrent/7. POSIX信号量.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/C++/concurrent/7. POSIX信号量.xmind -------------------------------------------------------------------------------- /C++/copy-control/1. 拷贝构造与拷贝赋值.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/C++/copy-control/1. 拷贝构造与拷贝赋值.pdf -------------------------------------------------------------------------------- /C++/copy-control/1. 拷贝构造与拷贝赋值.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/C++/copy-control/1. 拷贝构造与拷贝赋值.xmind -------------------------------------------------------------------------------- /C++/copy-control/2. 左值、右值和移动语义.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/C++/copy-control/2. 左值、右值和移动语义.xmind -------------------------------------------------------------------------------- /C++/copy-control/2. 左值与右值.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/C++/copy-control/2. 左值与右值.pdf -------------------------------------------------------------------------------- /C++/copy-control/3. 移动构造与移动赋值.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/C++/copy-control/3. 移动构造与移动赋值.pdf -------------------------------------------------------------------------------- /C++/copy-control/3. 移动构造与移动赋值.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/C++/copy-control/3. 移动构造与移动赋值.xmind -------------------------------------------------------------------------------- /C++/copy-control/4. 三五法则.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/C++/copy-control/4. 三五法则.pdf -------------------------------------------------------------------------------- /C++/copy-control/4. 三五法则.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/C++/copy-control/4. 三五法则.xmind -------------------------------------------------------------------------------- /C++/functional/1. lambda 表达式.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/C++/functional/1. lambda 表达式.pdf -------------------------------------------------------------------------------- /C++/functional/1. lambda 表达式.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/C++/functional/1. lambda 表达式.xmind -------------------------------------------------------------------------------- /C++/functional/2. 可调用对象 function.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/C++/functional/2. 可调用对象 function.pdf -------------------------------------------------------------------------------- /C++/functional/2. 可调用对象—function.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/C++/functional/2. 可调用对象—function.xmind -------------------------------------------------------------------------------- /C++/smart-ptr/1. C++管理资源的方式.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/C++/smart-ptr/1. C++管理资源的方式.xmind -------------------------------------------------------------------------------- /C++/smart-ptr/1. 堆、栈与 RAII.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/C++/smart-ptr/1. 堆、栈与 RAII.pdf -------------------------------------------------------------------------------- /C++/smart-ptr/2. RAII与智能指针.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/C++/smart-ptr/2. RAII与智能指针.pdf -------------------------------------------------------------------------------- /C++/smart-ptr/2. RAII与智能指针.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/C++/smart-ptr/2. RAII与智能指针.xmind -------------------------------------------------------------------------------- /C++/smart-ptr/3. shared_ptr.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/C++/smart-ptr/3. shared_ptr.pdf -------------------------------------------------------------------------------- /C++/smart-ptr/3. shared_ptr.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/C++/smart-ptr/3. shared_ptr.xmind -------------------------------------------------------------------------------- /C++/template/1. Template.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/C++/template/1. Template.pdf -------------------------------------------------------------------------------- /C++/template/1. Template的基本使用.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/C++/template/1. Template的基本使用.xmind -------------------------------------------------------------------------------- /C++/template/2. 万能引用与类型推断问题.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/C++/template/2. 万能引用与类型推断问题.pdf -------------------------------------------------------------------------------- /C++/template/2. 万能引用与类型推断问题.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/C++/template/2. 万能引用与类型推断问题.xmind -------------------------------------------------------------------------------- /C++/template/3. 完美转发.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/C++/template/3. 完美转发.pdf -------------------------------------------------------------------------------- /C++/template/3. 完美转发.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/C++/template/3. 完美转发.xmind -------------------------------------------------------------------------------- /C++/type/1. 强制类型转换.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/C++/type/1. 强制类型转换.pdf -------------------------------------------------------------------------------- /C++/type/1. 强制类型转换.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/C++/type/1. 强制类型转换.xmind -------------------------------------------------------------------------------- /C++/type/2. 自动类型推断—auto.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/C++/type/2. 自动类型推断—auto.xmind -------------------------------------------------------------------------------- /C++/type/2. 自动类型推断(auto).pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/C++/type/2. 自动类型推断(auto).pdf -------------------------------------------------------------------------------- /C++/type/3. decltype.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/C++/type/3. decltype.pdf -------------------------------------------------------------------------------- /C++/type/3. decltype.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/C++/type/3. decltype.xmind -------------------------------------------------------------------------------- /Distributed-System/Basic Paxos.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/Distributed-System/Basic Paxos.pdf -------------------------------------------------------------------------------- /Distributed-System/Basic Paxos.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/Distributed-System/Basic Paxos.xmind -------------------------------------------------------------------------------- /Distributed-System/Gossip.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/Distributed-System/Gossip.pdf -------------------------------------------------------------------------------- /Distributed-System/Gossip.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/Distributed-System/Gossip.xmind -------------------------------------------------------------------------------- /Distributed-System/Raft.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/Distributed-System/Raft.pdf -------------------------------------------------------------------------------- /Distributed-System/Raft.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/Distributed-System/Raft.xmind -------------------------------------------------------------------------------- /Distributed-System/roadmap.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/Distributed-System/roadmap.png -------------------------------------------------------------------------------- /Distributed-System/拜占庭将军问题.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/Distributed-System/拜占庭将军问题.pdf -------------------------------------------------------------------------------- /Distributed-System/拜占庭将军问题.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/Distributed-System/拜占庭将军问题.xmind -------------------------------------------------------------------------------- /Linux-Network/1. 信号.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/Linux-Network/1. 信号.xmind -------------------------------------------------------------------------------- /Linux-Network/10. epoll 原理剖析.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/Linux-Network/10. epoll 原理剖析.xmind -------------------------------------------------------------------------------- /Linux-Network/11. epoll_event.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/Linux-Network/11. epoll_event.xmind -------------------------------------------------------------------------------- /Linux-Network/12. HTTPS.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/Linux-Network/12. HTTPS.xmind -------------------------------------------------------------------------------- /Linux-Network/13. nginx.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/Linux-Network/13. nginx.xmind -------------------------------------------------------------------------------- /Linux-Network/2. 信号集与信号掩码.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/Linux-Network/2. 信号集与信号掩码.xmind -------------------------------------------------------------------------------- /Linux-Network/3. 进程的创建.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/Linux-Network/3. 进程的创建.xmind -------------------------------------------------------------------------------- /Linux-Network/4. DAEMON.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/Linux-Network/4. DAEMON.xmind -------------------------------------------------------------------------------- /Linux-Network/5. 进程间通讯简介.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/Linux-Network/5. 进程间通讯简介.xmind -------------------------------------------------------------------------------- /Linux-Network/6. 可靠传输协议—TCP.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/Linux-Network/6. 可靠传输协议—TCP.xmind -------------------------------------------------------------------------------- /Linux-Network/7. TCP拥塞控制.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/Linux-Network/7. TCP拥塞控制.xmind -------------------------------------------------------------------------------- /Linux-Network/8. socket 编程问题一览(01).xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/Linux-Network/8. socket 编程问题一览(01).xmind -------------------------------------------------------------------------------- /Linux-Network/9. socket 编程问题一览(02).xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/Linux-Network/9. socket 编程问题一览(02).xmind -------------------------------------------------------------------------------- /Linux-Network/DAEMON.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/Linux-Network/DAEMON.pdf -------------------------------------------------------------------------------- /Linux-Network/HTTPS.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/Linux-Network/HTTPS.pdf -------------------------------------------------------------------------------- /Linux-Network/TCP拥塞控制.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/Linux-Network/TCP拥塞控制.pdf -------------------------------------------------------------------------------- /Linux-Network/epoll 原理剖析.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/Linux-Network/epoll 原理剖析.pdf -------------------------------------------------------------------------------- /Linux-Network/epoll_event.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/Linux-Network/epoll_event.pdf -------------------------------------------------------------------------------- /Linux-Network/nginx.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/Linux-Network/nginx.pdf -------------------------------------------------------------------------------- /Linux-Network/socket 编程问题一览(01).pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/Linux-Network/socket 编程问题一览(01).pdf -------------------------------------------------------------------------------- /Linux-Network/socket 编程问题一览(02).pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/Linux-Network/socket 编程问题一览(02).pdf -------------------------------------------------------------------------------- /Linux-Network/信号.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/Linux-Network/信号.pdf -------------------------------------------------------------------------------- /Linux-Network/信号集与信号掩码.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/Linux-Network/信号集与信号掩码.pdf -------------------------------------------------------------------------------- /Linux-Network/可靠传输协议—TCP.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/Linux-Network/可靠传输协议—TCP.pdf -------------------------------------------------------------------------------- /Linux-Network/进程的创建.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/Linux-Network/进程的创建.pdf -------------------------------------------------------------------------------- /Linux-Network/进程间通讯简介.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/Linux-Network/进程间通讯简介.pdf -------------------------------------------------------------------------------- /Operating-System/Linux-Virtual-Memory.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/Operating-System/Linux-Virtual-Memory.pdf -------------------------------------------------------------------------------- /Operating-System/Linux-Virtual-Memory.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/Operating-System/Linux-Virtual-Memory.xmind -------------------------------------------------------------------------------- /Psyduck.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/Psyduck.png -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | # Psyduck 3 | 4 | 另一个用 XMind 记录 CS 基础问题的地方,同样提供了 `.xmind` 源文件以及导出的 `.pdf` 文件,XMind 版本为「XMind 2020」。 5 | 6 | 在 2020 年时,曾花了约 2 个月的时间整理了第一份 XMind 知识库: [ZeroMind](https://github.com/SmartKeyerror/ZeroMind)。 7 | 之所以额外创建一个 Repo 干同样的事情,是因为一方面自己的审美发生了变化,另一方面则是对那些最重要但基础的问题有了更深刻地理解。 8 | 9 | 温故而知新,孔子诚不欺我。在整理基础知识点的过程中,对诸如 CFS-vruntime、POSIX 条件变量、TCP 和 epoll 等内容有了自己的理解,有一种恍然大悟的感觉。 10 | 11 | 之所以使用 XMind 来记录这些内容,是因为我非常喜欢《火星救援》里面的一句台词: 12 | 13 | > 有时候,所有的情况都会对你不利。所有的坏事一起发生,你就可能会想,就是这样了,这就是我的终点了。面对这种情况,你要么接受,要么想办法解决,这就是一切的真谛。解决问题,你想各种办法,解决一个问题,然后接着解决下一个问题,循环往复,等你解决了足够多的问题,你就可以回家了。 14 | 15 | 也就是说,面对一个大问题时需要学会将其分解成一个一个的小问题,然后逐一地处理,即"分而治之"。下面是一些图片,可以帮助你更好地了解这个项目做了什么: 16 | 17 | ![](Psyduck.png) 18 | 19 | ------ 20 | 21 | 22 | ## :high_brightness: 目录 23 | 24 | - [Database](#bento-Database) 25 | - [Distributed System](#rocket-Distributed-System) 26 | - [Middleware](#alembic-middleware) 27 | - [Linux Network Programing](#fire-Linux-Network-Programing) 28 | - [Operating System](#zap-Operating-System) 29 | - [Golang](#paw_prints-Golang) 30 | - [Kubernetes](#art-Kubernetes) 31 | - [C++](#telescope-C++) 32 | 33 | ------ 34 | 35 | ## :bento: Database 36 | 37 | ### MySQL 38 | - [为什么 MySQL 使用 B+Tree?](https://smartkeyerror.oss-cn-shenzhen.aliyuncs.com/Phyduck/database/%E4%B8%BA%E4%BB%80%E4%B9%88MySQL%E4%BD%BF%E7%94%A8B%2BTree.pdf) 39 | - [InnoDB 数据页结构](https://smartkeyerror.oss-cn-shenzhen.aliyuncs.com/Phyduck/database/InnoDB-Page.pdf) 40 | - [深入浅出 InnoDB Index](https://smartkeyerror.oss-cn-shenzhen.aliyuncs.com/Phyduck/database/%E6%B7%B1%E5%85%A5%E6%B5%85%E5%87%BA%20InnoDB%20Index.pdf) 41 | - [InnoDB WAL](https://smartkeyerror.oss-cn-shenzhen.aliyuncs.com/Phyduck/database/InnoDB-WAL.pdf) 42 | - [InnoDB Group Commit](https://smartkeyerror.oss-cn-shenzhen.aliyuncs.com/Phyduck/database/InnoDB%20Group%20Commit.pdf) 43 | - [InnoDB undo log 与 MVCC](https://smartkeyerror.oss-cn-shenzhen.aliyuncs.com/Phyduck/database/InnoDB-undo-log%E4%B8%8EMVCC.pdf) 44 | - [全局锁、表级锁以及行锁(上)](https://smartkeyerror.oss-cn-shenzhen.aliyuncs.com/Phyduck/database/%E5%85%A8%E5%B1%80%E9%94%81%E3%80%81%E8%A1%A8%E7%BA%A7%E9%94%81%E4%BB%A5%E5%8F%8A%E8%A1%8C%E9%94%81%EF%BC%88%E4%B8%8A%EF%BC%89.pdf) 45 | - [全局锁、表级锁以及行锁(中)](https://smartkeyerror.oss-cn-shenzhen.aliyuncs.com/Phyduck/database/%E5%85%A8%E5%B1%80%E9%94%81%E3%80%81%E8%A1%A8%E7%BA%A7%E9%94%81%E4%BB%A5%E5%8F%8A%E8%A1%8C%E9%94%81%EF%BC%88%E4%B8%AD%EF%BC%89.pdf) 46 | - [全局锁、表级锁以及行锁(下)](https://smartkeyerror.oss-cn-shenzhen.aliyuncs.com/Phyduck/database/%E5%85%A8%E5%B1%80%E9%94%81%E3%80%81%E8%A1%A8%E7%BA%A7%E9%94%81%E4%BB%A5%E5%8F%8A%E8%A1%8C%E9%94%81%EF%BC%88%E4%B8%8B%EF%BC%89.pdf) 47 | - [主键的选择](https://smartkeyerror.oss-cn-shenzhen.aliyuncs.com/Phyduck/database/%E4%B8%BB%E9%94%AE%E7%9A%84%E9%80%89%E6%8B%A9.pdf) 48 | - [MySQL Cost-Based Optimizer](https://smartkeyerror.oss-cn-shenzhen.aliyuncs.com/Phyduck/database/MySQL%20Cost%20Based%20Optimizer.pdf) 49 | - [MySQL Join 工作原理浅析](https://smartkeyerror.oss-cn-shenzhen.aliyuncs.com/Phyduck/database/MySQL%20JOIN%20%E5%B7%A5%E4%BD%9C%E5%8E%9F%E7%90%86%E6%B5%85%E6%9E%90.pdf) 50 | 51 | ### Others 52 | 53 | - [Redis 数据结构](https://smartkeyerror.oss-cn-shenzhen.aliyuncs.com/Phyduck/database/Redis%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84.pdf) 54 | - [Redis 主从复制原理](https://smartkeyerror.oss-cn-shenzhen.aliyuncs.com/Phyduck/database/Redis%20%E4%B8%BB%E4%BB%8E%E5%A4%8D%E5%88%B6.pdf) 55 | - [缓存更新的策略](https://smartkeyerror.oss-cn-shenzhen.aliyuncs.com/Phyduck/database/%E7%BC%93%E5%AD%98%E6%9B%B4%E6%96%B0%E7%9A%84%E7%AD%96%E7%95%A5.pdf) 56 | - [etcd 概述](https://smartkeyerror.oss-cn-shenzhen.aliyuncs.com/Phyduck/database/etcd%E6%A6%82%E8%BF%B0.pdf) 57 | 58 | ------ 59 | 60 | ## :rocket: Distributed System 61 | 62 | ### 分布式协议与算法 63 | 64 | ![](Distributed-System/roadmap.png) 65 | 66 | - [拜占庭将军问题(共识)](https://smartkeyerror.oss-cn-shenzhen.aliyuncs.com/Phyduck/distributed-system/%E6%8B%9C%E5%8D%A0%E5%BA%AD%E5%B0%86%E5%86%9B%E9%97%AE%E9%A2%98.pdf) 67 | - [Basic Paxos](https://smartkeyerror.oss-cn-shenzhen.aliyuncs.com/Phyduck/distributed-system/Basic%20Paxos.pdf) 68 | - [Raft——领导选举与日志复制](https://smartkeyerror.oss-cn-shenzhen.aliyuncs.com/Phyduck/distributed-system/Raft.pdf) 69 | - [Gossip——流言蜚语实现最终一致性](https://smartkeyerror.oss-cn-shenzhen.aliyuncs.com/Phyduck/distributed-system/Gossip.pdf) 70 | 71 | --- 72 | 73 | ## :alembic: Middleware 74 | 75 | - [可靠消息中间件——RabbitMQ](https://smartkeyerror.oss-cn-shenzhen.aliyuncs.com/Phyduck/middleware/RabbitMQ.pdf) 76 | 77 | ------ 78 | 79 | ## :fire: Linux-Network-Programing 80 | 81 | - [信号](https://smartkeyerror.oss-cn-shenzhen.aliyuncs.com/Phyduck/linux-network/%E4%BF%A1%E5%8F%B7.pdf) 82 | - [信号集与信号掩码](https://smartkeyerror.oss-cn-shenzhen.aliyuncs.com/Phyduck/linux-network/%E4%BF%A1%E5%8F%B7%E9%9B%86%E4%B8%8E%E4%BF%A1%E5%8F%B7%E6%8E%A9%E7%A0%81.pdf) 83 | - [进程的创建](https://smartkeyerror.oss-cn-shenzhen.aliyuncs.com/Phyduck/linux-network/%E8%BF%9B%E7%A8%8B%E7%9A%84%E5%88%9B%E5%BB%BA.pdf) 84 | - [进程间通讯简介](https://smartkeyerror.oss-cn-shenzhen.aliyuncs.com/Phyduck/linux-network/%E8%BF%9B%E7%A8%8B%E9%97%B4%E9%80%9A%E8%AE%AF%E7%AE%80%E4%BB%8B.pdf) 85 | - [DAEMON](https://smartkeyerror.oss-cn-shenzhen.aliyuncs.com/Phyduck/linux-network/DAEMON.pdf) 86 | - [可靠数据传输协议——TCP](https://smartkeyerror.oss-cn-shenzhen.aliyuncs.com/Phyduck/linux-network/%E5%8F%AF%E9%9D%A0%E4%BC%A0%E8%BE%93%E5%8D%8F%E8%AE%AE%E2%80%94TCP.pdf) 87 | - [TCP 拥塞控制](https://smartkeyerror.oss-cn-shenzhen.aliyuncs.com/Phyduck/linux-network/TCP%E6%8B%A5%E5%A1%9E%E6%8E%A7%E5%88%B6.pdf) 88 | - [socket 编程问题一览(01)](https://smartkeyerror.oss-cn-shenzhen.aliyuncs.com/Phyduck/linux-network/socket%20%E7%BC%96%E7%A8%8B%E9%97%AE%E9%A2%98%E4%B8%80%E8%A7%88%2801%29.pdf) 89 | - [socket 编程问题一览(02)](https://smartkeyerror.oss-cn-shenzhen.aliyuncs.com/Phyduck/linux-network/socket%20%E7%BC%96%E7%A8%8B%E9%97%AE%E9%A2%98%E4%B8%80%E8%A7%88%2802%29.pdf) 90 | - [epoll 原理剖析](https://smartkeyerror.oss-cn-shenzhen.aliyuncs.com/Phyduck/linux-network/epoll%20%E5%8E%9F%E7%90%86%E5%89%96%E6%9E%90.pdf) 91 | - [epoll_event](https://smartkeyerror.oss-cn-shenzhen.aliyuncs.com/Phyduck/linux-network/epoll_event.pdf) 92 | - [HTTPS 握手过程](https://smartkeyerror.oss-cn-shenzhen.aliyuncs.com/Phyduck/linux-network/HTTPS.pdf) 93 | - [Nginx 基本进程模型与核心数据结构](https://smartkeyerror.oss-cn-shenzhen.aliyuncs.com/Phyduck/linux-network/nginx.pdf) 94 | 95 | ------ 96 | 97 | ## :zap: Operating System 98 | 99 | - [Linux 虚拟内存](https://smartkeyerror.oss-cn-shenzhen.aliyuncs.com/Phyduck/operating-system/Linux-Virtual-Memory.pdf) 100 | 101 | ------ 102 | 103 | ## :paw_prints: Golang 104 | 105 | - [channel 的设计与使用](https://smartkeyerror.oss-cn-shenzhen.aliyuncs.com/Phyduck/golang/channel.pdf) 106 | - [map 的设计与扩容时机](https://smartkeyerror.oss-cn-shenzhen.aliyuncs.com/Phyduck/golang/map.pdf) 107 | - [G-M-P 模型](https://smartkeyerror.oss-cn-shenzhen.aliyuncs.com/Phyduck/golang/G-M-P%E6%A8%A1%E5%9E%8B.pdf) 108 | - [三色标记-清除式 GC](https://smartkeyerror.oss-cn-shenzhen.aliyuncs.com/Phyduck/golang/GC.pdf) 109 | 110 | ------ 111 | 112 | ## :art: Kubernetes 113 | 114 | - [为什么需要 Pod?](https://smartkeyerror.oss-cn-shenzhen.aliyuncs.com/Phyduck/kubernetes/%E4%B8%BA%E4%BB%80%E4%B9%88%E9%9C%80%E8%A6%81%20Pod.pdf) 115 | - [声明式 API 是如何实现的?](https://smartkeyerror.oss-cn-shenzhen.aliyuncs.com/Phyduck/kubernetes/%E5%A3%B0%E6%98%8E%E5%BC%8F%20API%20%E6%98%AF%E5%A6%82%E4%BD%95%E5%AE%9E%E7%8E%B0%E7%9A%84.pdf) 116 | 117 | ------ 118 | 119 | ## :telescope: C++ 120 | 121 | #### common 122 | 123 | - [const](https://smartkeyerror.oss-cn-shenzhen.aliyuncs.com/Phyduck/c%2B%2B/common/1.%20const.pdf) 124 | 125 | #### 面向对象程序设计 126 | 127 | TODO 128 | 129 | #### 拷贝控制 130 | 131 | - [拷贝构造与拷贝赋值](https://smartkeyerror.oss-cn-shenzhen.aliyuncs.com/Phyduck/c%2B%2B/copy-control/1.%20%E6%8B%B7%E8%B4%9D%E6%9E%84%E9%80%A0%E4%B8%8E%E6%8B%B7%E8%B4%9D%E8%B5%8B%E5%80%BC.pdf) 132 | - [左值与右值](https://smartkeyerror.oss-cn-shenzhen.aliyuncs.com/Phyduck/c%2B%2B/copy-control/2.%20%E5%B7%A6%E5%80%BC%E4%B8%8E%E5%8F%B3%E5%80%BC.pdf) 133 | - [移动构造与移动赋值](https://smartkeyerror.oss-cn-shenzhen.aliyuncs.com/Phyduck/c%2B%2B/copy-control/3.%20%E7%A7%BB%E5%8A%A8%E6%9E%84%E9%80%A0%E4%B8%8E%E7%A7%BB%E5%8A%A8%E8%B5%8B%E5%80%BC.pdf) 134 | - [三/五法则](https://smartkeyerror.oss-cn-shenzhen.aliyuncs.com/Phyduck/c%2B%2B/copy-control/4.%20%E4%B8%89%E4%BA%94%E6%B3%95%E5%88%99.pdf) 135 | 136 | #### 模板与泛型编程 137 | 138 | - [Template 的基本使用](https://smartkeyerror.oss-cn-shenzhen.aliyuncs.com/Phyduck/c%2B%2B/template/1.%20Template.pdf) 139 | - [万能引用与类型推断问题](https://smartkeyerror.oss-cn-shenzhen.aliyuncs.com/Phyduck/c%2B%2B/template/2.%20%E4%B8%87%E8%83%BD%E5%BC%95%E7%94%A8%E4%B8%8E%E7%B1%BB%E5%9E%8B%E6%8E%A8%E6%96%AD%E9%97%AE%E9%A2%98.pdf) 140 | - [完美转发](https://smartkeyerror.oss-cn-shenzhen.aliyuncs.com/Phyduck/c%2B%2B/template/3.%20%E5%AE%8C%E7%BE%8E%E8%BD%AC%E5%8F%91.pdf) 141 | 142 | #### 类型相关 143 | 144 | - [强制类型转换](https://smartkeyerror.oss-cn-shenzhen.aliyuncs.com/Phyduck/c%2B%2B/type/1.%20%E5%BC%BA%E5%88%B6%E7%B1%BB%E5%9E%8B%E8%BD%AC%E6%8D%A2.pdf) 145 | - [自动类型推断(auto)](https://smartkeyerror.oss-cn-shenzhen.aliyuncs.com/Phyduck/c%2B%2B/type/2.%20%E8%87%AA%E5%8A%A8%E7%B1%BB%E5%9E%8B%E6%8E%A8%E6%96%AD%EF%BC%88auto%EF%BC%89.pdf) 146 | - [decltype](https://smartkeyerror.oss-cn-shenzhen.aliyuncs.com/Phyduck/c%2B%2B/type/3.%20decltype.pdf) 147 | 148 | #### 函数编程 149 | 150 | - [lambda 表达式](https://smartkeyerror.oss-cn-shenzhen.aliyuncs.com/Phyduck/c%2B%2B/functional/1.%20lambda%20%E8%A1%A8%E8%BE%BE%E5%BC%8F.pdf) 151 | - [可调用对象——std::function](https://smartkeyerror.oss-cn-shenzhen.aliyuncs.com/Phyduck/c%2B%2B/functional/2.%20%E5%8F%AF%E8%B0%83%E7%94%A8%E5%AF%B9%E8%B1%A1%20function.pdf) 152 | 153 | #### 智能指针 154 | 155 | - [堆、栈与 RAII: C++ 管理资源的方式](https://smartkeyerror.oss-cn-shenzhen.aliyuncs.com/Phyduck/c%2B%2B/smart-ptr/1.%20%E5%A0%86%E3%80%81%E6%A0%88%E4%B8%8E%20RAII%20%3A%20C%2B%2B%20%E7%AE%A1%E7%90%86%E8%B5%84%E6%BA%90%E7%9A%84%E6%96%B9%E5%BC%8F.pdf) 156 | - [RAII 与智能指针](https://smartkeyerror.oss-cn-shenzhen.aliyuncs.com/Phyduck/c%2B%2B/smart-ptr/2.%20RAII%E4%B8%8E%E6%99%BA%E8%83%BD%E6%8C%87%E9%92%88.pdf) 157 | - [shared_ptr](https://smartkeyerror.oss-cn-shenzhen.aliyuncs.com/Phyduck/c%2B%2B/smart-ptr/3.%20shared_ptr.pdf) 158 | 159 | #### 并发编程 160 | 161 | - [Linux 进程、线程与调度](https://smartkeyerror.oss-cn-shenzhen.aliyuncs.com/Phyduck/c%2B%2B/concurrent/1.%20Linux%20%E8%BF%9B%E7%A8%8B%E3%80%81%E7%BA%BF%E7%A8%8B%E4%B8%8E%E8%B0%83%E5%BA%A6.pdf) 162 | - [线程的创建与执行](https://smartkeyerror.oss-cn-shenzhen.aliyuncs.com/Phyduck/c%2B%2B/concurrent/2.%20%E7%BA%BF%E7%A8%8B%E7%9A%84%E5%88%9B%E5%BB%BA%E4%B8%8E%E6%89%A7%E8%A1%8C.pdf) 163 | - [std::async 与 std::future](https://smartkeyerror.oss-cn-shenzhen.aliyuncs.com/Phyduck/c%2B%2B/concurrent/3.%20async%E4%B8%8Efuture.pdf) 164 | - [互斥量与 std::lock_guard、std::unique_lock](https://smartkeyerror.oss-cn-shenzhen.aliyuncs.com/Phyduck/c%2B%2B/concurrent/4.%20%E4%BA%92%E6%96%A5%E9%87%8F%E3%80%81lock_guard%E4%B8%8Eunique_lock.pdf) 165 | - [通知状态的改变——POSIX 条件变量](https://smartkeyerror.oss-cn-shenzhen.aliyuncs.com/Phyduck/c%2B%2B/concurrent/5.%20%E9%80%9A%E7%9F%A5%E7%8A%B6%E6%80%81%E7%9A%84%E6%94%B9%E5%8F%98%E2%80%94POSIX%E6%9D%A1%E4%BB%B6%E5%8F%98%E9%87%8F.pdf) 166 | - [通知状态的改变——C++ 条件变量](https://smartkeyerror.oss-cn-shenzhen.aliyuncs.com/Phyduck/c%2B%2B/concurrent/6.%20%E9%80%9A%E7%9F%A5%E7%8A%B6%E6%80%81%E7%9A%84%E6%94%B9%E5%8F%98%E2%80%94C%2B%2B%E6%9D%A1%E4%BB%B6%E5%8F%98%E9%87%8F.pdf) 167 | - [POSIX 信号量](https://smartkeyerror.oss-cn-shenzhen.aliyuncs.com/Phyduck/c%2B%2B/concurrent/7.%20POSIX%20%E4%BF%A1%E5%8F%B7%E9%87%8F.pdf) 168 | 169 | #### 编译与链接 170 | 171 | - [编译与链接](https://smartkeyerror.oss-cn-shenzhen.aliyuncs.com/Phyduck/c%2B%2B/compile/1.%20%E7%BC%96%E8%AF%91%E4%B8%8E%E9%93%BE%E6%8E%A5.pdf) 172 | 173 | ------ 174 | 175 | -------------------------------------------------------------------------------- /base-questions/README.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | ## Network 4 | 5 | - [简述 TCP 三次握手以及四次挥手的流程。为什么需要三次握手以及四次挥手?](https://github.com/SmartKeyerror/Psyduck/blob/master/base-questions/network/TCP-Connect-And-Close.md) 6 | 7 | - [TCP 中 SYN 攻击是什么?如何防止?](https://github.com/SmartKeyerror/Psyduck/blob/master/base-questions/network/SYN-Flood.md) 8 | 9 | - [TCP 与 UDP 在网络协议中的哪一层,他们之间有什么区别?](https://github.com/SmartKeyerror/Psyduck/blob/master/base-questions/network/TCP-And-UDP.md) 10 | 11 | - [TCP 怎么保证可靠传输?](https://github.com/SmartKeyerror/Psyduck/blob/master/base-questions/network/TCP-Reliability.md) 12 | 13 | - [HTTP 与 HTTPS 有哪些区别?](https://github.com/SmartKeyerror/Psyduck/blob/master/base-questions/network/HTTP-And-HTTPS.md) 14 | 15 | - [简述 HTTPS 的加密与认证过程](https://github.com/SmartKeyerror/Psyduck/blob/master/base-questions/network/HTTP-And-HTTPS.md) 16 | 17 | - [简述对称与非对称加密的概念](https://github.com/SmartKeyerror/Psyduck/blob/master/base-questions/network/HTTP-And-HTTPS.md) 18 | 19 | - [从输入 URL 到展现页面的全过程](https://github.com/SmartKeyerror/Psyduck/blob/master/base-questions/network/Enter-URL-On-Browser.md) -------------------------------------------------------------------------------- /base-questions/images/1619766123992.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/base-questions/images/1619766123992.png -------------------------------------------------------------------------------- /base-questions/images/1619767874908.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/base-questions/images/1619767874908.png -------------------------------------------------------------------------------- /base-questions/images/1620475785744.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/base-questions/images/1620475785744.png -------------------------------------------------------------------------------- /base-questions/images/1620610060394.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/base-questions/images/1620610060394.png -------------------------------------------------------------------------------- /base-questions/images/1620785460173.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/base-questions/images/1620785460173.png -------------------------------------------------------------------------------- /base-questions/network/Enter-URL-On-Browser.md: -------------------------------------------------------------------------------- 1 | 2 | ## 从输入 URL 到展现页面的全过程 3 | 4 | ### 1. 域名解析(假设域名没有缓存) 5 | 6 | 1. 组织 UDP 数据包,源端口号为浏览器端口号,目的端口号为 53。向下传输至网络层,源 IP 地址为本机 IP 地址,目的 IP 地址为 DNS 服务器地址。继续向下传输至链路层,添加 MAC 头,若网关 MAC 地址位于缓存中,则直接获取。否则发送 ARP 包获取网关地址。得到网关地址后,数据包已完整,由网卡发出。 7 | 2. 数据包经由多个路由器到达 DNS 服务器后,DNS 服务器查询域名所对应的 IP 地址,可能查的到,也可能查不到。如果查到了,就把域名对应的 IP 地址放入到网络包内返回。若没有查找,则将当前 DNS 服务器的下层 DNS 服务器地址放回网络包中返回。 8 | 3. 客户端收到 DNS 的数据包以后,若得到的域名对应的 IP 地址则进行下一步。否则使用 DNS 服务器返回的下层 DNS 服务器 IP 地址,继续查询,直到查询到域名对应的 IP。或者根本没有这个域名,浏览器直接给出提示。 9 | 10 | ### 2. TCP 连接建立 11 | 12 | 1. 客户端向服务端发送带有 SYN 标志位以及一个随机的 Seq 序列号(X)的 TCP 数据包,目的端口号为 80,并将自己的 MSS大小、接收窗口大小(Win)一并放入数据包内,请求建立连接。 13 | 2. 服务端在收到客户端发来的 SYN 包以后,生成带有 SYN + ACK 标志的数据包,设置 Ack 确认号为 Seq + 1,并生成一个随机的 Seq 序列号(Y),与服务端 MSS大小、接收窗口大小(Win)一起添加至该数据包内,回送至客户端。 14 | 3. 客户端收到服务端发送的 SYN + ACK 数据包以后,需要回复确认包。即发送一个带有 ACK 标志位的数据包,此时 Seq 序列号为 X + 1,Ack 确认号为 Y + 1。连接已建立,开始正式传输 HTTP 数据。 15 | 16 | 17 | ### 3. 数据传输 18 | 19 | 浏览器将 URL 中的 URI、请求头等信息添加至 HTTP 数据包中,并设置请求方法为 GET,通过上面建立的 TCP 连接发出。服务端收到该数据包后进行处理,并返回浏览器所需要的数据。数据传输至浏览器以后,浏览器不断地从 TCP 缓冲区中读取数据,组成 response。 20 | 21 | ### 4. 数据渲染 22 | 23 | 浏览器根据 response 中的 HTML 文本内容开始进行渲染,并请求嵌入至 HTML 的相关资源,如 CSS、JS、图片、视频或者是音频等。 24 | -------------------------------------------------------------------------------- /base-questions/network/HTTP-And-HTTPS.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | ## HTTP 与 HTTPS 有哪些区别? 4 | 5 | 1. 监听端口不同,HTTP 监听 80 端口,HTTPS 监听 443 端口。 6 | 2. HTTP 使用明文传输,在传输用户数据、支付数据等敏感信息时很容易被窃取。HTTPS 则是建立在 SSL/TSL 之上的安全 HTTP 协议,通信数据均使用非对称加密/对称加密算法进行加密,数据在网络上传输更安全。 7 | 3. 因为 HTTPS 需要对数据进行加密、解密,所以其实际运行效率要低于 HTTP 协议本身。并且 HTTPS 除了标准的 TCP 三次握手以外,还需要额外的四次 TLS 握手,建立连接需要花费更多时间。 8 | 9 | 10 | ### 对称加密与非对称加密 11 | 12 | 在对称加密中,加密和解密的密钥是相同的。也就是说,使⽤“⼩鸡炖蘑菇”这句话既可以对信息进⾏加密,也可以⽤来解密加密后的字符串。因此,在使⽤对称加密时,密钥⼀定不能被别⼈知道。 13 | 14 | 在非对称加密中,加密和解密的密钥是不相同的。**公钥加密的信息,只有私钥才能解开。私钥加密的信息,只有公钥才能解开。** 15 | 16 | 因为对称加密的过程要比非对称加密的过程简单,所以效率要高的多,性能也好,因此在交互场所通常使用对称加密。在少量信息传输场景中可使用非对称加密来保证身份的准确性。例如在 Github 中我们上传自己的公钥,并在本地保留私钥,双方进行短暂的数据交换。 17 | 18 | 19 | ### TLS 握手过程 20 | 21 | 1. 客户端向服务端发送 Client Hello,并将自身支持的 TLS/SSL 协议版本号、支持的加密算法以及生成的随机字数 `clientRandNum` 一起发送给服务端。 22 | 2. 服务端在收到 Client Hello 以后,向客户端发送 Server Hello,并携带**特定**的协议版本、加密算法以及服务端生成的随机数 `serverRandNum`、数字证书发送给客户端。 23 | 3. 客户端收到 Server Hello 数据包以后,首先验证证书的有效性。例如证书是否过期、域名是否正确、证书拥有者是否正确等等,并且还会使用预装的 CA 公钥去解密证书中包含的签名(Signature),并与证书中的哈希摘要进行比对。验证成功后则再次生成一个随机字符串 `pre-master`, 即 Pre Master Secret,预主密钥,通过公钥进行加密,发送给服务端。服务端使用自己的私钥对其进行解密。 24 | 4. 而后,客户端与服务端使用前面的 `clientRandNum`,`serverRandNum` 以及 `pre-master` 这三个随机数生成对称加密密钥,后续所有的数据交互均使用该密钥进行对称加密通信。 25 | 26 | ![Alt text](../images/1620610060394.png) -------------------------------------------------------------------------------- /base-questions/network/SYN-Flood.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | ## TCP 中 SYN 攻击是什么?如何防止? 4 | 5 | SYN Flood 攻击是指利用了 TCP 协议的漏洞,攻击者操控多台傀儡机在短时间内向服务器发送海量伪造的带有 SYN 标志位的数据包,从而造成服务端状态为 `SYN_RECV` 的队列溢出,导致无法正常处理其它正常网络请求的一种 DoS 攻击。 6 | 7 | ![Alt text](../images/1619766123992.png) 8 | 9 | 在正常情况下,当服务端收到客户端发来的 SYN 数据包以后,会将 socket 状态更新为 `SYN_RECV` 并保存在监听队列的未完成连接队列中,并向客户端回送 SYN+ACK 数据包,而后客户端向服务端发送 ACK 确认包,服务端收到该确认包以后,socket 状态由 `SYN_RECV` 更新至 `ESTABLISHED`,表示 TCP 连接已建立,并将该 socket 从未完成连接队列中移入至已完成连接队列中,等待应用程序调用 `accept()` 取出。 10 | 11 | 当服务端遭受 SYN Flood 攻击时,完成连接队列很有可能会溢出,导致服务端无法再处理其它请求。所以这种攻击也被称之为 Dos 攻击,即 Denial Of Service Attack,拒绝服务攻击,使服务器拒绝向正常用户提供服务。 12 | 13 | ### SYN Flood 攻击防治方法 14 | 15 | 1. 启用 SYN Cookie 16 | 17 | 当我们将内核的 `net.ipv4.tcp_syncookies` 设置为 1 时,表示启用 SYN Cookie。此时当服务端收到 SYN 数据包以后,不再将该 socket 保存在未完成连接队列中,并且使用基于时间种子的随机方式进行生成 Seq 序列号,服务端将带有该 Seq 以及 SYN+ACK 的 TCP 数据包回送给客户端。服务端在收到 ACK 确认包以后,会使用 Cookie 检验算法来鉴定 Ack 确认号与发送的 Seq 序列号是否匹配,鉴定通过则完成握手,并将连接放置于已完成连接队列中,失败则直接丢弃。 18 | 19 | 2. 调整 SYN 最大队列长度 20 | 21 | 也可以通过设置 `net.ipv4.tcp_max_syn_backlog` 来将未完成连接队列的容量增大,使得半连接队列不会那么快的溢出。 22 | 23 | 3. 减少 SYN+ACK 的最大重试次数 24 | 25 | 傀儡机有时根本就不会去响应服务端发送的 SYN+ACK 数据包,那么服务端因为迟迟没有收到客户端发来的 ACK 确认包,会不断地重新发送 SYN+ACK 数据包,系统默认为 5 次。我们可以通过设置 `net.ipv4.tcp_synack_retries` 来调整最大重试次数,比如将其降为 2 或者是 3。 26 | 27 | 4. 使用 `iptables` 对数据包进行过滤 28 | 29 | 可以使用 `iptables` 来限制单个 IP 的最大并发数,单个地址的最大连接数,以及单位时间内的连接数。 30 | 31 | 5. 使用代理服务器进行拦截 32 | 33 | 一种分工的策略,代理服务器专门进行 DDos 的防护,使后方服务器能够专注于自身的业务,而无需对硬件或内核进行特殊配置。 34 | 35 | ![Alt text](../images/1620785460173.png) 36 | 37 | 以 Google Cloud Armor 为例,当用户向服务器发起 SYN 请求时,流量并不会直接进入到服务器,而是首先进入云平台的边缘节点,进行负载均衡、黑/白名单过滤,也就是说,这些边缘节点就像护城河一样为整座城提供防护功能。这样一来,开发人员可专注于实现自己的功能上面,而不需要再去担心网络防护问题。 -------------------------------------------------------------------------------- /base-questions/network/TCP-And-UDP.md: -------------------------------------------------------------------------------- 1 | 2 | ## TCP 与 UDP 在网络协议中的哪一层,他们之间有什么区别? 3 | 4 | TCP 和 UDP 均在传输层。 5 | 6 | ### TCP 和 UDP 之间的区别 7 | 8 | 1. TCP 是面向连接协议,而 UDP 则是无连接协议。也就是说,在使用 TCP 发送数据时需要首先经过三次握手建立连接,服务端与客户端交换序列号、MSS 大小以及接收窗口大小等信息。 9 | 2. TCP 是可靠连接协议,协议实现保证数据包在丢失后进行重传,保证数据传输的可靠性。而 UDP 则不对此进行保证,可能会发生数据丢失的情况。 10 | 3. TCP 为字节流协议,数据以流的方式进行传输,客户端和服务端需要制定数据包格式。UDP 则是数据报协议,发送一个,接收一个,只有接收缓冲区, 没有发送缓冲区。 11 | 4. UDP 可用于广播,TCP 只能进行双节点间通信。 -------------------------------------------------------------------------------- /base-questions/network/TCP-Connect-And-Close.md: -------------------------------------------------------------------------------- 1 | ## 简述 TCP 三次握手以及四次挥手的流程。为什么需要三次握手以及四次挥手? 2 | 3 | ### 三次握手 4 | 5 | > 关键点: 双方交换 Seq、MSS 以及 Win 等信息,Server 使用两个队列存储半连接和全连接 6 | 7 | 1. 客户端向服务端发送带有 SYN 标志位以及一个随机的 Seq 序列号(X)的 TCP 数据包,并将自己的 MSS大小、接收窗口大小(Win)一并放入数据包内,请求建立连接(SYN 的含义其实就是 Synchronize,表示同步)。当发送完 SYN 包以后,客户端的 socket 状态由 `CLOSED` 转变为 `SYN_SENT`。 8 | 2. 服务端在收到客户端发来的 SYN 包以后,生成带有 SYN + ACK 标志的数据包,设置 Ack 确认号为 Seq + 1,并生成一个随机的 Seq 序列号(Y),与服务端 MSS大小、接收窗口大小(Win)一起添加至该数据包内,回送至客户端。当发送完 SYN + ACK 标志的 TCP 数据包以后,服务端 scoket 状态由 `LISTEEN` 转换为 `SYN_RECV`。 9 | 3. 客户端收到服务端发送的 SYN + ACK 数据包以后,需要回复确认包。即发送一个带有 ACK 标志位的数据包,此时 Seq 序列号为 X + 1,Ack 确认号为 Y + 1,客户端 socket 状态由 `SYN_SENT` 更新为 `ESTABLISHED`,对于客户端而言,TCP 连接已建立。当服务端收该确认包以后,socket 状态由 `SYN_RECV` 更新为 `ESTABLISHED`,表示连接已建立。 10 | 11 | ![Alt text](../images/1619766123992.png) 12 | 13 | 14 | 对于服务端而言,状态为 `SYN_RECV` 的 TCP 连接通常称为“半连接”,保存在监听队列中的未完成连接队列中。当收到了客户端的 ACK 确认包以后,状态更新至 `ESTABLISHED`,将连接从未完成连接队列中移动至已完成连接队列。`accept()` 函数中的 `backlog` 参数即为已完成连接队列的最大长度。 15 | 16 | 17 | 三次握手的意义: 18 | 19 | 1. 客户端与服务端确认双方可达,并且能够使用 TCP 协议传输消息。 20 | 2. 交换双方的 MSS、Win 大小,为 TCP 拥塞控制提供基础数据,尽最大可能地确保数据包不会丢失。 21 | 22 | ### 四次挥手 23 | 24 | > 关键点: 双方都要有关闭连接的意向,就跟分手似的。一个人说分手,另一个人得问清楚为什么,还得花时间消化这个消息,然后才能说分手。TIME_WAIT 和 CLOSE_WAIT 两个状态比较关键 25 | 26 | 1. 客户端(通常)准备关闭 TCP 连接,向服务端发送带有 FIN 标志位的数据包,状态由 `ESTABLISHED` 更新至 `FIN_WAIT1`。 27 | 2. 服务端收到 FIN 包以后,回复 Ack 确认包,状态由 `EATALISHED` 更新为 `CLOSE_WAIT`,应用程序此时仍然可以发送数据给客户端,并进行清理工作。客户端在收到 ACK 确认包以后,状态由 `FIN_WAIT1` 更新为 `FIN_WAIT2`。 28 | 3. 内核等待应用程序调用 `close(fd)` 关闭套接字,当应用程序关闭套接字以后,内核发送带有 FIN 标志位的数据包给客户端,表示服务端关闭连接。状态由 `CLOSE_WAIT` 更新至 `LAST_ACK`,表示等待客户端的最后一个 ACK 确认包。 29 | 4. 客户端收到 FIN 包以后,回送 ACK 确认包,状态由 `FIN_WAIT2`更新至 `TIME_WAIT`,等待 2MSL 后完全关闭该 socket。服务端收到 ACK 确认包以后,完全关闭 socket。 30 | 31 | 32 | ![Alt text](../images/1619767874908.png) 33 | 34 | 35 | 四次挥手的意义: 36 | 37 | 1. 确保 TCP 连接完全拆除,客户端与服务端各发送一次连接关闭请求与连接关闭确认包。 38 | 2. 当服务端收到 FIN 包时,可能仍有数据未发送完毕,需要继续发送,所以此时只能回送一个 ACK 确认包。等到所有数据均发送完毕,服务端没有其它动作需要执行了,主动调 `close(fd)` 方法关闭 socket,服务端发送 FIN 包。也就是说,第二次挥手和第三次挥手不能合并。 -------------------------------------------------------------------------------- /base-questions/network/TCP-Reliability.md: -------------------------------------------------------------------------------- 1 | ## TCP 怎么保证可靠传输? 2 | 3 | 首先我们来看 TCP 数据包的结构: 4 | 5 | ![Alt text](../images/1620475785744.png) 6 | 7 | 其中序列号(Seq),确认号(Ack),ACK 标志以及接收窗口都是用来实现 TCP 可靠传输的组成之一。 8 | 9 | 1. **序列号保证数据传输的有序性**。TCP 协议会为每一个发出的数据包进行编号,这个编号就是序列号 Seq,Seq 的增长规则为 `Seq = Seq + 数据字节长度`。当网络出现抖动或者延迟导致 TCP 数据包乱序到达服务端时,服务端会根据 Seq 的大小进行排序,保证数据的连续性。 10 | 2. **确认号 Ack + 标志位 ACK 保证对方已收到 Ack 之前的所有数据包**。当接收方收到了 Seq 为 X 的数据包,并且 X 之前的所有数据包均已收到后,接收方将回送 ACK 确认号,以告知对方数据已收到。如果某些数据包丢失,TCP 会根据 Seq 号感知到,此时也会通过 Ack 确认号让对方重新发送该数据包。 11 | 3. **超时重传和快速重传保证数据包的重发**。当出现数据包丢失时,接收方可根据实际情况触发超时重传或者时快速重传,以确保数据包的连续性与准确性。超时重传是指当发送方迟迟没有收到接收方的 Ack 包时,达到超时时间后重传该序列号的数据包。快速重传则是指当发送方发送超过 3 个数据包,并且其中一个数据包丢失时,接收方就会因为数据包的缺失而向发送方发送该缺失数据包的 Ack。达到 3 个同样的 Ack 数据包以后,发送方就会意识到有数据包丢失,并重传此包。 12 | 4. **拥塞控制算法保证稳定的数据传输**。拥塞控制主要是通过接收缓冲区与接收窗口,发送缓冲区与发送窗口,以及快速重传和超时重传所实现的。在 TCP 三次握手时,双方交换了 MSS 和 Win 大小,发送数据方将选择这两个值中的较小值作为最大数据传输单元,保证数据包不会被网络直接丢弃。拥塞控制过程分为慢启动和拥塞避免阶段,发送窗口在慢启动阶段较快速增长,在拥塞避免阶段慢速增长。 13 | 14 | 可参考: 15 | 16 | > [可靠传输协议—TCP](https://smartkeyerror.oss-cn-shenzhen.aliyuncs.com/Phyduck/linux-network/%E5%8F%AF%E9%9D%A0%E4%BC%A0%E8%BE%93%E5%8D%8F%E8%AE%AE%E2%80%94TCP.pdf) 17 | 18 | > [TCP拥塞控制](https://smartkeyerror.oss-cn-shenzhen.aliyuncs.com/Phyduck/linux-network/TCP%E6%8B%A5%E5%A1%9E%E6%8E%A7%E5%88%B6.pdf) -------------------------------------------------------------------------------- /database/InnoDB Group Commit.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/database/InnoDB Group Commit.pdf -------------------------------------------------------------------------------- /database/InnoDB Group Commit.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/database/InnoDB Group Commit.xmind -------------------------------------------------------------------------------- /database/InnoDB-Page.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/database/InnoDB-Page.pdf -------------------------------------------------------------------------------- /database/InnoDB-Page.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/database/InnoDB-Page.xmind -------------------------------------------------------------------------------- /database/InnoDB-WAL.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/database/InnoDB-WAL.pdf -------------------------------------------------------------------------------- /database/InnoDB-WAL.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/database/InnoDB-WAL.xmind -------------------------------------------------------------------------------- /database/InnoDB-undo-log与MVCC.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/database/InnoDB-undo-log与MVCC.pdf -------------------------------------------------------------------------------- /database/InnoDB-undo-log与MVCC.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/database/InnoDB-undo-log与MVCC.xmind -------------------------------------------------------------------------------- /database/MySQL Cost Based Optimizer.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/database/MySQL Cost Based Optimizer.pdf -------------------------------------------------------------------------------- /database/MySQL Cost Based Optimizer.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/database/MySQL Cost Based Optimizer.xmind -------------------------------------------------------------------------------- /database/MySQL JOIN 工作原理浅析.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/database/MySQL JOIN 工作原理浅析.pdf -------------------------------------------------------------------------------- /database/MySQL JOIN 工作原理浅析.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/database/MySQL JOIN 工作原理浅析.xmind -------------------------------------------------------------------------------- /database/Redis 主从复制.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/database/Redis 主从复制.pdf -------------------------------------------------------------------------------- /database/Redis 主从复制.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/database/Redis 主从复制.xmind -------------------------------------------------------------------------------- /database/Redis数据结构.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/database/Redis数据结构.pdf -------------------------------------------------------------------------------- /database/Redis数据结构.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/database/Redis数据结构.xmind -------------------------------------------------------------------------------- /database/etcd概述.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/database/etcd概述.pdf -------------------------------------------------------------------------------- /database/etcd概述.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/database/etcd概述.xmind -------------------------------------------------------------------------------- /database/为什么MySQL使用B+Tree.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/database/为什么MySQL使用B+Tree.pdf -------------------------------------------------------------------------------- /database/为什么MySQL使用B+Tree.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/database/为什么MySQL使用B+Tree.xmind -------------------------------------------------------------------------------- /database/主键的选择.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/database/主键的选择.pdf -------------------------------------------------------------------------------- /database/主键的选择.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/database/主键的选择.xmind -------------------------------------------------------------------------------- /database/全局锁、表级锁以及行锁(上).pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/database/全局锁、表级锁以及行锁(上).pdf -------------------------------------------------------------------------------- /database/全局锁、表级锁以及行锁(上).xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/database/全局锁、表级锁以及行锁(上).xmind -------------------------------------------------------------------------------- /database/全局锁、表级锁以及行锁(下).pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/database/全局锁、表级锁以及行锁(下).pdf -------------------------------------------------------------------------------- /database/全局锁、表级锁以及行锁(下).xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/database/全局锁、表级锁以及行锁(下).xmind -------------------------------------------------------------------------------- /database/全局锁、表级锁以及行锁(中).pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/database/全局锁、表级锁以及行锁(中).pdf -------------------------------------------------------------------------------- /database/全局锁、表级锁以及行锁(中).xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/database/全局锁、表级锁以及行锁(中).xmind -------------------------------------------------------------------------------- /database/深入浅出 InnoDB Index.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/database/深入浅出 InnoDB Index.pdf -------------------------------------------------------------------------------- /database/深入浅出 InnoDB Index.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/database/深入浅出 InnoDB Index.xmind -------------------------------------------------------------------------------- /database/缓存更新的策略.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/database/缓存更新的策略.pdf -------------------------------------------------------------------------------- /database/缓存的更新策略.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/database/缓存的更新策略.xmind -------------------------------------------------------------------------------- /deliberate/01. smart_ptr/main.cpp: -------------------------------------------------------------------------------- 1 | #include "smart_ptr.hpp" 2 | 3 | #include 4 | 5 | using namespace std; 6 | 7 | 8 | class Base { 9 | public: 10 | Base() = default; 11 | virtual ~Base() {} 12 | 13 | virtual void foo() { 14 | cout << "Base foo" << endl; 15 | } 16 | }; 17 | 18 | 19 | 20 | class Dirived : public Base { 21 | public: 22 | Dirived() = default; 23 | void foo() { 24 | cout << "Dirived foo" < ptr {new int(1024)}; 32 | 33 | smart_ptr gtr = ptr; 34 | 35 | cout << "ptr's ref count: " << ptr.use_count() << ", "; 36 | cout << "gtr's ref count: " << gtr.use_count() << endl; 37 | 38 | smart_ptr etr; 39 | cout << "etr's ref count: " << etr.use_count() << endl; 40 | 41 | etr = gtr; 42 | 43 | cout << "ptr's ref count: " << ptr.use_count() << ", "; 44 | cout << "etr's ref count: " << etr.use_count() << endl; 45 | 46 | /* ----------------------------------------------------- */ 47 | 48 | /* 49 | * 若只是单纯的使用类型参数 T 的话,下方的代码将无法执行 50 | * 因为无法将 smart_ptr 转换成 smart_ptr。因此,我们需要一个额外的模板参数来帮我们做这件事情 51 | * 52 | * template 53 | * smart_ptr(const smart_ptr& other); 54 | * 55 | * 但是,类模板的不同实例之间是不能直接访问其私有成员的,所以我们得把它变成友元 56 | * 57 | * template 58 | * friend class smart_ptr 59 | */ 60 | smart_ptr derived {new Dirived()}; 61 | smart_ptr another = derived; 62 | another->foo(); // Dirived foo, 多态性保留了下来 63 | 64 | } -------------------------------------------------------------------------------- /deliberate/01. smart_ptr/smart_ptr.hpp: -------------------------------------------------------------------------------- 1 | #ifndef __SMART_PTR_H_ 2 | #define __SMART_PTR_H_ 3 | 4 | #include 5 | #include 6 | 7 | 8 | class ref_count { 9 | private: 10 | // m_count 的自增和自减需要线程安全,故使用 atomic 11 | std::atomic m_count; 12 | public: 13 | ref_count() : m_count(1) {} 14 | 15 | void increase_count() {m_count++;} 16 | 17 | long long decrease_count() {return --m_count;} 18 | 19 | long long get_count() const {return m_count;} 20 | }; 21 | 22 | 23 | 24 | template 25 | class smart_ptr { 26 | private: 27 | T *_ptr; 28 | ref_count *_ref_count; 29 | public: 30 | 31 | template 32 | friend class smart_ptr; 33 | 34 | // 必须显式初始化,不允许进行隐式地类型转换 35 | explicit smart_ptr(T *ptr = nullptr) : _ptr(ptr) { 36 | if (ptr) { 37 | _ref_count = new ref_count(); 38 | } 39 | } 40 | 41 | ~smart_ptr() { 42 | if (_ptr && _ref_count->decrease_count() == 0) { 43 | delete _ptr; 44 | delete _ref_count; 45 | } 46 | } 47 | 48 | // 拷贝构造函数 49 | smart_ptr(const smart_ptr& other) { 50 | _ptr = other._ptr; 51 | if (_ptr) { 52 | other._ref_count->increase_count(); 53 | _ref_count = other._ref_count; 54 | } 55 | } 56 | 57 | /* 58 | * 用于子类指针向基类指针转换的情况 59 | */ 60 | template 61 | smart_ptr(const smart_ptr& other) { 62 | _ptr = other._ptr; 63 | if (_ptr) { 64 | other._ref_count->increase_count(); 65 | _ref_count = other._ref_count; 66 | } 67 | } 68 | 69 | // 移动构造函数 70 | template 71 | smart_ptr(smart_ptr&& other) noexcept { 72 | _ptr = other._ptr; 73 | if (_ptr) { 74 | _ref_count = other._ref_count; 75 | other._ptr = nullptr; 76 | } 77 | } 78 | 79 | // 拷贝赋值函数 80 | smart_ptr &operator= (const smart_ptr& rhs) { 81 | smart_ptr temp = smart_ptr{rhs}; 82 | swap(temp); 83 | return *this; 84 | } 85 | 86 | 87 | T *get_ptr() const {return _ptr;} 88 | 89 | long long use_count() const { 90 | return _ptr ? _ref_count->get_count() : 0; 91 | } 92 | 93 | T *operator->() const {return _ptr;} 94 | T &operator*() const {return *_ptr;} 95 | operator bool() const {return _ptr;} 96 | 97 | void swap(smart_ptr& other) { 98 | using std::swap; 99 | swap(_ptr, other._ptr); 100 | swap(_ref_count, other._ref_count); 101 | } 102 | 103 | }; 104 | 105 | #endif -------------------------------------------------------------------------------- /deliberate/02. blocking_queue/blocking_queue.hpp: -------------------------------------------------------------------------------- 1 | 2 | // 玩具级别的阻塞队列,condition_variable 的一个简单用例 3 | 4 | #ifndef __BLOCKING_QUEUE_H_ 5 | #define __BLOCKING_QUEUE_H_ 6 | 7 | #include 8 | #include 9 | #include 10 | 11 | template 12 | class blocking_queue { 13 | private: 14 | size_t m_capacity; 15 | std::queue m_queue; 16 | 17 | std::mutex m_mutex; 18 | std::condition_variable m_not_empty; 19 | std::condition_variable m_not_full; 20 | public: 21 | explicit blocking_queue(int capacity = 2) : m_capacity(capacity) {} 22 | 23 | void push(const T& item) { 24 | std::unique_lock lock_guard{m_mutex}; 25 | 26 | m_not_full.wait(lock_guard, [this] { 27 | return this->m_queue.size() != this->m_capacity; 28 | }); 29 | 30 | m_queue.push(item); 31 | 32 | m_not_empty.notify_one(); 33 | } 34 | 35 | T &pop() { 36 | std::unique_lock lock_guard{m_mutex}; 37 | 38 | m_not_empty.wait(lock_guard, [this] { 39 | return this->m_queue.size() != 0; 40 | }); 41 | 42 | T &item = m_queue.front(); 43 | m_queue.pop(); 44 | 45 | m_not_full.notify_one(); 46 | 47 | return item; 48 | } 49 | }; 50 | 51 | #endif -------------------------------------------------------------------------------- /deliberate/02. blocking_queue/main.cpp: -------------------------------------------------------------------------------- 1 | #include "blocking_queue.hpp" 2 | 3 | #include 4 | #include 5 | 6 | using namespace std; 7 | 8 | 9 | void producer(blocking_queue& queue) { 10 | for (int i = 0; i < 10; i++) { 11 | queue.push(i); 12 | cout << "生产数据完毕: " << i << endl; 13 | } 14 | } 15 | 16 | void consumer(blocking_queue& queue) { 17 | for (int i = 0; i < 10; i++) { 18 | int res = queue.pop(); 19 | cout << "开始消费数据: " << res << endl; 20 | std::this_thread::sleep_for(1s); 21 | } 22 | } 23 | 24 | int main() { 25 | blocking_queue queue; 26 | 27 | thread t1 {producer, std::ref(queue)}; 28 | thread t2 {consumer, std::ref(queue)}; 29 | 30 | t1.join(); 31 | t2.join(); 32 | 33 | cout << "Task Done" << endl; 34 | } 35 | -------------------------------------------------------------------------------- /deliberate/03. signal_process/main.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | 6 | 7 | void signal_handler(int sig) { 8 | // errno 虽然是线程安全的,但是内核在调用信号处理函数时,并不会帮我们恢复 errno 的值 9 | // 因此我们需要用一个临时变量来保存进入信号处理函数时的 errno,处理结束后再进行恢复 10 | int prev = errno; 11 | 12 | sigset_t current; 13 | sigprocmask(SIG_BLOCK, NULL, ¤t); // 获取当前进程信号掩码 14 | 15 | // 当我们因为收到某一个信号而进入信号处理函数时,该信号会被默认的添加至当前进程信号掩码中, 16 | // 防止出现递归打断信号处理函数执行的情况 17 | if (sigismember(¤t, sig)) { 18 | 19 | // printf() 为不可重入函数,但是 read/write 以及 recv/send 等方法为可重入函数 20 | // printf, fread、fwrite 等带有用户 I/O 缓冲区的标准库函数为不可重入函数,应避免使用 21 | 22 | char msg[] = "SIGINT 已被添加至进程信号掩码集中\n"; 23 | write(STDOUT_FILENO, msg, sizeof(msg)); 24 | } 25 | 26 | errno = prev; 27 | } 28 | 29 | int main() { 30 | sigset_t set; 31 | sigemptyset(&set); 32 | 33 | struct sigaction action = { 34 | signal_handler, 35 | set, 36 | SA_RESTART 37 | }; 38 | 39 | if (sigaction(SIGINT, &action, NULL) == -1) { // 为 SIGINT 注册信号处理函数 40 | perror("SIGINT 信号处理函数注册失败"); 41 | return 1; 42 | } 43 | 44 | while (1) { 45 | printf("main function \n"); 46 | int remain = sleep(5); 47 | 48 | if (remain) { // sleep 可以被打断,并且不会重新睡眠,而是返回剩余的睡眠时间 49 | printf("sleep 被打断,还剩 %d 秒睡眠时间 \n", remain); 50 | break; 51 | } 52 | } 53 | return 0; 54 | } 55 | -------------------------------------------------------------------------------- /go-concurrency/channel/alternately_print_test.go: -------------------------------------------------------------------------------- 1 | package channel 2 | 3 | import ( 4 | "fmt" 5 | "testing" 6 | "time" 7 | ) 8 | 9 | // 有四个 goroutine,编号为 1、2、3、4。 10 | // 每秒钟会有一个 goroutine 打印出它自己的编号,要求你编写一个程序, 11 | // 让输出的编号总是按照 1、2、3、4、1、2、3、4、……的顺序打印出来。 12 | 13 | func AlternatelyPrint() { 14 | ch1 := make(chan bool) 15 | ch2 := make(chan bool) 16 | ch3 := make(chan bool) 17 | ch4 := make(chan bool) 18 | 19 | go func() { 20 | for { 21 | fmt.Println("Goroutine 1") 22 | time.Sleep(time.Second) 23 | ch2 <- true 24 | <-ch1 25 | } 26 | }() 27 | 28 | go func() { 29 | for { 30 | <-ch2 31 | fmt.Println("Goroutine 2") 32 | time.Sleep(time.Second) 33 | ch3 <- true 34 | } 35 | }() 36 | 37 | go func() { 38 | for { 39 | <-ch3 40 | fmt.Println("Goroutine 3") 41 | time.Sleep(time.Second) 42 | ch4 <- true 43 | } 44 | }() 45 | 46 | go func() { 47 | for { 48 | <-ch4 49 | fmt.Println("Goroutine 4") 50 | time.Sleep(time.Second) 51 | ch1 <- true 52 | } 53 | }() 54 | 55 | select {} 56 | } 57 | 58 | // 另一种实现方式 59 | func AlternatelyPrint2() { 60 | ch := make(chan struct{}) 61 | 62 | for i := 1; i < 5; i++ { 63 | go func(index int) { 64 | time.Sleep(time.Duration(index) * time.Millisecond) 65 | for { 66 | <-ch 67 | fmt.Printf("Goroutine %d \n", index) 68 | time.Sleep(time.Second) 69 | ch <- struct{}{} 70 | } 71 | }(i) 72 | } 73 | 74 | ch <- struct{}{} 75 | select {} 76 | } 77 | 78 | type Token struct{} 79 | 80 | // 第三种方式,其实就是把第一种方式抽象了出来 81 | func AlternatelyPrint3(total int) { 82 | 83 | // 初始化一堆 channel,用于多个 Goroutine 间通信 84 | channels := make([]chan Token, total) 85 | for i := 0; i < total; i++ { 86 | channels[i] = make(chan Token) 87 | } 88 | 89 | for i := 0; i < total; i++ { 90 | go func(index int, current chan Token, nextChan chan Token) { 91 | for { 92 | <-current 93 | fmt.Printf("Goroutine %d \n", index) 94 | time.Sleep(time.Second) 95 | nextChan <- Token{} 96 | } 97 | }(i+1, channels[i], channels[(i+1)%total]) 98 | } 99 | channels[0] <- Token{} 100 | select {} 101 | } 102 | 103 | func TestAlternatelyPrint(t *testing.T) { 104 | //AlternatelyPrint() 105 | //AlternatelyPrint2() 106 | AlternatelyPrint3(4) 107 | } 108 | -------------------------------------------------------------------------------- /go-concurrency/channel/goroutine_leak_test.go: -------------------------------------------------------------------------------- 1 | package channel 2 | 3 | import ( 4 | "fmt" 5 | "testing" 6 | "time" 7 | ) 8 | 9 | // 这段代码的问题就在于,使用了一个 unbuffered channel, 10 | // unbuffered channel 只有在 receiver 和 sender 都准备好的时候才不会发生阻塞。 11 | // 当任务执行时间超过 2s 时,定时器到期后直接退出 select {} 多路复用, 12 | // 我们就再也不可能接收到 ch 中的数据了。也就是说,执行耗时任务的那个 goroutine 永远都不会退出 13 | func TestGoroutineLeak(t *testing.T) { 14 | ch := make(chan struct{}) 15 | 16 | go func() { 17 | // 模拟耗时任务 18 | time.Sleep(5 * time.Second) 19 | // 任务执行完毕后向外发出通知 20 | ch <- struct{}{} 21 | }() 22 | 23 | select { 24 | case <-ch: 25 | fmt.Println("Task Done") 26 | case <-time.After(2 * time.Second): 27 | fmt.Println("Time Limit Exceeded") 28 | } 29 | } 30 | 31 | // 这里有一个关于 GC 的问题,假如下面儿的 ch 中装的堆变量,那么当函数运行结束后,ch 会被 GC 回收掉吗? 32 | // channel 源码: https://github.com/golang/go/blob/2ebe77a2fda1ee9ff6fd9a3e08933ad1ebaea039/src/runtime/chan.go#L355 33 | // 一个比较有意思的地方在于,channel 的 close 方法并没有去清理环形队列 buf 中的内容,仅仅只是清理了两个阻塞队列中的内容, 34 | // 这和 channel 的行为是一致的: 当我们关闭了一个 channel 以后,receiver 仍然可以继续读取 channel 中的内容,直到没有任何数据 35 | // 如果 buf 中有内容的 ch 可以被回收,那么是什么时候被 GC 的呢? GC 又是通过什么条件去判断 channel 可以被回收的呢? 36 | func TestTimeOutFunction(t *testing.T) { 37 | ch := make(chan struct{}, 1) 38 | 39 | go func() { 40 | // 模拟耗时任务 41 | time.Sleep(5 * time.Second) 42 | // 任务执行完毕后向外发出通知 43 | ch <- struct{}{} 44 | }() 45 | 46 | select { 47 | case <-ch: 48 | fmt.Println("Task Done") 49 | case <-time.After(2 * time.Second): 50 | fmt.Println("Time Limit Exceeded") 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /go-concurrency/go.mod: -------------------------------------------------------------------------------- 1 | module Psyduck/go-concurrency 2 | 3 | go 1.15 4 | -------------------------------------------------------------------------------- /go-concurrency/memory/memory_reordering_test.go: -------------------------------------------------------------------------------- 1 | package memory 2 | 3 | import ( 4 | "fmt" 5 | "testing" 6 | ) 7 | 8 | type Message struct { 9 | Msg string 10 | } 11 | 12 | var msg *Message 13 | var Done bool 14 | 15 | // 指令重排是指写在程序中的两条语句在 CPU 执行时可能会出现,执行顺序与编写顺序不一致的情况。 16 | // 也就是说,可能会出现 Done 被赋值成为 true 之后,才会去执行 msg = new(Message) 这两条指令 17 | // 那么在 TestMemoryReordering 执行时,很有可能出现跳出了无限循环,但是 msg 仍然为 nil 的情况 18 | 19 | // 不过,这件事情不会在单个的 Goroutine 中发生,因为 Go 保证了 在一个 goroutine 内部, 20 | // 程序的执行顺序和它们的代码指定的顺序是一样的,即使编译器或者 CPU 重排了读写顺序,从行为上来看,也和代码指定的顺序一样。 21 | func MayBeReordering() { 22 | msg = new(Message) 23 | msg.Msg = "Hello Memory Reordering" 24 | Done = true 25 | } 26 | 27 | func TestMemoryReordering(t *testing.T) { 28 | MayBeReordering() 29 | 30 | for Done == false { 31 | } 32 | 33 | fmt.Println(msg.Msg) 34 | } 35 | -------------------------------------------------------------------------------- /go-concurrency/mutex/mutex_test.go: -------------------------------------------------------------------------------- 1 | package mutex 2 | 3 | import ( 4 | "fmt" 5 | "sync" 6 | "testing" 7 | ) 8 | 9 | func foo(number int, mutex sync.Locker) { 10 | if number == 1 { 11 | return 12 | } 13 | mutex.Lock() 14 | 15 | foo(number-1, mutex) 16 | 17 | mutex.Unlock() 18 | } 19 | 20 | // fatal error: all goroutines are asleep - deadlock! 21 | // 发生了死锁,也就是说,Mutex 是不可重入的。 22 | // 因为 Mutex 在设计的时候,就没有把具体的 Goroutine 写入至 Mutex 的状态中, 23 | // 因此所有的 Goroutine 的地位都是一样的,尽管当前 Goroutine 已经获得了锁, 24 | func TestReentrantMutex(t *testing.T) { 25 | var mutex sync.Mutex 26 | foo(10, &mutex) 27 | } 28 | 29 | // 我们也可以使用 Mutex 来实现单例模式,比如配置文件的生成 30 | 31 | type Config struct { 32 | Host string 33 | Port uint16 34 | Workers uint8 35 | } 36 | 37 | var config *Config 38 | 39 | // 传统的双重校验锁方式,不过这种写法在其它一些语言中,例如 C++ 中,会因为指令重排的原因导致 Crash 40 | // 所以其实现在很少有人会这么用,支持静态变量的语言都会利用“静态变量只会初始化一次”的特性来实现 41 | // 而 Go 中则提供了 sync.Once 来实现单例 42 | func GetConfig() *Config { 43 | var mutex sync.Mutex 44 | 45 | if config == nil { 46 | mutex.Lock() 47 | if config == nil { 48 | config = &Config{ 49 | Host: "127.0.0.1", 50 | Port: 8080, 51 | Workers: 4, 52 | } 53 | } 54 | mutex.Unlock() 55 | } 56 | return config 57 | } 58 | 59 | func TestSingletonConfig(t *testing.T) { 60 | var wg sync.WaitGroup 61 | wg.Add(10) 62 | 63 | for i := 0; i < 10; i++ { 64 | go func() { 65 | defer wg.Done() 66 | config := GetConfig() 67 | fmt.Printf("config address : %p \n", config) 68 | }() 69 | } 70 | 71 | wg.Wait() 72 | 73 | fmt.Printf("config address : %p", GetConfig()) 74 | } 75 | -------------------------------------------------------------------------------- /go-concurrency/mutex/once_test.go: -------------------------------------------------------------------------------- 1 | package mutex 2 | 3 | import ( 4 | "fmt" 5 | "sync" 6 | "testing" 7 | ) 8 | 9 | type OtherConfig struct { 10 | Host string 11 | Port uint16 12 | Workers uint8 13 | } 14 | 15 | var once sync.Once 16 | var otherConfig *OtherConfig 17 | 18 | func GetOtherConfig() *OtherConfig { 19 | 20 | // 使用 Once 的一个最常见的错误就是把 once 的声明放在了函数里面儿 21 | // 如果用下面儿的代码运行的话,就会发现每一次 config 的地址都不同 22 | // var once sync.Once 23 | 24 | once.Do(func() { 25 | otherConfig = &OtherConfig{ 26 | Host: "127.0.0.1", 27 | Port: 9090, 28 | Workers: 4, 29 | } 30 | }) 31 | 32 | return otherConfig 33 | } 34 | 35 | func TestOnceSingleton(t *testing.T) { 36 | var wg sync.WaitGroup 37 | wg.Add(10) 38 | 39 | for i := 0; i < 10; i++ { 40 | go func() { 41 | defer wg.Done() 42 | config := GetOtherConfig() 43 | fmt.Printf("other config address : %p \n", config) 44 | }() 45 | } 46 | 47 | wg.Wait() 48 | 49 | fmt.Printf("other config address : %p", GetOtherConfig()) 50 | } 51 | -------------------------------------------------------------------------------- /go-concurrency/mutex/race_test.go: -------------------------------------------------------------------------------- 1 | package mutex 2 | 3 | import ( 4 | "fmt" 5 | "sync" 6 | "testing" 7 | "time" 8 | ) 9 | 10 | // 一个经典的 Race Condition 的入门例子,count 的结果取决于程序运行时的环境,也就是 11 | // 多次运行,得到的 count 都会不一样 12 | // 使用 go test -race race_test.go 可发现出该测试文件中存在的竞态问题 13 | func TestRaceCondition(t *testing.T) { 14 | 15 | var count uint32 16 | 17 | var mutex sync.Mutex 18 | var wg sync.WaitGroup 19 | 20 | wg.Add(10) 21 | 22 | for i := 0; i < 10; i++ { 23 | go func() { 24 | defer wg.Done() 25 | for j := 0; j < 10000; j++ { 26 | // 简单解决 Race Condition 的方法,对于这种简单累加的东西, 27 | // 使用 Mutex 还是会有一些性能损耗的,使用原子变量会更好一些 28 | // atomic.AddUint32(&count, 1) 29 | mutex.Lock() 30 | count++ 31 | mutex.Unlock() 32 | } 33 | }() 34 | } 35 | 36 | wg.Wait() 37 | fmt.Println(count) 38 | } 39 | 40 | // Goroutine g1 通过 Lock() 方法获取了锁,在 g1 持有期间,另一个 Goroutine g2 调用 41 | // Unlock() 想要释放这个锁,那么这个调用是否会成功? g1 还能不能正常运行? 42 | // g2 能够成功调用 Unlock,但是后续 g1 调用 Unlock 时将会 panic。这操作真的挺骚的:走你的路,让你无路可走 43 | func TestUnlockOtherCorLock(t *testing.T) { 44 | var mutex sync.Mutex 45 | 46 | // 假设该 Goroutine 叫 A,主流程的 Goroutine 叫 B 47 | go func() { 48 | mutex.Lock() 49 | time.Sleep(5 * time.Second) 50 | mutex.Unlock() 51 | }() 52 | 53 | // A 此时可以 unlock mutex 吗? 54 | time.Sleep(time.Second) 55 | mutex.Unlock() 56 | 57 | select {} 58 | } 59 | -------------------------------------------------------------------------------- /go-concurrency/mutex/rwmutex_test.go: -------------------------------------------------------------------------------- 1 | package mutex 2 | 3 | import ( 4 | "fmt" 5 | "sync" 6 | "testing" 7 | "time" 8 | ) 9 | 10 | func TestRWMutex(t *testing.T) { 11 | pool := make(map[string]string) 12 | 13 | var wg sync.WaitGroup 14 | wg.Add(10) 15 | 16 | var mutex sync.RWMutex 17 | for i := 0; i < 10; i++ { 18 | go func() { 19 | // 读操作 20 | for j := 0; j < 5; j++ { 21 | mutex.RLock() 22 | fmt.Println(pool["name"]) 23 | mutex.RUnlock() 24 | time.Sleep(time.Millisecond * 500) 25 | } 26 | }() 27 | } 28 | 29 | for i := 0; i < 10; i++ { 30 | mutex.Lock() 31 | pool["name"] = "Buz~~" 32 | mutex.Unlock() 33 | time.Sleep(time.Second * 1) 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /golang/G-M-P模型.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/golang/G-M-P模型.pdf -------------------------------------------------------------------------------- /golang/G-M-P模型.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/golang/G-M-P模型.xmind -------------------------------------------------------------------------------- /golang/GC.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/golang/GC.pdf -------------------------------------------------------------------------------- /golang/GC.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/golang/GC.xmind -------------------------------------------------------------------------------- /golang/channel.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/golang/channel.pdf -------------------------------------------------------------------------------- /golang/channel.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/golang/channel.xmind -------------------------------------------------------------------------------- /golang/map.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/golang/map.pdf -------------------------------------------------------------------------------- /golang/map.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/golang/map.xmind -------------------------------------------------------------------------------- /kubernetes/为什么需要 Pod.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/kubernetes/为什么需要 Pod.pdf -------------------------------------------------------------------------------- /kubernetes/为什么需要 Pod.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/kubernetes/为什么需要 Pod.xmind -------------------------------------------------------------------------------- /kubernetes/声明式 API 是如何实现的.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/kubernetes/声明式 API 是如何实现的.pdf -------------------------------------------------------------------------------- /kubernetes/声明式 API 是如何实现的.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/kubernetes/声明式 API 是如何实现的.xmind -------------------------------------------------------------------------------- /materials/GMP.drawio: -------------------------------------------------------------------------------- 1 | 7V1bc6u6kv41VJ2Zqp1CCAQ82rnsU7XPmknVephZj8QmiWc5JoOdvbLm148kEAa1bIMNSCbKvgTL3NLfJ6m71d1y8O3b55958v76LVuma8dzl58OvnM8D0Ueob9Yy++iJQxR0fCSr5ZFk7tv+L76v7S8UrR+rJbptmwrmnZZtt6t3puNi2yzSRe7RluS59mv5mnP2XrZaHhPXtLGa7CG74tknYLT/mu13L0WrZEX7tv/ma5eXsWTEYmLb94ScXJ54+1rssx+1ZrwvYNv8yzbFUdvn7fpmgmvKZeHA99WL5anm12bC/J8/kl+RUv0QF5u79DDf7z/57c/kBsV9/k7WX+Uf3L5urvfQgZ59rFZpuw2yMHzJF+UMFGM8HyZbF+r755X6/Vtts5y+nmTbehJ85c8Wa7oK0rN7LLHZLdL8w1tpC/h+rR1u8uzn5WgPdbyM90t2Af2rOdss3tI3lZrRqbb7G21oNd9TzZb+uvb9/KE8uU8cYF4sOPhB/5TPaf2DQln85h9U0ojzXfp50FBowo+yvs0e0t3+W96irjAKylQUp6E5edfewJ5UdkvXmvkoa9RErck7Ut17z2u9KCEtgvMojtZmHuDmYiuYw7MgW8Kypj+h/jvwdF2+Y8SbTL3Hvrq1L57EzTwRpEL8A7iWJxVR1yc2TvguNduDQT4EMR3AbmiDt8H0Kg5evsBBjBTMkCQyVAgI4DxX9/vj8DMBPTrdbVLv78nC/btL6qa0bbX3dtaIF2XPgSnMx59yF3Ir5S758LuFSnE7g8ldu9LiB17hokdfwmx+5FhYoeawxTFTnzDxB4AsX+bnNBR0JxRvRjOqKMKnXwBoWNkmNDDLyB0PzRM6NC5Mz2hE2yY0GMgdCDzdLOcMeck/bRYJ9stlRMTZ5LvYHNN+p3FCxFKP1e7/2b4UTu1+PSjRJMd333WP/wWHzZULLWL2Mcf5SvxD/vL+CdxXfFnp0vhYT0ELRVN9pEv0iMyLYdsKqGXdHfkPE9NlbqJrqCCaMvTdbJb/d18XRU/yic8Ziv6h+zH3LipXVSfxS2KP7O8qu6qlW7kS2oKlrlayAHciNO1+rMvsDhbuBU0UvhMOp5D/R4pHOqkZuA3nVdeiM6jZoBiyQ8GBtKhyQn9IZacl5Iz0knOCDU96R6JziMnCbWTE3qNLDkvJWegk5yVi6BSL8+c1FGsnZzQt/YI2Hnt5oDsbcChZnMAQdfa9KQuuxv0Sx161qYnddnfoF/q0LU2PanLDgf9Uoe+tQkoHW0VCF2KAZ3P1TTorhhEkmKAsXSroRWDFkFglkC9u4sOaSpdCYQD7QQy2+c5UQIFh5Su7k4d3QTyJulxNJ1A5JD+2N3xop1ARnsFG2F2h9jk9sSmFsskhSfAmIlP5koHl4pe0kGHirGkM3Dd7+qHPTABj80/aG7/CQh4wsBOtu9F3szz6pOx5cLIXIWJXosddjz8nJBIHa59G+LAHTq6V8rN8Am03VXBvcNFmULb3UJ4HEJiGoTQerYQHoXQcw2DECu0x/vAiR6c2YNzHznzByd22cEMORF9hEsBpp9jJ46c+IGfSg9CgDoV0U7yZzbkXSZNKNIrkvXqhWVQLKhIU9o+ZwJfLZL1rPzibbVcsscoHahNF+tlXOqjy0rzZIAg3sqcCuwNBXgLzc0mznTr1JFpiTMYrrzZgfk4hrFpAzNcxrMQHoUQY9MgtEZKVwhD0yDstUiAnS0ZVr5xsyVcw7H99DiGgWH91IerKBbC4xCapvD40BK1EB6FMDBN4fGtbdk3xkR2GGmfLX1rW3bFUC6sob2fWtuyK4TGKTzWtuwKoXEKjw0dMyB4tZpQLw9e9ZF0q4EXwQNo9FgCDU4gOYbnbALB4NXRCWR06NhUCSTHzpxNIBi8OjqBPEsg/VFcZxMIBq+OTqAriiMcOHjVmOFIpkD7+ewELYfmErRq/0rzDS/LXRhBMrNskAr/tqp6IrKzxedTPiZvKNOIwGHhhT7L/fcXgKGunEoUQQP3yU1xSlQGrptGbhT1AxdyMboJT5fkRQRByIYrLQfdgm98kH7e0Nbnj83iH/9mwVOCV/UjfeDBoXPxkb+Y3+M0B+SqwCTawYSuwXf2Z33Qefd9l1s8O+GJFYVSR8YTBspvqOJiMT0fU187pjCuaPu+2mxWGzboPmXZ2mhIn9By+ayEFLkhjtMBodOv6EC3/Tpb/KQGnvnT5VOyiJZYhRvtE36wHA43X7uOEyq85fehE8XOPHbuiTO7d6IZ/f7PjCK2W1Ez7/7Bmd860W3+sdmt3qj56LJ8h9jlqREBO3sWsSvj0JkTkQoxZwfzuTOfASZcbm6u0+edJmMT9aUAe6JSXGW6+IAZGCuszcFSIkRFSCkHRgaaHlCg7zjiFGK34gdLh6HDUjzj0Efs33ufHzA+bVZrzhzC6UFYLg09OQr4fSL2CEqS39u3bFO7IX96dF87mWfgsNcInZnP7syedefEmL8YfYE7BlrJUfpyEVGk79CLKUFjxN/m3pmF/Hb0GQVrZyzvx7K2DWvpQAVZG47KWoXvHXKCAc3ZqSYDRdxvjHkW/VboE+3oQw9Z1fkPMSBk8xLr/AGb7NhwtWcALFZmkVchj13tyCu2OmNTCQWSDwCzOzatFBMQHePFpEDPuGVEoAeMIMUccysmNsoazCcb5MS+5cUZvPC18wL68DppDUIbKTUf0iAIbadjRzGUzO+PZQjXZ5WGQiPfgl8Z1TUQTllKX3Zwy8en4u7z2t0jdslsVqrd0dzSsx09FUq2ryrVOBw9oVeyIz3lWYwwrjBKNRiHucLsiQHQLZlC+bxXj2OPc4mwDHbG3YJ43Phzyux2nw2F+4myrul7zgzza2Km0e/vynoE52yEuZkAu0bREjcfKCv9t3uTUrwPf1aZbS89pOqjvO/Ogup9ij9/psrhJ8kb4+zmafte0c32oBM9yFco/CP3oBbFTrevyTs7XHzk69/zPFn8ZNWwTnmdmjkZl8n+kCsXOrMktvQBmuvKVhr0OnkKzNBgK9mhIoGUjVwPXM+K2EwY4UZ/pj280NrZdKxS6EUPF8NeOUrd11xRhN2OeQ0C5geYB7aPq+gSCf+jYEug8FH6Ch/lYLk1IfQt3/AfAKD1KvMBWPtiKxKFv+sBa8uX9Hv5Mct3r9lLtknW9/tWqSPsz/lXlr2XmP1Putv9LoWefOyyJqKiqJ045oFoN56ocHeqqp1Tj18rLzsSwtbcHLsLW/xOM0IhyX62dSkBP1kQMvbVrGsdVXfZNnUtQvhtxmS3cYI0dQAiqlPVdQBvzFE9spnNXTEMmxiGLsRw1FytCDrbLYRHIZTtJ/0QQo+5hfA4hIFpENrU864QxqZBaFPPO0KIsWEQIjGyW5PncieY06PJ03arYFSEtGqzeRQrAefbPNdi2YCxY87/GcbmiUQX1WfzXGF175H8WJJtE3kQq3Gn5Cus4j0OVLINox+qK6xUOBJUgWFQxdCzZ6FS2iT6obpC/9w4UMm2h36ooB/OblfQY9SDpEeGIqW/oUeOGfQQKwpE7IPAQraKPkcW584442a/DmG/HhdnhCBYIzoVhOOg8A6ELZ0KVVmQ+mXTWkeNS5frSadCpNWnECuCos/3Kdh1VIelODSjY/Svo8bWd9wVw6CJoXbfcWzLlnaFMDYNwiv07OmFMMSmQXiFHj/NEIamQXiFnkC9EEbIMAiRKLRnTZ5Dpq4WkweJij+nbR6iZtw4Nk/1nnYhtbeFVNno0b+QilzrnW5p3Wj3TiORfmSxOmXGGIDVFcaDjoOVbK8YgNUVBn6OhFVoHFZX6KUbByvZAjEAK1VSvl1O7WuZTdYm9S+nIleRRG7XUy8H2mv2bP3rqS50EA1Ry2cSBfCR19y5oIKzDp/IXBhpOVxVkzDihf1wWauvLNETs/IfFlh1vxTDnUHAqsp3HRyAA1YXZzYrDxqVaCJWF2LGCy7NeE2cfcWbmJGkrOwVORHMUL9yevBwiB7o4aNmOYFQrDDXywmIsisj0UNdxes0PejIwIoiWXr0SA8xY4tZXVVtYlx6eHCo15Z6dXzF4DrCmxCK1BS4cFOlMGxOPMgTM9FImyEhUUHZhMWl83L0Ti0tXRXD2qTlFe6AS7k4y/Pkd+2Ed0ax7WGqYikcv6LqwX2+5AvEDmJ7Chfv0DOhYRWrMQm9zzT9UfvqFKNriaY/GiT+IpQumKFthRTBQJfHFdM/ZCaZVE5Lb5iEL+2PTGUI4yRGrrElzHOr9fTVgS/tloe0nqjJHYykewyu9SCdTOmi9XxtpuA40M0U36oTRnGslYasNckEYa21HmtBej/qNDnFmbDT5teT48zFFv6FKqhiHSb/KHd6s1poWy3UE/FDGrVQrRmKXbTQQ9G6E/GoeG3jc9Ehlg3rUQlFwU9BXrHOcMijAi4QwWkDe1Q8qywPQMwBlGWs5tN4yrLeTAWr+Jwz+Gn2vXkwO+Fx+3u7SNZm721rmOKDVWvSIys+mnu/NZUlheYKzB5Ps3slPIszoeWMTs7AmLfHl8V2R8G3E0brCcMVhc41ThgeBHKZULgsjK1hrBr0wYg7xYrbWLRBY9GwFIsWao9Fw3BxfUvnGGa4/nk7ORx7yhQI4yaOVFGC+r3YbWQkHKGHWiR88A3pZmG5PzztyjEpt5srtqlk58A4Mwt12WW9JtSVpOt9VqShjoO1D41y1lerbVUx30TwjuX8WFTVKQVeC1SjcUFV5Yoo9v/mG+ay6fmWT71g2+/+EZ/AJpHEI/KArdCvxSrfSIBD/Vq1i3tzf+OosdHxN4u2OiNEXndUok1GRVtZqMCt7Y7OoZ8FfBDH5ZbYbDR/qKWMcXV9kEyxKcDuSp0c+4qgR2/cTq5KFONboJeDd8g3TLeQnzuu4xs5Bk0FOvJuRs0P9GEC2KOz39D9rtzTmR34zKymQ8CAQE9CZfPEvnFHgRa1e0aCGVZeoFMyWTO8th9P9PCFHSLRRp9SawZI63Kk9ZeBHUhr3EhRbjgatTiGrzXqfB8S0WkFY4oLGKK3nl7A8PUuYAQG7QU+0L54k6NMoDek2Ic+9kc7D9QNMKx9HlBWSz4boi9Z+gp5oYQrdqHfe9ziV0RriMJ5o/VNEIT1EftUUBv/9JjmKyozpscPPYYvPvK/q4qyjfKyfY7uQesYuGKfG22je2SQCnk8bLLnrWkw/VES5FxVVQ99Qv9C+qgDehGJJH9T5UA+EdHbNRQd+aJ8cPWkMobgUCw6Ckl49IqBgtEDuDJ1RLuZbDFrEs7mcU8xJQgTKR/XU5SzJgpnNhILWAPYSHDtQqVNiSYmuAYJyP9+ZOKLP7ZcxGw9A/nvn/svxV28mk5W3Kl5d6uqqVgjZ6N4HlwDGVdVC5RLICVp3pNNK4aQG0JIqKKJgn/4EEX2rfy5ljlHmUO0M0dZOXpI5viWOT0wB7vamaOsYz0kcwLLnD6Yo1ixH5k5irjZ81VZuxkln0kCaQ3PjyHMgThpnJ1ZwnOs+4aHRIupf8gEP+VLusLda1HQulLZxab+hWPGMSdz29lGaQMRO38cG1hCX3J3BMJjom/+gAHZPXEhtFw4ygXXOC4QRcB2P1yILBeOcYHIblADuADjvHviQmy5cJQLnnlcgG5UEQfMk+nmSISJ2r18BopMCES4T8MCGTU0nEC/KA/7v+XZlgE7mFMKukUEqRFkmEDoMPJ9iQqqYEWxyfY4tiiBOuO3znPDYW+V13aCuPoAJCJngOgPRBWpviZEEXzpQFSxq1cLb4LeuBOxKeQ1hTY1+DKZQNQOlNHrgBIvqgxEtRPIBROI/gjWcPTlc+TatawzqIMl6ugPkg0VWYiHu6wNy2rlZsTSWpYBYVnizsatZQ2jcF7jWpZY6D6tShT1Y/RFPffhp8Q3URTFqukGoWudRdwUp0Q1vLhp5EaRzMs+xhoMMtsV9UTHnVJEdSNLj8706IMRQWScMztSlToIWHZ7WZBI7c8E3kp2TejMuQ90Pme+TdYSO3NSps+zqijcCxqJinNF+Qx6Mqul4LP/R6QsljPnVZFi2kJfr3SQEvYYdrt6bbsHtglzrbaKqIfHyjAUT77lW/fSrz1nNud3oY33vGbDHaumVfxpZRm8pgv/oGu2fOAdoPW1O+z9voY+Ofrdx3Do80QQT53p3nBMV23vK5jOeV0zpVqu5vGhD5rbhyywitNwGeAQyYo6I7OYH8AuUBG8qPx4x29I7xzwr+asCpViaeowoYsuGpNm4aIZ66uiN/BXpwNZUa1sBreGvO6Fir66QCjm2qoLIEUXUFW+GG6lIoKVLwB629fknR2u3hKmOddhlPFg1YH3rf9KntL1Y7Zd7VYZ+/Yp2+2yN3rCmn0xTxY/XzhG9bqv/Ieewh82E5O+q9IAyve5e93t3re8Cz7QfxfLjXezWmSb5xVFP79Z0Cd6D8tkl9BfrH3LftMh9SXN2SGT7cPm4+0pzf+gnGO7Ot+8b17qjDnLLDlstULdQ2L5oQS+Pkjoy3sh+y6sXeoFqjI7+9YBeNgiSvfr8HD3K+uNh8ezQc/iZx88jEJXrvhEmXijGBCVTByKhzGM8OI1VokTFYv590w3bDuBxrwFztq1SZ9NzXe16TtmD5rh8vKIxYUlb4zMm6ftO5e9qypNdEzFgLpvUxGYV2VkcaXNV294OEzhmBJcaUD3vDw1q38m1IiadsTUB6spqJRlsO2vWMaodQxMVAWm48F6hqKu6RceoV/ztD9dwdAxOiAx24SjwUQ35svB+jUGse+9/rUQNmoi/nvwNRGX/yiZQeZeX/k9HqW1BHssNm+vh9fFsQr0aDBjJVYE2J0PuU3l4uZm0xzwkGprT5UDcjibNIYOyL++3x9B+jpjEzxf8ojFGPaxcUMTYugQm6Lkfdc8yUM/zBQlH8heYAMkDz0PU5R86JkneZhlCQvhX7vcPSmjkaqJcIIdWe7K6PSJyd2XFRvtcvdc6FuantwDYp7coedienIPPfPk3sJCTzfLWZ5nv+inxTrZbqmomESTfAebawD0EO8xZrGG4s/uJ/BMjN6nA88KbR4ypm7CKwgh2i4sq+iHTYXDQ0IDEfco/lZQVRHcKZBUF2qzSncaeMd1z23heNDI5DNZeU4P6JHJ5Xyoi58EY4lVbnweP4kbAnfZ6AxtERluGdqZoQfm3HEYGkvRopSh5DyGhsQAhiqCrSxDL9YGDuyxMQ5DvUiemc+d473IAIZCH9wjoOi12wnAH4GQdjtBuevGxOQO/BEGyB3636Ynd+CPMEDu0P82PbkDf4R+uaMWRe2vTwNpq03o0xEOEaG7jkAkHYFOHdK9htYRxLtbDo3qSzqotHTlkO8bwCGz/aIT5RA5qIB19/cYwKFJeiRN55C8G8/5HAqJARwy2mfYiNUbfqOqk8sppXvAmCkQ0KWDq0U38Yx2BTaJZ+Aq4fWPfmAuHp+C0NcHk1EMK0nwnJBIHfx9G+LAHTpSGEmYeborFVRvZEFsDWJgHojKvRYsiEdAjM0DEbo0DalwrLV6Rm+LNvJ86QUtszQGq3ZdleWwyTi9dWwcGpeMU/0VdnhujaJsX+kfnkXXtCC2Xq6Vl68MAFFZN9aCeARE2WA1AMReK7jaWZN+E2ADZ03ldqW2rx5BUfZvGtBXrY+oK4gGqj7WR9QRRHl/LRNAhD4iO2teiLLsRDJh1oReJNtXj6Io75FpQF/Fyj0yLYhHQDRP9cHW69MVRPNUH+H7NXOZfaqr5DDeNZbucUG8Kwqkew29To5tnJkJwT5nc0gR7zo+h4yOM5sqh2C867kcUsS7js8ho0PGpsohGPF1LocU8a7jc6hFrXtTwg4Hjnc1Z1CSSdB+YjtFzcHppCgcl+ablF1ZWEUyuWw0S2kqNZBDsQ8r0Sk9T4PtBONh62Ds2yCOYhnmsCXMwzkYMXQwTq8SWCyisivBR1Dw43oifOgTnKDcA/PkDt14E5R7bJ7cFZ63/e4fMd+zi31PwbBRsB1mlOZOvZ4rxvPGjKLYqveMKFj6Mc/YPiV7nZEK5fVbtkzZGf8P -------------------------------------------------------------------------------- /materials/HTTPS.drawio: -------------------------------------------------------------------------------- 1 | 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 -------------------------------------------------------------------------------- /materials/MQ-Design.drawio: -------------------------------------------------------------------------------- 1 | 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 -------------------------------------------------------------------------------- /materials/MySQL-Join.drawio: -------------------------------------------------------------------------------- 1 | 7V1tk6o4Gv011N2Zqu7i/eWjqL3zYW/VzO3d2p1PU7REZS6Ki3hb59dPEhIFHuzWbjABsarvlQAh4SQneQ7hqBjj1f6fabBZfk1CFCu6Gu4VY6LouubqNv6PpBzyFMfR8oRFGoV5knpKeI7+QuxMnrqLQrRlaXlSliRxFm3KibNkvUazrJQWpGnyWj5snsRhKWETLFCpGCTheRbECBz23yjMlnmqqzun9F9QtFjyK2u2l+9ZBfxglvF2GYTJayHJmCrGOE2SLP+22o9RTG5e+b48ndl7LFiK1tklJ/zI9s/IGC/T7W/af77HboCepg96nsuPIN6xCs+TFCeQv2iN//mG/16X0WxJahBk0XZ+ILcxijOU5rc9jLIoWSvGSNHtGJfEf8E77AX5dj5luwlI7tvswG60/f8duRE+vlaGHvDuGaJZqpsUnfYWslF0wytkiOud55kfMI/WIa37/o8tr8ozrQoi+dEdpPzk2uTy7Ei5KhHN6a2mNUnRLElDyQp4q+tsEb0HWUJaXByRBp93qeMF9TTZrUNEmrrKr/ucX3byipkJpy2zVYy3NNI6knX2FKyimJDSOFlFM9I8gjVpKl+f2QGMizSXFCBLk+9HAsBd1w/iaIEb/SRG87zAtBuhNEP7s/1TO/Z6TJcoWaEsJZ2JnfCg6W5+DqNKk3XO1xPvGC4jk2WRcxyWGDCuWxzzPtEB/sIY4Qp2cAA74MNlufMzfF8xBxk+uesRZuwR27GKwpAUDpNAHI+TGBMaKajxEszc0DjmWdijG6Zphc3AaHKIGIou3y7A6NWgaLUFogtAfKSfAci3gbQcyYD0anojHd4GHN/C0bYlw5FPbQdavW50lA1GbSDWj0FpyIYkjIJYfDAA+RaQmiUbkCYAUusuiPPAdlW1DsSxY1h0D7l6If2JfloiXM8Qja7VO8IVDLEhG8I2QHg0gNsMOYsHF6oJeofAbYVShQ+YPRAH2iBC4bjAWN+/L0gAfYmGhHfdAiTGfUEC6EtTRY8peg9i8Bb4SwJgYEg9vi9MqgQmASYGwMTsECZSza5ruFD4AAXFj85xoVwYA1YVDjFUQCYDuk3xs3B0ofrRYfVSewk0pNehq6r2dPQE0Z3TTzPoVp/CC1c/dKh+dJ2dxSJcfTwvHmGopXRYvBQLbvWZvXhwoSDTJfFSKnABN4seeHnjGri5LW4WjjDUiQZuboqbhYMLtaY7U2arjCpeazKg1tQ5Sm2BCCUABqpEdybMVvlLAkygrNNhYVauyaV4WceAsk7nqFAqiCGpCocYijuTAd2m6Fk0uiYMHvL3H//4jg7dhflGb19ItkSYv1RXjAR3f3UXRbEPUWST6UwYdvidQrcFTIT3uJqI484xER9ymDVPkjsFisw0KMGUxQNQonCBntlmkmbLZJGsg3h6SvXLYJ+O+VeSbBjEf6IsOzAIg12WlBsA2kfZ/8jpj5pjsO3f6bbnss3JnmVPNw5s4+qWcw7L2S79QWug1TYvDGd6yEuoWi5PIEV8UB91iyecCkm3DsWtX1EaYYxI4zzWo5qW33tyw99uTxifZJfO0FtAsuAxC9IFyt460KlvoSmKgyz6US5JXXtjp/6aRMRd4bgGxqvM39RKk80Lxs6qtNpjMT7RkGHwvEUxMXrR1Z/x3zxNVgpZipX7RpB2oRBXEt40TlYTOEgxDCJLVt0nvhVMJ/LzuSuF+mdyNA5JqBnKY9E3BO945AYj3Ffk22MxNMh9R/7xBc8wvyhEZ1O/YJb98tOxjRT6J2afrNydylS2TtZV3mNJl5NmHYGXe/3VPbEB9gRr6ewa+nTrnC/a408Y0P87eIkpwn1BrsKhKv20hKjL+3HRy8SuQZQLn80jCldncESfB0TfRRS4mvAJZAFQva6L8iWLjQNqQVVGeyTMPLWU0ZPi+8rUVlxP8acK96tipKxMTcV3FZ/4ETFqVunBruLhZmoHK4LF+mW7UcrmSjUGR+SWP2wpBiQ7zd7s85MqgwzlfXodR/FGimuy0rn0yt6YfJ+6ykhT3DH9MlV8WhV/onhWHxqo3UxDrKzJdRw4VOjmLYcKCz5rfn+qXZqnfn7efZzWFqe06uN7E9qr8TtHMHCmffkU+P2ZrdvKzFY/+8yc55FPzlub2lpQiQQtabsMNuQrbi/xwU+D2XeUnemahfZwalA0LI+jzS/KB0L06xC/nFi2uBKzJStRA5SgV18VrBFX9LqhqRrLNMcJUPLq8HIjsdqKAdbpmxBeqwZeszV0oXbW4XX6gtFVpUMXKg6TAd2m+m5NZH9bdGFg3+GlNrL1XeHowiBf5zEhjrFGbh7t8whwNKkJFvEXvIkDMRyF+fi7QQO0CU0xyS6c+E4QN8RuZyZqFTFZ02pmalpdi2kveoPvdczp7LRpC+yKbfJlvsq3d3SepSjIiCi2DLZLGp3lGll2ie10bh1e8dvunHU4iUaPftusKhdVf7AFH2zBm7cFN/hrwZw0dUCZta7gut2W8sp1+8G/9qolApWxzxa9BMTugXeOGCir0xjxUEIpcbAGvwBJp6oBi0cSLmAcuPX9x83ci1seHPtnxnMjLHXpoIRy7+AOfgGSGo+t5UGyVwY7og3QAOeKXvRq989iRzDGgIuFQ9wrjx3RBmhVfhaObrdNdlphVUf0oMkXWHWZVdvgQvHAQP3m7jzCPdkwgULMnVnR1DCY6GHFGbxo6hlMODB370UDGUw4Jr3yopEtRnaFD1D9M6ORLEYWD3GvzGgki5HFowsVkA5rmIKthsAzeeGjL1RAuk7PgiEGz+pFQ8yv3w8JUyy68Pm9cHShKNMlCVMqdAE9C5d3XCjvDPTcKD2LhxiKRQM9N0XP4tGFitOd6bOQVIUPmT34We9WqFA4MFArujN5FhKYcEx69f6iZPNL4eKO24Of45YL4iqpiocYKjyTAd2G6Fk4uvxig1X4hzprGU3h64U9KOYMXuHNwSt6LuVBNef+zMJlW0HlQf3l/tzCZVsU4kHZZHALbwxe8bMWaFIyuIV30S3cu9Qt3GvJLZw//uJN26q22Zbtwr3BLlxeFyG3GfqEq+rMGgJ1uD/wbRh08AtvFlLLE20YrmnOB0bFho19+RBZGh6tN0fHwqh1HKJ+L41Q9eOVFGbA749w7oUjnKZ+1jb4c4Qw2M03uzJPhRRf7zffGsVD4bYNv/lPGsVPcUnGZNcnZjg0N4/6HFq0kHmKn9eAGMOtcPM5NwtqvG0zK62OeR0alSDP0msaMH9d7CZzFE2FciaAazAcvwBb/ZI3p2/rOM6GuzK4Tr0HYOX3LdT6JEYKowI/UKs+xfLzjFkqsScqH6HlsUvhRzIKbFjJ7HQdoicddzoTxZrQbC700zxjQ3hVVSfXV9X8SFUnl1bVmQx0yrscXCgIA4Ra1Yw/U28hQDjrNkyHa1yY40Ctq7/tUAqfAN4rnGb1J7xtCzKopjUjguLNNCGd7aQ04fuw/JqEiBzxNw== -------------------------------------------------------------------------------- /materials/README.md: -------------------------------------------------------------------------------- 1 | 2 | ### Materials 3 | 4 | 大家似乎对如何使用 [draw.io](https://app.diagrams.net/) 这个网站作图更感兴趣一些,在 V 站也有很多老哥问我图片是用什么做的。 5 | 6 | 所以我把一部分我认为画的比较好的图片源文件放在这个目录下,文件后缀名为 `.drawio`,本地无法直接打开,需要在上述网页中执行 `File->Open from->Device`。 7 | 8 | 希望能对大家有所帮助 :) -------------------------------------------------------------------------------- /materials/docker.drawio: -------------------------------------------------------------------------------- 1 | 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 -------------------------------------------------------------------------------- /materials/golang-map-and-channel.drawio: -------------------------------------------------------------------------------- 1 | ddHBDoIwDADQr9kdNgN6RpSLJw6eF1bZkkHJmAH9eiEDsVFP217bremYyJrx7GSnL6jAMh6pkYkj4zze8WRaZnkESdM4QO2MChRtUJonLJWr3o2CfrFAHtF601GssG2h8sSkczjQtBtaRaCTNZA2ZigraeEr7WqU10H3PN28AFPr9eU4OYRII9fk5eJeS4XDB4mcicwh+rBrxgzsPDw6l9Of6LsxB63/UTBttrunA/khkb8A -------------------------------------------------------------------------------- /materials/k8s.drawio: -------------------------------------------------------------------------------- 1 | 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 -------------------------------------------------------------------------------- /materials/nginx-data-structure.drawio: -------------------------------------------------------------------------------- 1 | 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 -------------------------------------------------------------------------------- /materials/nginx.drawio: -------------------------------------------------------------------------------- 1 | 7V1tc6M4Ev41VN2lKlO8CviIXzJ7dzN7szdzM5f7kiI2dnzrGC8mGWd//UkCYUBtg21eZEeprR0sQICe1qNWq7ulGMPn7cfIXz99DqfBUtHV6VYxRoqO/xwD/0NK3pISzTDVpGQeLaZJWa7g6+LPIL2Qlb4spsEmLUuK4jBcxot1sXASrlbBJC6U+VEU/ixeNguX00LB2p8HhdcgBV8n/jLgLvuxmMZPSamj27vyX4LF/Ik9WUNucubZZxenFW+e/Gn4M1dkjBVjGIVhnBw9b4fBkrResV3u9pzNXiwKVnGdG/5xG3vI9e5W1uLb+P5vt5v525+36We8+suX9IPjt3UwDWakMMS36upfblbz7UPavotw9fDkr6bLIHpYx3/9S+lUjK+/mfxVMQbpN8dvrCGj8GU1Dci7aPi0H01SrDHQxmDqb56yc5s4Cn8PhuEyjOitxp3ljiyEz8wWyyUrX4UrfPtgHvnTBW6BUjGp8Isfx0G0woUOfhUzq5nhqJMaw1V85z8vlkQ+h+HzYoIv/eqvNvifz1/TC9ibOtl35Vs9BeI1iOJgmytKUfgYhM9BHL3hS1ivcNUPVnJT2iuQZX3Q06KfOymz7LTsKSdhpstu9lPRnmdP2KGPD1IBOEIYNE4YFB0tY9Kci9cCmuiPFyK2tHVuN7R5PHwBbpjt7iQ+mpN/iYxswsnvQUzlYzZlteKXpBUnlx2QGCIiP58WcfB17U/I2Z+YbXDZU/y8TIXmGCB1tSRLWMZmPnJUFZK+oW1Y9AypIS+V9K8ZkbDKEmEilRMHXVUBcVBbEga9EWGgUlCSByIL/nQaEa7YHYsnEo9qYAQIEgk1cFSnITbgoLfUvqE3WoV+GSTjRHoskd8hb/aNvNka8osVwTyavD6+zISE3J84UwOCXDdM05q2BbnTN+RWy5BvVlMJeUHZ0/uGXIO6eQmJYIqnQenPMIqfwnm48pfjXemgiNXumk9huE4R+l8Qx28pAv5LHJ6OH9W99ylgvFq/F7dN+BJNggNtg5LrYj+aB3H1xIk000EpiIKlHy9ei7PJxhFFrXVi/K//TDre6nFD+18y+ROxPwumwqMuVfj//nhaf/r46bcX43uA9OD7Fn359baXXh1sF/F/0tvJ8T05xk2T/Bptc6dGb+mPo5EPVlOPGHfw78nS32zwDbTwbrFk78GTwuQles2MDGD3PY0yHJ4yQDh6ZQinTYag9WzW/gqsCHeg+NZfLuarpKZlMEvuU+s+glgQlotNHKwWqzmZPBQ5SSEjavISj9FZ33KzjoLXRfiyyfFb8l3Fb93zmPO/VERe7UlPsuvOg1FbepJ76X2maJmFOk2h6GZ3vZR/YfUKu65e0Vq/0PhVAw6hzZO/Jod40F2+DSKfmH+roSouEsyWi/UvPU4WjjDpo3pWPB4kuzWQgBF/bCvuQHE1ZWwprqp4Q3owVAYqPRgpjppeM3BIiWMpA4ODlvTyImzFjpEuwQCLNSk1jFJeIO27mPhLLy1+XkynVAmFpKTY5cVYt7GARRsNQllvDWVgjOJRToytATHHKGOkuEhxbGVsKgMMNCIlzh35b+wogzsqDDa5y8On8M+h4gzJKe9O8SwlWb9R6d1DxfXoGV3xBuRp3og8MKkGvwKpxlGcAX2CmwoXfqZnpyX4Milc+4TLtHkGMVmv7kS4WMWS5w/wPGjA7ZDndWDVlvSuMemtpLObpI/jRxA+v6O0QLuio9HeiPuwQU8hZaDTAzwceLQzm7SjWoQQHNlRD6zeq/woAMpAex1VB2TAoqPAmNIxRjBBGSM+olJBYd3Ru0XofeBSWveI8ICqApYo185JV8L4NnkEkahkmKDH+ZrxE7GM6eq34Rc6ciTDw7hQDxmJPDpgDOiAQR9KXiM3zKRfYRORxk/JhiT+u6Ss7pNVWzU/2ICniWHy4mrYmVNK8xILrDFnokIAxRw1OlIIMyUjE2aLCBWWFlIPlmr8jSrgsJS7AQuZpnj4eQYVaD3Vjz2H3rlYbaFZNJFRh7wEE/rDz8i/VKJx0/uzA8/L+grT2qQ47xNnYC5s2YCO1NpcWOfX0jhrZePwTXAbBlF3AOoNqU+8mxMzJVSukRht4dfM0hlnyEqdJ2/wH6aC2cMk3opo2+rGtptBmsJ+CwxB2TJY00tjhrX5dfT38Nn57e/u4x//Hn5bBWpDLk4nGF139tN0xWEWBUHuno2IUtKvBbQsPZpWU3qaIH1Qehhp9LOyyo7rrKziVo/e/pP/kbuL/NzdRn+dsiILTcNV+gdJTOlMxQJtxXosiE46IufXY8HrWIhB9z4ch15bAEqSbHQEG1l9k1EzDnyg3LwsVonPfk6AxHTY1abTGSgSmmobbtCSGmP0rca0pLwWsC8pKFIAcn2/HvxWWw5e7glqSGGQ7cXbK9NJtPZ0ktO9xECd4DRFxOYVERBGu0+1A1rLb4hC/Cjy3yiHZOYQIbmjk2iPMnfortMde0zuTU19+Fc0++58X32b//g82f4zc+PYQx+pzakIxeb3IJ48pQ0v+BymEFR6/rqigf8OMMYpBAF4jsJICTVRacaVFGSM4DVItY6bKPCnyW8hJyHItJFjQ6RhaKZhmbwEzehfSyaRugY11IBQwCLqXAaZiE8Kbk1ScIUihWZ8ZatI4WeEO7VkhboqhoFqsoLeEivo/Fp8Z6ywY4L7PBFUqBg7reJeyc1QWjKTtkIgzK5ZrVaIRSHsvQ+5m1X0X3+zTpLAzBZbIlDHA8QDwS269hMeofNJQ7jO3antSTvF+tCcweG03q0Xurfacvc+aRXkjI7PEiRVrnzoTXd8eqtH5vu5C9bhgo7TWc1fwiQmnMm0U5bp1KB6t+cGpB2+AR8k77CT6uxjzhB0KC+O5KUUQ84jtm9eqtA5JC91z0t6XV4yhOAlxI21VbzEOTZ1wku6ALx0WLIO8lUD7INU4dhH4zCQ7NMv+xh12ccUg324EbWKfTi32E7YB3Khe2fsYwrHPjwGkn36ZZ/a3miWEOxjcyNqBfvYRi/sUyOF1bWzDzd77p19+FhxyT79so9Vl32QGOzDjahV7GP3wj6Qz+X7Yh9bOHs0i8SS7CMM+wDJFOELG8+meBr7HGuPdvqxR0Nev++Mffq0OoM+nEavq2FChgSdn6Sx4KwDUsSJxFTXMzcxsfa2IF4jz9aVd3RHPAMvr/tN/djngHmvQfqm7cJjYiFGv6XsKHCsb43120bSGF1W19JQ0VsMjGYCcWogKQgMlM4BlSbdALPGIJqsY5drho+kptnOnCHNdkYziLg06ZHn0mQzLskaQpIeQQlpPFMZmFnV5VotxXEU14WqP/CeLkmp5iIg6Z4kj1QGs32/GHfoH3ipNBAglk0k2ILjcnm3NBpT+zZZBjK7x6HwSE2rGeLSRHYPGDueUdK8UYMBS/KjpenP3Cz71aCQGzFNlUUzFzpmLrNVkrZnrNDw2Dw7uCRxJklflGSxcuilI8ILu+RVufxYJMsmAjKuEaYakZxGWVKuUiBulqWIC+HmS4qO1LmcRYhwUfqQchYilsQkUXCSRtBo01mE4pzBLrPSjgkxrer0o7nckcA1ybeiXJ4vjlF3OZsqkjZxge2SVBmpGoWOqbEokAKnAnvNaVYDQ/1q/KpOvMXavF/6+ueH+18C8zXzqTtjupz5ib8ry90ZMa0VM2UYJ4WbKIPXpTzbswFPt92ioKvpFHqfAc8wDt9wtgHvUKM2Oa0/0DW6cDXtJoKWA8vis4c5gHrhNKAawkCev+ApWawDFtNrspgYDmCGdSSLmVofLAao1pLFqlnM4MDqncXOXziVLNYBiwGeZOB1YjiSmRWqFX+D2weLteBH9i5YjAOrdxazJItdAosBHmngdWI4pFkVqhV/Q8UUtB0Wa8Ef7T2wmMmB1TuLnZ9ZVrJYBywGeLaB14nh2GZVqFZAQGMfLNaCX9t7YDGLA6t3FjucWU6ymCAsBrjBgdc5QrAYOta6b/di3W/Bae89sBgSz7p/OKWdZDFBWAzIogle13i2q9OCDI617ju9WPehJJ+SxSpZzBbOug8lZpRAVgMpnoGTR7Ilx/OuHRAb2x+upCC6Dg8Z6HnelpcTsIGuhKy4jmCJBhnvnCMhKxpNDdEg0yVkFRYiTTTI+ORBErIiZK5okPEr5RKyogVDOPWjs1DFS4WsPBnvH7Lzw8ibsjkJGVMuiMlJr7v+19vOLQdfO0cIhchGyQvM5lae/AO8oGlgcGxb0F28MbrTjRV6I4a6S2qCEQO/aMVHU0t2YHYmpgszetDsvumB7eAi6UFoejDq+nAjsfjBuD436U52R9CtUuStgfgtmTpdRTCuz8mqEyTJNk1iIWnKEOqL4HyWg6I6+lCM8ENUzhZgpNPGvc6i9uEbWgrc4a3+l05k3XiLcmj1TmQyivoyiKyu8mqKEbuD3COJzOa0tU6I7Pp0624cRoXTrU0ZgngZRFbXem+KEb5jVyhYvMsoN1nphMiub2rZjauheFNLGcNwEpION3XqHUnej1u6AJSySullruSzVnbqA2DxM1uJWVH1K/cz3eX7WbeYSYe2KszKs7H+MZMebVWaSVnx7B8zcaZY0j/qAEx1Z1hG4zbv88RLOkjV3DxALWu6ADN06wJhXXzSgXfhAmG1k0ygehnLtEqSl5BTeltJ+JrIycRPvaRP1f5lKdZcGVyu2jOhGNcXA92Jq4QpnBWEefkXtoGge7iQrQey7RqSbRbwu6pYK8lthABvEFPcfIBUZ9NtZSxyzaCN7QcutW/rDir1bYffgCDbBCQvEag1f0k+MpcDjO0JNVsG23SEhAfLHKQt7gG1F4jKkbRissbKzhxwTU374Gju7q/kJGuyXsiqTFQFbvw9vmJW0NHADmwIJMeFOuMCtx7f97jAvGwPIVnc482PJqypCTaFDSq5xruz3JGFYE6fR/50Eez6flpMKvzixxglgpdDhyII0fMkZB/ptLHNnI7M0n6AWrZXV56YbB5302wL94v3OLqGqWK1E3w7mcz5DRe4TeR31FQxWDWW+lLaoqscsNXyvqL9r9ShGnmX5fhxJu7M0Vec0ePiczS/j9GjI0OjaVkf9L6HD95hRw4fRRpxTR6l3sePGhZGOX6cOevU0QdbuAmIOGk+5BCyHya78ShceAixdF637XgEsXmjlhxBikSCHOEmILY0YLU+gFiqJtjokTlfyOFDaFcHTa0bMafpjZu6zpSw6wtK6yfhQxbc0VvaaPXizRXvIypNU2vnjlLF2MqAc7FiPt61MwWUbmgnLi1r2Csis07CmbhUAQKQ2cWnwXsvZObWJTOtnUn22dkCqsiMyxbQEZnJDT1OIjMuXUD/ZMa8WSWZCU5mWl2DoabpQpAZF7hVRWZcxoBuyEyrYb+SZFYjZYAAZKZLKE+BkssZIACUMpj52KQByLU40DpdCdA06UF2bNYAhPie1jFocoeOY9MGCAAaHyQsQTucN0AA0MSJDpaJAw7hVHc332yJSpQlM4135pKhvrVyB9gAO3Qb6quxDfIEoIfrX1Hn/UzuDJJf/SziYLLRQ7CIwwaXjgIQs2+VqQXq8I2hWRxiwGbOHTOOfn2mr36yC/RvL2HIldILDEaKq7PkAQ5NDIALEcsrMEoPnCMzDciOvW9bW80x9Q+8HUZzgMwCptuaNPDWMw4zmVrgqDHXUstAW6URt3YuAZsTma7HbulZdxrvlw1BAvC+DP8cte19DaQPQAawSW+n/te6dKkUe7pYw3rUTmr/OtPFjLiOHbyAupBTeqM9w9exDgQGiyzJHpQ22L53szg7ffGGlhwIgI1LpS2+Km9C/4uVAm1zfv3mtjNY0ugoABKKoa9Lk41xiSFDIE8Iou+fTIwaljSphjcfRd+/Hm7wQMthRMRhpJ2dTevE0Xc/ikjnueMD6QUYRGqY5eQg0nAkff8jiFrDhHdh1thOvJa57dC7tMZO7k1NffhXNPvufF99m//4PNn+87aF5dSrsZ1bbBl7t34CrJOZAFxmW3DpEq79cCHh4Kqxptk6XPXXM9sYvJAqHCgtrCReGiimcKC0oFBcGiiOcKC0sDPxhYFii6cCtJCV49JAEW+gb2HPowsDxRFvoG8h5cP1KMslYtNN3qbQKVgav4wk0do3tekfLRHsBmLNbPrHRATjgFgTm/4xkRaA8rymf0ykAaA8rekfEzn/L89q+sdETv/Lk5r+Makxp5HrrWfHR5UW2m8Nl4ddB2BvYMEVXvbh1e2WvCOWwYzUcGG+EbZtlyCr6RjR2jodr4tLwAppJcvOLH0DVkNRP4NYZ7OUsFok1iaiHbMYkbri1QTfmnbZPdbiNwhBiAlMQR7MBhKTwAJRY5YgQDzqdUSqIi7XgKGhD2r+r96+PnzNTEBYvWWBaS5wFRYjfmKzmi9WW1xEYtO9seKZaSD7wIND2z1d8QY0Dt5TPAcKdse32MrAoNHzquJq9OIhiZvHB65Kb08qNHM1m+SJTnJqQCLsDY+91R0p4S8gtemkZlI/UlwXugbfO6TX4Ndz2bcM6HuaJLgfv/zYVlyTfguuhL4zLsHXOCY9MMknk28ZkrPkmlExpt8iDyXbl2O586cPwWtAId+9H5bbCA977IwcdBP1lPMgNZjGmldsHRfo5/b+Ln0ezdaYZDKanbxEy7dB5E9+J37TYCPnMC2O1hc28dTKS5w2P/HUAT7O0iicA9R/fzytP3389NuL8T1AevB9i778WsdRUE48eYQBOdgLOp7mFVE3mRQUUAdgN1BbsPNq8Wq+fVguNnGwWqzmD22wa9ce+rreGH5F915Tg3otZC9qCz4RTN21GfO8xrf04tCmAkNbS6Y6sOlFsGh31PSaYE0vguG6xRCEs8Bie2+KgtVJu3lgTfA1UyaKxN9YMCI7AwcjHjW+nBw8WFCaFGjGXpn2EWx0YMu0f9zGHnK9u5W1+Da+/9vtZv72Z2oE4WWp8dywh95SdmNwVV2sbsw7QO7MHJnlAhFzgKMB0/7LVyK1hoC9ZVNthqylcchmmZQKc4AGFp9AaHXAuZWYcu6IXYYYZUYkT6OurghmBG9EjU+2MnapOcYp2oQcxUXUZKVSAxUiN3t35H48sXiK4/VDFPzxEmzih6Q2mzyA2SR4EalgAGg+dxDSBiDUNLuoEN0aUIJFk8V1dtJBjRpK0RyL/3pvA6Rpcv1Hdrl6bMO4RtEYe7tbtsu1iw21i9FEDDOsgOhAw6Alka3p4rXQQOiPlzBOheh2Q6WKmExxE2x3J/HRnBoHQ/xYXb1J1v2SCvEL0jqTK7j2L7JPDck+SgMpjVOBMXHghYSB6loq4z/I+FGrjxyQQl5A2ISZlwZ4vtyaNgrpHA0IA+E2aoympHZDzNYiygQybYSJG5AJQzMNy+RlYkb/2pQJp3eZgII7mpcJumIhhaKeUGiAv0DHUgF5YjUkFZuQLHFQsZgJyROP2nQ6A8cOTbUNN2gVetQ39GAO+gagD2czivkmWImJekMz21NQ19XeUYc8hBrq8I8vCfI3+GCGZ60S/CL4veuFoDdQQ+Cvw+UyQX8dhksRsdcefS3QQexVNMaT9x40gP71QiiP+aGdKJjXCvF+8aivywFPm8xiQktwVXlfl01qZin7zmQ7ZDjkjoFNTW93xN7SkfGkwk2wSTFgyxkl/y5AKkzIca09qQDsLMdJRR3fqp1U5BydhBWLztCHpgWZE0U38APTgnRTG+qfR1ziRpBAMPjJ6g11cEqxRNSSmkkAIsjh/5IaEpi9oeJdIZaAnt8tlkBmY9Z1NGLcThczLPJ/h3o1erTPkVM2Kbk2SCAlvGNIgKnXrg8hQqSkl9jUd9RIuXSgpw6xmE6vDhJANe4YEsB+nrR74n+cLA9hbMg+XGr9nbkuFxJIB+kWEn62QiYau30O35nb3lGotuCrh39GIZn3Zec+4o9/+hxOA3LF/wE= -------------------------------------------------------------------------------- /materials/paxos.drawio: -------------------------------------------------------------------------------- 1 | 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 -------------------------------------------------------------------------------- /materials/redis-replication.drawio: -------------------------------------------------------------------------------- 1 | 7V1dc6M4Fv01PIaSkBDSoz97Zqs/pjrbu9PzMkVs7LBNjNcm3cn++pUA2SDJNrYB48SpqWksQMa65557dCUhCw2eXj6s/OXjp3gaRJYDpi8WGlqOA6lD+D+i5DUr8SDOCuarcJoVgW3Bffi/IL9Tlj6H02Cdl2VFSRxHSbgsF07ixSKYJKUyf7WKf5Uvm8XRtFSw9OdB6TFEwf3EjwLtsn+H0+QxK6WOty3/LQjnj/KbIWHZmSdfXpxXvH70p/GvQhEaWWiwiuMkO3p6GQSRaLxyu4x3nN082CpYJFVuiO6CwcvgL/9f33rPwy/s+VMPJXd5LT/96Dn/wfnDJq+yBVbx82IaiEqAhfq/HsMkuF/6E3H2F7c5L3tMniL+CfLDdbKKf2xayhElP4Jk8pifnoVRNIijeJVWjWazgEwmm9sKZ6YeewDi+/RfKR85WCXBS6Eo/9UfgvgpSFav/BJ5luQWyCHo0Pzzr61BN9c8FoyJpOn8HETzTd3bduYHeVMf0eyO1uyf/HUSrCyHRPzL+w/iaC6OIHNsSKgNbahZhv/+xNT8sh0X8SJQGj0v8qNwvuAfJ7xV+beivmjNkKO+l594CqdT8TVGe5cRMYsXSe63kOafx/5TGInmHsRP4YQ/9b2/WPN/Pt03ZFJY0aReUxZFF3WkqR/QmdGRyIQGD7N6Wp3gzjkS1pr9PvJ/Bvv8SDfM+/UjzaIX9yP3sB8Fi2lPRHbR7pG/XoeTsvEONpza0rqvBS9h8mduF3H8XRzb0HHzz8OXwsnha+HDH8Eq5C0hwDDcG7/W8fNqEhxmlGAqBcoOUxZM5RosJctWQeQn4c+yrDGZL/+GP+KQP/EWKaCMFKRWkf2e/K6iDFEq2nDBrooSfzUPEq2iFE2bn306wIgBYBlZCFikSlKSJ/nvsxBn/VSpIP5XLMppxeZ3WCPX6vetfs8aeVavb9G+NaJWf2yxkTUiFh1ZPdcaja3+wKIDcTEdpwfEYsTqs7RkKAr5AePHJD0A+TW9YXo7FhX2YFohtHpj+dS8EbIHzx6ow+R2lE/WQG4IKeSGdXJD0BSumiI3T8dehgbG7cosHk65afmvXr8uRPtYiFsZ3HVZ+FW2KanJps5hCbK5pmhT3JRNaacCFiwHLEr3B6wFb4E0ztkAEFmQ38s8WbC9Of20L9ylV1SOgRnVX00M1EIXxlxTgs3fiRHRZcwG+JiaGw6RzEhTDIkoJUJdz2L8ccH428ePX0f33z8PBFd5/dXz4veh5Q2zT/Fstua29YY39toDoEuzlwx/Rbbiznaff4xXyWM8jxd+NNqWKg25veZjHC9zi/4nSJLXvPX85yQu29ssrw+o6xpY8nQxDisS0ZkMo+Y1sNpx3uH5PLz4r4XLluKC9Z7vUaQRIkru8MD1WM01VvwdW6hmT1wrbUFDMlOoZWb1PCHIuXimgqoe5us0RQCEXOdMxsbpZVRIbgd8HfbTU6k4p14qvLm2J2+BxmoS1hvWUNBTyhpgA42RxmhMT6heRIVJPXVnEFTEoYcE1XsST5ieKpdU7nKrcWRtNGNK9Z6eQXBEBkFm/7NUAhApAM5E/aGZifQ+Iycyfooxgdhi/vOWHNgtxdwyHIGjS7FWkwNQz2WbLO2mkaqXRzahyLUgJkp6FsVvPJo1JMrx5UW5KQl+OsMgu0Qs/KDnpKlJJhBBU+Cw9KxA0NDqjXKYiLSjK9DHiSgvwVtwFdOXIrM5vvFSA7zkAgMaJUDaQaMpY37BDJdUVpt+I4Nsf5ZrV55KKjW40W55hc6moBalVrV3eWWKDlNFiDEFgicrOhXLTSs6PS//NVhGnDWSMF7wE/3n2SyXZxpVvgHqaiiQupcPpIbkfDaQxtJMZm9oMVqW31vplKUzRVkhGIqRux4vzLObN+NL41N1fNg15ARMMwmaM74pjc0FC7Womw7UsnTENh1vpe4WDtuBWiqETz9FCr+AA+Cmp09AAjZlh1pFguSc/YlBgy7WxO/Nyrus7F7c3x09/bsjin+Z8f/tm1h55ky9w/ZQpsECHwFfAw8/0x96AEgTF8qzUcF6LAkVGec6BkuawnZjc8CwwV9VE825jZbVf/1mgrj/IGsA+1uF7NCkh/AN1XRkfQCvkuSOonC53kUbBdT662U2XX4Wvgikb6eXnsQoZSeAJoJTQP8AAhSYyWg/KCoDW/akixYzZfQ2hfVPCqa6gQqjq3koqG04tTT5Y3+XWHZ/Yanne6DXWwMqjjT2wZ6zk3eJD3adpa/UN4J7ni9XmC/eYV9uzGfdcvYL6aS7L6FRvwNXMdM295U79KmJL3Pjq7wJp9MZMIkFCDzEggIfANs9nhHym6pyQvcdup1kGPTKyL1TZ25UTYY5SgL4TpVZDSfDkGEY6nogX57/uH9CUVPQ7QgiWVnAqv2uqniESBmQcNuF43ELQjoGxzIDw/cMRwjLOCLuaXhUequaeG8aj8eNhnUNjx2gx6uL7EpA9k4ELnT319M0cPV0+CpYRn8/+JMfUTz/+yHPjl1/hhM30kFR+aaNPOd85j89e9/G69/uw9nrn/5f/xg/GdaOG2e5rrLcZ6zlOgFBHnsLdt4mjwzpPi0pWH3kyjDjAhLUooWrKPDu5gb25/nOMhW3g40JVbpaHia6wRiyiW6yQnHtVnN1I91yfVoUPzhBxti2RJcOuz1nd07fJWbg1I6FKiKxux5ch6cSZjueJp0Ytanmq5TqjirLareMYQnuFcn31hJ61+C1ZySFd8xD8zhoqQZaCGwFjVUlvweA7UA1XhHHUSusT/sbG9gwE+ZaQb8/h7IL9PAG+p2zOBG2+bcpoKcE2Pg00CPM7HJlDDFVdTUMeNlJu1LEH52leZ/IdamNMFLYlXonkrWLgM2A5ghqdU0jV5/F9EbTNDX1CSFktueV+QYjDXKIejrmPI3katOZR65I7RgDHTOMtqN/uQ3AVxNzicJcblPMhRyU9o4wy/5omXIYOVVwphWLBEn+3hBH8QsemVnhr11mazdBcpJsPDpFstsBnXohDg2jJ8dgvPZpTXufssB6T3Jtxa8VDx/i18frMBETcm8hTHotKBMPkfn5YkLThccxz3l21Bc0NOqr54ebTvkqvgpf1YcZ1tka3XTsSHpqeHPVgqtipGgEpOczNwmkVgaLDIsXdd/tbq65wdEigpjNtVU3R4ucy00NP0ULHUqgtToaJFf2HeTXzDcuRrBV0q7d9cw6PJA5NgUdHAUyrQi8nt75lQ0Dne2uheEZFx0k83q66JB3nm0KaxwM4nUh28OXHw0yLJS8WvB3fjjoKsFPXc8mtMYxIc9DNig/ffuDQhLmV4r7I/rI7x6/FNrUq21kiLnY5h2/C48MVVoy2Fn4XtmIQm2wpzrsGxtW4A6Vyu3ahxVExR7r5rCCXCJ6NanK87rSNacqJad1vCvt6KvAzOMKYXjLVhbiIC5vK0AZ1KjHOLDQ3OKF28DCOd7qXYe36inp28jCQV91daVw8cEFR18odFvUUK/G3CMdxTvjy4DA2FbXzVaQhYTZACCGKfIcB8j3rsuYAIGNkIcAJLybzuCJEpECwqshhBIMKXWhMkwm+v9ALD1zKYRYzsVqSyLe5tQdx0WuW9YNXZhQhypkb9aP/lIczqLgJe8H96u8mrieAK43ZzsLlFVno9ix0Wle7BKsVtWup3Z3jtiZsaNmJYiqTgdDF51jYnh/Uv4eeLBj0fJmzXKFt29ucQB3UOlRfn7saxt5+KBTZMp+if3b3Gk9XIyV5ckQmnZdpgZ6qWO3HbNVq0w5acBtO+aCVWd5ZVOGLuWCMgVwM1YlY2UB72J8aTJWtmXGeukv5H4ZWw71rN5A/Cc4kopNN8SGwQO5T7BCr+qe6Pld/X5OsXSUvgQZ5/s8UppuNpS+DpsV9xsuPoqGpQIETIysz2PJNVu4jr+K97Mu5qkwrgE+Cl1P/YDOJia6JhMaPMzqoWvEqI3K3XhofKMERba0du0vIzVjq92+/BVrq6rLSbL0zMW4wvCSgb27Se/ZoRUUd+qRuyF0S23NZjNnYnTfKXkgbl1zRvVhaogMLxJ2HN7TNXSAG9NcuMqknbcfxmnVML7j7d4taa4jBXJD2+zWYLvCDKrCrkiC0dONkw5uEb57n6SW8YAuStX6PjSlHR+1rbUHXz7/8/fP30YF9XWTWeWZxVTu2yBp2rRvX/sqy7R3Qb5BXmpqLshpf8deIyDdhoSIfWh6eiLs0vGXTgJz/H2gLnZBPXb1ELRheTU3JKZX7kHPdtoMv7fEZDVGlgnjjjOyfMzK4hlxCgZio76bVJY9XU978QLEpAtSWU8674+2428fP34d3X//PNjfTSrtDMaR0t/uDJYf0BuhqyhB2GblibNGQkcQ2PLdJ+2gxLQ3IBEbwPV0tfV+h4LVt6NC19ONhw2jD+r+B/UZzrSvX+psvTe2Dd95Chm7tvJeAYgvbTvXrI5vtlNsB3TbIcNeOO3azpCBuhGmPndGJUxs2E+vJsPxj6tY7PW+OfeBN8Pjp3gaiCv+Dw== -------------------------------------------------------------------------------- /materials/redo-log&binlog.drawio: -------------------------------------------------------------------------------- 1 | 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 -------------------------------------------------------------------------------- /middleware/RabbitMQ.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/middleware/RabbitMQ.pdf -------------------------------------------------------------------------------- /middleware/RabbitMQ.xmind: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cch123/Psyduck/9067a69692cd1a9c6f93b1ae5c5f073c8ff8b2a9/middleware/RabbitMQ.xmind --------------------------------------------------------------------------------