腾讯天美面经
- 自我介绍
- placement new?我:啥玩意没听过
- 虚函数会吧
- 内联函数
- 虚函数可以是内联的吗
- mysql acid
- mysql mvcc 隔离级别实现原理什么一套都讲了
- protobuff的优缺点?缺点不会
- C++11的智能指针
- B+ B树 红黑树区别
- 同步异步
- 阻塞非阻塞
- 可以同步非阻塞吗?我答得是可以
- epoll和select区别
- epoll是同步的还是异步的?
- 协程?
- 对称协程和非对称协程?不会
- udp和tcp区别?讲完区别,又从wireshark讲起tcp,然后如何网络优化分析
- redis的跳表
- redis几种基本数据结构?
- 怎么用的zookeeper?底层原理是什么?不会底层
- LRU怎么实现的?
- 协程为什么叫用户态线程?
- 动态规划和贪心区别?答的一般
- 动态规划可以得到全局最优解吗?可以
- 动态规划时间复杂度?看题,可能O(n)可能O(n^2)
- 只有一个数字出现奇数剩下都是出现偶次数,如何快速得到值?异或
- 长度最小的子数组(lc209题,我用的滑动窗口)面试官非说我错了,是有点边界问题改完他还说我是错的,不能这么写,讲了几次还觉得我是错的,最后面试官亲自改测试例子也证明了代码没有问题。
- 反问 休闲类游戏组,帮别人面试的
- 一致性算法?不会
- 分布式了解吗?不太了解
面完我还觉得应该是可以过的吧,结果面完就秒挂了,看到流程已结束的那几个字我第一反应就是这就离谱,该不会是离谱回家了吧,该不会就是传说中的KPI面试吧,冷静思考,没人那么闲会浪费自己的1个小时。
转过头复盘一下,面试官觉我很多东西没啥深度比如zookeeper只会用不懂里面原理,protobuf没有理解细节等等,很多东西没有深入的理解。
反思了2022这一年,从接今年3月接到腾讯实习以后就开始摆烂了,7月份实习,边实习边准备秋招,8月底拿了个不错公司(一个中厂大佬们瞧不上,但我自己喜欢就行)就又开始摆烂了。
转语言是不可能转语言的,誓与C++共存亡,功夫不负有心人,目前上岸了,直接上图:
还不熟悉的朋友,这里可以先领取一份Linux c/c++开发新手学习资料包(入坑不亏):
接下给大家分享我的上岸经历,这里给大家推荐零声教育全网独家的【Linux C/C++开发】课程体系,通过原理技术+源码分析+案例分析+项目实战,全面解析Linux C/C++,8个上线项目,2W+行手写代码,全面解析:
1、精进基石专栏
(一)数据结构与算法
- 随处可见的红黑树
- 红黑树的应用场景进程调度cfs,内存管理
- 红黑树的数学证明与推导
- 手撕红黑树的左旋与右旋
- 红黑树添加的实现与添加三种情况的证明
- 红黑树删除的实现与删除四种情况的证明
- 红黑树的线程安全的做法
- 分析红黑树工程实用的特点
- 磁盘存储链式的B树与B+树
- 磁盘结构分析与数据存储原理
- 多叉树的运用以及B树的定义证明
- B树插入的两种分裂
- B树删除的前后借位与节点合并
- 手撕B树的插入,删除,遍历,查找
- B+树的定义与实现
- B+树叶子节点的前后指针
- B+树的应用场景与实用特点
- B+树的线程安全做法
- 海量数据去重的abhloriter bitap
- hash的原理与hash函数的实现
- hash的应用场景
- 分布式hash的实现原理
- 海量数据去重布隆过滤器
- 布隆过滤的数学推导与证明
(二)设计模式
- 创建型设计模式
- 单例模式
- 策略模式
- 观察者模式
- 工厂方法模式与抽象工厂模式
- 原型模式
- 结构型设计模式
- 适配器模式
- 代理模式
- 责任链模式
- 状态模式
- 桥接模式
- 组合模式
(三)c++新特性
- stI容器,智能指针,正则表达式
- unordered_ _map
- stl容器
- hash的用法与原理
- shared_ ptr,unique_ ptr
- basic_ regex,sub_ match
- 函数对象模板function, bind
- 新特性的线程,协程,原子操作,lamda表达式
- atomic的用法与原理
- thread_ local 与condition_ var iable
- 异常处理exception_ _ptr
- 错误处理error _ category
- coroutine的用法与原理
(四)Linux工程管理
- Makefi le/ cmake/conf igure
- Makefile的规则与make的工作原理
- 单文件编译与多文件编译
- Makefile的参数传递
- 多目录文件夹递归编译与嵌套执行make
- Makefile的通配符,伪目标,文件搜索
- Makefile的操作函数与特殊语法
- configure生成makefile的原则
- cmake的写法
- 分布式版本控制git
- git的工作流程
- 创建操作与基本操作
- 分支管理,查看提交历史
- git服务器搭建
- Linux系统运行时参数命令
- 进程间通信设施状态ipcs
- Linux系统运行时长upt ime
- CPU平均负载和磁盘活动iostat
- 监控,收集和汇报系统活动sar
- 监控多处理器使用情况mpstat
- 监控进程的内存使用情况pmap
- 系统管理员调优和基准测量工具nmon
- 密切关注Linux系统glances
- 查看系统调用strace
- ftp服务器基本信息ftptop
- 电量消耗和电源管理powertop
- 监控mysq| 的线程和性能mytop
- 系统运行参数分析htop/top/atop
- Linux网络统计监控工具netstat
- 显示和修改网络接口控制器ethtool
- 网络数据包分析利刃tcpdump
- 远程登陆服务的标准协议teInet
- 获取实时网络统计信息iptraf
- 显示主机上网络接口带宽使用情况iftop
2、高性能网络设计专栏
(一)网络编程异步网络库zvnet
- 网络io与io多路复用select/poll/epoll
- socket与文件描述符的关联
- 多路复用select/poll
- 代码实现LT/ET的区别
- 事件驱动reactor的原理与实现
- reactor针对业务实现的优点
- poll封装send_ cb/recv_ _cb/ accept_ _cb
- reactor多核实现
- 跨平台(select/epoll/kqueue)的封装reactor
- redis,memcached, nginx网 络组件
- http服务器的实现
- reactor sendbuffer与recvbuffer封装http协议
- http协议格式
- 有限状 态机fsm解析http
- 其他协议websocket, tcp文件传输
(二)网络原理
- 服务器百万并发实现(实操)
- 同步处理与异步处理的数据差异
- 网络io线程池异步处理
- ulimit的fd的百万级别支持
- sysctI. conf的rmem与wmem的调优
- conntrack的原理分析
- Posix API与网络协议栈
- connect,listen, accept与三次握 手
- listen参数backlog
- syn泛洪的解决方案
- close与四次挥手
- 11个状态迁移
- 大量close_ wait与time wait的原因与解决方案
- tcp keepalive与 应用层心跳包
- 拥塞控制与滑动窗口
- UDP的可靠传输协议QUIC
- udp的优缺点
- udp高并发的设计方案
- qq早期为什么选择udp作为通信协议
- udp可靠传输原理
- quic协议的设计原理
- quic的开源方案quiche
- kcp的设计方案与算法原理
- 协程调度器实现与性能测试
- 调度器的定义分析
- 超时集合,就绪队列,io等待集合的实现
- 协程调度的执行流程
- 协程接口实现,异步流程实现
- hook钩子的实现
- 协程实现mysql请求
- 协程多核方案分析
- 协程性能测试
(三)自研框架:基于dpdk的用户态协议栈的实现(已开源)
- 用户态协议栈设计实现
- 用户态协议栈的存在场景与实现原理
- netmap开源框架
- eth协议,ip协议, udp协议实现
- arp协议实现
- icmp协议实现
- 应用层posix api的具体实现
- socket/bind/listen的实现
- accept实现
- recv/send的实现
- 滑动窗口/慢启动讲解
- 重传定时器,坚持定时器,time_ wait定时器,keepalive定时器
- 手把手设计实现epoll
- epoll数据结构封装与线程安全实现
- 协议栈fd就绪回调实现
- epoll接口实现
- LT/ET的实现
- 高性能异步io机制io_ _uring
- 与epo1l媲美的io_ uring
- io_ _uring系统调用io_ _uring_ setup, io_ _ur ing_ register, io_ _ur ing_ enter
- liburng的io_ uring的关系
- io_ uring与epoll性能对比
- io_ _uring的共享内存机制
- io_ uring的使用场景
- io_ ur ing的accept, connect, recv, send实现机制
- io_ uring网络读写
- io_ uring磁盘读写
- proactor的实现
3、基础组件设计专栏
(一)池式组件
- 手写线程池与性能分析(项目)
- 线程池的异步处理使用场景
- 线程池的组成任务队列执行队列
- 任务回调与条件等待
- 线程池的动态防缩
- 扩展: nginx线程池实现对比分析
- 内存池的实现与场景分析(项目)
- 内存池的应用场景与性能分析
- 内存小块分配与管理
- 内存大块分配与管理
- 手写内存池,结构体封装与API实现
- 避免内存泄漏的两种万能方法
- 定位内存泄漏的3种工具
- 扩展:nginx内存池实现
- mysq|连接池的实现(项目)
- 连接池性能的影响的2个因素,top连接和mysq|认证
- 连接请求归还策略
- 连接超时未归还策略
- 链接断开重连策略
- 连接数量最优策略
(二)高性能组件
- 原子操作CAS与锁实现(项目)
- 互斥锁的使用场景与原理
- 自旋锁的性能分析
- 原子操作的汇编实现
- 无锁消息队列实现(项目)
- 有锁无锁队列性能
- 内存屏障Barrier
- 数组无锁队列设计实现
- 链表无锁队列设计实现
- 网络缓冲区设计
- RingBuffer设计
- 定长消息包
- ChainBuffer 设计
- 双缓冲区设计
- 定时器方案红黑树,时间轮,最小堆(项目)
- 定时器的使用场景
- 定时器的红黑树存储
- 时间轮的实现
- 最小堆的实现
- 分布式定时器的实现
- 手写死锁检测组件(项目)
- 死锁的现象以及原理
- pthread_ _mutex_ lock/pthread_ _mutex_ _unlock dIsym的实现
- 有向图的构建
- 有向图dfs判断环的存在
- 三个原语操作 lock before, lock_ after, unlock_ after
- 死锁检测线程的实现
- 手写内存泄漏检测组件(项目)
- 内存泄漏现象
- 第三方内存泄漏与代码内存泄漏
- malloc与free的dIsym实现
- 内存检测策略
- 应用场景测试
- 手把手实现分布式锁(项目)
- 多线程资源竞争互斥锁
- 自旋锁
- 加锁的异常情况
- 非公平锁的实现
- 公平锁的实现
(三)开源组件
- 异步日志方案spdlog (项目)
- 日志库性能瓶颈分析
- 异步日志库设计与实现
- 批量写入与双缓存冲机制
- 奔溃后的日志找回
- 应用层协议设计ProtoBuf(项目)
- IM, 云平台,nginx, http, redis协议设计
- 如何保证消息完整性
- 手撕protobuf IM通信 协议
- protobuf序列化与反序列化
- protobuf编码原理
4、中间件开发专栏
(一)Redis
- Redis相关命令详解及其原理
- string,set, zset, Iist,hash
- 分布式锁的实现
- Lua脚本解决ACID原子性
- Redis事务的ACID性质分析
- Redis协议与异步方式
- Redis协议解析
- 特殊协议操作订阅发布
- 手撕异步redis协议
- 存储原理与数据模型
- string的三种编码方 式int, raw, embstr
- 双向链表的list实现
- 字典的实现,hash函数
- 解决键冲突与rehash
- 跳表的实现 与数据论证
- 整数集合实现
- 压缩列表原理证明
- 主从同步与对象模型
- 对象的类型与编码
- 广字符串对象
- 列表对象
- 哈希对象
- 集合对象
- 有序集合
- 类型检测与命令多态
- 内存回收
- 对象共享
- 对象空转时长
- redis的3种集群方式主从复制,sentinel, cluster
- 4种持久化方案
(二)MySQL
- SQL语句,索引,视图,存储过程,触发器
- MySQL体系结构,SQL执行流程.
- SQL CURD与高 级查询
- 视图,触发器,存储过程
- MySQL权限管理
- MySQL索引原理以及SQL优化
- 索引,约束以及之间的区别
- B+树,聚集索引和辅助索引
- 最左匹配原则以及覆盖索引
- 索引失效以及索引优化原则
- EXPLAIN执行计划以及优化选择过程分析
- MySQL事务原理分析
- 事务的ACID特性
- MySQL并发问题脏读,不可重复读,幻读
- 事务隔离级别
- 锁的类型,锁算法实现以及锁操作对象
- S锁X锁|S锁IX锁
- 记录锁,间隙锁,next-key lock
- 插入意向锁,自增锁
- MVCC原理剖析
- MySQL缓存策略
- 读写分离,连接池的场景以及其局限a
- 缓存策略问题分析
- 缓存策略强一致性解决方案
- 缓存策略最终一致性解决方案
- 2种mysql緩存同步方案从数据库与触发器+udf
- 缓存同步开源方案go-mysql-transfer
- 缓存同步开源方案canal原理分析
- 3种缓存故障,缓存击穿,缓存穿透,缓存雪崩
(三)Kafka
- Kafka使 用场景与设计原理
- 发布订阅模式
- 点对点消息传递
- Kafka Brokers原 理
- Topi cs和Partition
- Kafka存 储机制
- Partition存储分布
- Partition文件存储机制
- Segment文件存储结构
- offset查找message
- 高效文件存储设计
- 微服务之间通信基石gRPC
- gRPC的 内部组件关联
- CI ientS ide与ServerSide, Channel, Ser ivce, Stub的概念
- 异步gRPC的实现
- 回调方式的异步调用
- Server 与CI ient对RPC的实现
- 基于http2的gRPC通信协议
- 基于http协 议构造
- ABNF语法
- 请求协议Request-Headers
- gRPC上下文传递
(四)Nginx
- Nginx反 向代理与系统参数配置conf原理
- Nginx静态文件的配置
- Nginx动态接口代理配置
- Nginx对Mqtt协议转发
- Nginx对Rtmp推拉流
- Openresty对Redis缓存数据代理
- shmem的三种实现方式
- 原子操作
- nginx channel
- 信号
- 信号量
- Nginx过滤 器模块实现
- Nginx Filter模块运行原理
- 过滤链表的顺序
- 模块开发数据结构 ngx_ str_ _t,ngx_ list_ t,ngx_ buf_ t,ngx_ chain_ t
- error日志的用法
- ngx_ comond_ t的讲解
- ngx_ http_ _module_ _t的执行流程
- 文件锁,互斥锁
- slab共享内存
- 如何解决 "惊群”问题
- 如何实现负载均衡
- Nginx Handler模块实现
- Nginx Handler模块运行原理:
- ngx_ module_ t/ngx_ http_ module_ t的讲解
- ngx_ http_ top_ body_ filter/ngx_ http_ _top_ header_ filter的 原理
- ngx_ rbtree_ t的使用方法
- ngx_ rbtree自定义添加方法
- Nginx的核心数据结构ngx_ cycle_ t,ngx_ event. _moule_ t
- http请求的11个处理阶段
- http包体处理
- http响应发送
- Nginx Upstream机制的设计与实现
- 模块性能测试