cpp语言学习:
基础部分:
- c++程序的内存分布、静态/动态分配内存
- 函数/类中的静态对象与全局对象的构造顺序
- 临时对象
- 深/浅拷贝的问题
- std::move()和std::ref()的对比
- 函数新特性、函数重载、inline内联函数、函数中const的使用、递归函数
- c++中的I/O流、I/O缓存区、文件操作
进阶部分:
-
类、类与类之间的关系(继承、组合、委托)
-
可调用对象:函数指针、仿函数、lambda表达式
-
std::function类模板(又称“可调用对象绑定器”,可与std::bind()绑定器结合使用):可绑定(非重载的)普通函数、(静态/普通)成员函数/成员变量、std::bind()的返回结果、绑定不同版本的重载()运算符(即仿函数)、绑定lambda表达式
-
c++11新标准
-
指针、智能指针:std::unique_ptr、std::shared_ptr和std::weak_ptr
-
资源管理方案RAII:主要体现了对象的析构不再由编译器或操作系统来管理,而是在对象超出作用域后用类的析构函数进行释放。
lock_guard、shared_lock/unique_lock、shared_ptr/unique_ptr/weak_ptr,均体现该设计思想。 -
引用计数
-
C++的多态
模板编程:
模板编程:主要分为“泛型编程”和“元编程”。
模板与泛型编程:
- 函数模板
- 类模板
- 非类型模板参数、模板模板参数
- 可变参数模板
- 标准库中可用的模板组件:std::declval、std::true_type/std::false_type、std::conditional、std::function、std::remove_all_extents、std::integer_sequence、std::is_copy_assignable。
- *萃取trait相关知识
模板元编程:
- 元函数
- 混合元编程
- 实现typelist操作接口:is_empty类模板、size类模板、front类模板、pop_front类模板、push_front类模板、push_back类模板、replace_front类模板、find类模板、get_maxsize类模板、reverse类模板。
- tuple的(递归组合)实现:“泛化、特化、构造函数”、“拷贝构造函数”、get接口、std::make_tuple;适配的算法:pop_front_type、push_front、push_back、reverse。
c++对象模型探索:
- 深入介绍了c++类对象的内存布局,以及虚函数的引入对内存布局分布的影响。
- c++因虚函数的引入,产生的动态多态的性质分析。
- 函数模板、类模板的分析。
并发与多线程:
- 并发
- 多线程:创建、传参、启动、结束控制
- 线程间数据共享的数据安全问题:互斥锁(lock_guard/unique_lock)、条件变量
- 单例设计模式(饿汉、懒汉设计)
- std::async和std::future创建异步任务
c++的标准库、boost库:
- STL六大组成部分:容器、迭代器、算法(STL内置常用算法)、仿函数(STL内置常用函数对象)、适配器、空间配置器(可自定义),详细的分析。
- STL中各容器:array、vector、deque(queue、stack)、list(forward_list)、priority_queue、map/multimap、set/multiset、unordered_map/unordered_multimap、unordered_set/unordered_multimap等容器的底层原理介绍、常见的成员函数和用法。
c++11-14-17_内存管理(RAII)_多线程:
- 在c++11、14、17中,基于
RAII
的局部对象管理资源,包括智能指针(unique_ptr、shared_ptr、weak_ptr等)、利用栈特性自动释放锁(lock_guard、unique_lock、shared_lock、scope_lock等)。 - 自定义分配器。
- 多线程基础、线程同步和互斥:mutex、超时锁timed_mutex、递归可重入锁recursive_mutex、共享锁shared_mutex、条件变量等。
- 基于互斥锁、条件变量、智能指针,来实现线程池并完成任务的分发执行。
c++实现十大排序算法
项目的学习:
三大池式组件:
- 内存池:STL二级分配器的分析、nginx的内存池管理分析和实现。
- 线程池:
1)任务队列;
2)线程数组:需要通过“管理者线程”进行“定时扩缩容”,当任务队列有任务时通知并从线程数组中获取一个空闲线程来处理。 - 连接池:连接的生产和消费,采用“生产者-消费者线程模型”来设计,使用了线程间的同步通信机制“条件变量和互斥锁”。
1)管理者线程,会定时清理最大空闲时间maxIdleTime的连接;
2)生产者线程,在等待条件变量的唤醒后,负责当“连接队列为空”且“使用的连接数<maxSize”时,生产新的连接。
muduo-based-on-CPlusPlus11:
通过C++11重构了Muduo库中核心的Multi-Reactor架构部分,这部分已经足够支撑起一个基本的高并发TCP服务器的运行了。
本文围绕连接建立、消息读取、消息发送、连接断开这几条主线来进行梳理,同时会讲到Muduo库中涉及到的线程控制、线程通信的机制。
ChatServer-based-on-NginxTcpLoadBalance-RedisPubSub:
集群聊天服务器的设计和业务逻辑实现、调试、分析。
- 使用
muduo
网络库作为项目的网络核心模块,提供高并发的网络IO服务; - 使用json序列化和反序列化消息,作为私有通信协议;
- 配置nginx基于tcp的负载均衡,实现ChatServer的集群功能,提高了后端服务器的并发能力;
- 使用基于redis的发布-订阅消息队列功能,实现跨服务器的消息通信;
- 使用mysql关系型数据库作为项目的数据持久化存储模块。
分布式MPrpc网络通信架构:
本项目通过Muduo网络库和Protobuf传输协议、zookeeper服务协调中心,实现了分布式系统中的MPrpc远程调用框架,使用者可以通过简单的定义callee和caller中的方法、bin/test.conf配置文件中zookeeper的host地址和rpcserver的host地址,来实现服务的发布和远程调用。同时,通过异步日志缓冲队列,可实现MPrpc框架在使用过程中的日志记录。
本文的要点内容和技术栈:
- 集群和分布式概念以及原理。
- RPC 远程过程调用原理以及实现。
- Protobuf 数据序列化和反序列化协议。
- ZooKeeper 分布式一致性协调服务应用以及编程。
- muduo 网络库编程。
- 异步日志缓冲队列,实现了日志系统设计。
- CMake 构建项目集成编译环境。
linux学习:
linux基础学习总结:
- 基础介绍:概述、起源与发展、Linux环境
- 存储分区
- Linux网络相关、网络连接的三种模式、Linux网络配置、NAT网络原理图、CentOS7的网络配置/Ubuntu17及之后版本的网络配置。
- 虚拟机的克隆、虚拟机的快照、虚拟机迁移和删除
- Linux运行级别说明、开机的流程说明
- 远程登陆Linux:SSH的远程操作、远程登录和操作 - XShell、远程上传下载文件 - Xftp6。
- Linux目录结构
- vi 和 vim 编辑器
- 权限的基本介绍:修改文件/目录权限chmod、修改文件所有者chown、修改文件/目录所在组chgrp
- 磁盘管理:VMware中对CentOS7进行磁盘扩容、lsblk-查看所有设备挂载情况、df-查询系统整体磁盘使用情况、du-查询指定目录的磁盘占用情况。
- 系统管理:firewall指令、top-动态监控进程、监控网络状态(netstat-查看系统网络情况)、ping-检测主机连接命令。
- 进程管理:
ps -ef
以全格式显示当前所有进程、终止进程kill 和 killall、查看进程树pstree - 服务管理:service、chkconfig、systemctl
- 软件包及其安装:centos中的RPM和YUM、ubuntu中的APT
- Shell编程:常见的可执行脚本、执行脚本程序的解释器、Shell基本介绍、centos7默认的解释器、Shell脚本的执行方式。
- 任务调度
- 系统日志文件位置、系统常用的日志
- 日志管理服务:配置文件、日志文件格式、自定义日志服务:日志轮替、
logrotate
配置文件、日志轮替机制、查看内存日志。 - 定制Linux系统(Linux裁剪)制作min_Linux系统、
Linux0.01
内核源码结构 - Linux备份和恢复:使用
dump
完成备份、使用restore恢复备份 - Centos7启动流程
linux系统编程:
- makefile的入门介绍
- 进程的介绍(进程描述符、进程控制块PCB、父子进程间共享的资源)、多进程创建和回收控制:fork、exec函数族、wait/waitpid函数
- 进程间通信IPC:管道、命名管道FIFO、共享内存mmap/munmap、本地套接字domain
- 线程同步:互斥锁、读写锁、条件变量、信号量
- 信号:阻塞信号集/未决信号集、信号捕捉signal/sigaction函数、sigchild信号(子进程资源释放传给父进程的)
- 文件:文件系统、文件I/O
Linux网络编程:
- 详细的计网知识。
- Socket编程:常见的协议、网络字节序、IP转换函数、sockaddr数据结构、socket文件描述符号
- 基于TCP的socket模型:创建socket函数、bind绑定(命名)socket、listen监听socket、accept接受连接、connect发起连接。
- 基于UDP的socket模型:recvfrom函数、sendto函数。
- C/S模型下,两种协议的实现:
1)TCP实现:TCP三次握手-状态变换-函数调用返回-队列状态综合图、等待2MSL
的意义?、端口复用、TCP连接和释放的过程。
2)UDP实现 - 五种
IO
模型:阻塞BIO
、非阻塞NIO
、IO
多路复用IO Multiplexing
、信号驱动signal-driven
、异步asynchronous
。 - 高并发服务器:多进程并发服务器、多线程并发服务器、多路I/O转接服务器。
- select、poll和epoll的对比
- libevent库:库介绍、源码包的安装、组成、框架、常规事件、使用fifo进行读写实现、基于libevent的TCP通信实现。
数据库:
MySQL数据库:
基础部分:
- 安装和配置
- 常见的约束constraint:not null(非空约束)、default(默认值约束)、primary key(主键约束)、unique(唯一性约束)、foreign key(外键约束)、check(检查约束)。
- SQL语句的执行顺序
- DDL语言、DQL语言(分组查询、多表查询、子查询)、DML语言
- 常见的数据库对象:视图、 存储过程与存储函数。
- 变量、流程控制和游标
- 触发器
- MySQL8.0新增特性:窗口函数、公用表表达式。
进阶部分:
- 字符集的相关操作/比较规则、Centos7中linux下配置字符集、请求到响应过程中字符集的变化
- MySQL的数据目录、MySQL在linux中的主要目录结构、数据库文件存放的路径:
/var/lib/mysql/
- 数据库和文件系统的关系:数据库在文件系统中的表示、表在文件系统中的表示。
- 用户与权限管理:用户管理(创建、修改、删除、修改当前用户的密码、修改其他用户的密码)、权限管理(授予、查看、收回权限、权限表)、角色管理(创建、删除、赋予/回收角色的权限、查看角色的权限、给用户赋予角色、激活角色、撤销用户角色)。
- 逻辑架构剖析、服务器处理客户端请求:连接层、服务层、引擎层、存储层。
- MySQL中SQL的执行流程:
- 存储引擎:查看/修改默认的存储引擎、引擎的对比(InnoDB引擎:具备外键支持功能的事务存储引擎、MyISAM引擎:主要的非事务处理存储引擎、Memory:置于内存的表、CSV引擎:数据以逗号分隔)。
- 数据库缓冲池 vs 查询缓存:查看/设置缓冲池的大小、缓冲池的预读特性。
- 索引:为何要使用索引?、索引的创建与设计原则、索引及其优缺点、InnoDB中常见的索引类型(聚簇索引、二级索引(非聚簇索引)、联合索引)、MyISAM中的索引方案、索引的代价、Hash结构、为什么B+Tree更适合实际操作系统的文件索引和数据库索引?、索引失效的场景。
- 事务:ACID特性、事务并发存在的问题、事务的隔离级别、开启/提交/回滚事务。
- MySQL锁机制:表级锁&行级锁、排他锁&共享锁、InnoDB行级锁、间隙锁、意向共享锁和意向排他锁、死锁、锁的优化建议。
- MVCC多版本并发控制:快照读(
snapshot read
)、当前读(current read
)、*如何通过MVCC实现已提交读和可重复读? - 日志与备份/恢复:错误日志、查询日志、binlog日志、数据备份和恢复、慢查询日志、redo log(物理日志,重做日志)&undo log(逻辑日志,回滚日志)。
- MySQL优化:SQL和索引的优化(统计SQL的查询成本、定位执行慢的SQL:慢查询日志、分析查询语句:explain)、应用的优化(连接池、增加缓存层)、MySQL Server的优化(MySQL查询缓存、索引和数据缓存、MySQL线程缓存、并发连接数量和超时时间)。
- MySQL集群:主从复制、读写分离。
Redis数据库:
基础部分:
- redis五大常见数据结构:字符串String、列表List、集合Set、哈希Hash、有序集合Zset。
- 管道
- 消息队列实现方案:List实现、发布-订阅pub/sub、Stream消息队列。
- 事务
- 持久化:RDB、AOF
- 主从复制、哨兵模式、集群(一致性hash算法、哈希槽分区)
- redis应用存在的问题:缓冲穿透、缓存击穿、缓存雪崩,对应常用的解决方案。
进阶部分:
- redis单线程如何处理并发的客户端,以及为何单线程快?
- 数据库和缓存的一致性:“双检加锁”策略,避免缓存击穿的问题
- 4种更新策略、成熟的工程方案canal(类比传统的MySQL的主从复制,完成监听mysql的变动并通知redis)
- 布隆过滤器:应用场景、原理。
- 缓存创建的问题、redis缓存淘汰机制:三种不同的过期键删除策略、redis缓存淘汰策略
- redis经典的五大类型源码及底层实现:string数据结构(SDS简单动态字符串)(三种编码方式:int、embstr、raw)、hash数据结构、list数据结构、set数据结构、zset数据结构。
- skiplist跳表