• c++后端开发-学习汇总


    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)生产者线程,在等待条件变量的唤醒后,负责当“连接队列为空”且“使用的连接数

    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框架在使用过程中的日志记录。

    本文的要点内容和技术栈:

    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、非阻塞NIOIO多路复用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跳表
  • 相关阅读:
    机器学习笔记之条件随机场(二)HMM vs MEMM
    企业如何防范邮件数据泄露的风险?(含直播预告)
    防止显卡掉卡的一种方法:nvidia-smi -pm 1
    offline 2 online | AWAC:基于 AWR 的 policy update + online 补充数据集
    Linux的命令基本格式
    RDMA测试集:preftest安装与使用
    经过几年和前端调接口,我把抓包调试摸透了,浏览器岂非我对手
    Thread中几个常用的api详解join,interrupt
    uniapp picker 的使用,这玩意做的真不怎么样
    python 基于flask实现的sse 修改eventstream中类型字段
  • 原文地址:https://blog.csdn.net/qq_44599368/article/details/132251775