虾皮 高性能后端 面经
timeline:
- 09-02 投递
- 09-10 笔试
- 09-27 一面
- 10-13 二面
一面
1h
- 自我介绍
- 实习拷打
- 项目拷打
- 面向对象三大特性
- 虚函数,基类和子类的默认参数不同,会发生什么
- 菱形继承怎么解决
- new 和 malloc 的区别
- placement new
- 构造函数有什么缺点吗
- 异常的性能开销是什么,如果是并发场景呢
- 用 memcpy 拷贝对象有什么要注意的吗
- 多线程修改同一个指针是安全的吗,修改指针指向的对象呢
- 用过 STL 里哪些东西
- vector 和 list 一般用在什么场景
- 缓存行大小一般是多少
- 访存具体过程
- 怎么保证缓存一致性,怎么做淘汰
- 伪共享场景优化
- 了解过哪些解决哈希冲突的方法
- mongodb 中怎么做的(打家劫舍)
- 常用的 Linux 指令有哪些
- 用过 awk 吗
- IO 多路复用,多路是指什么(fd),复用的是什么(同一个线程)
- 了解 io_uring 吗(减少了系统调用次数)
- 用过哪些网络框架
- 线程和协程的区别
- 多线程同步有哪些方式
- mutex 可以拷贝吗(不行)
- atomic 可以拷贝吗(不行)
- 单线程获取锁会陷入系统调用吗(有 fast path)
- 硬链接和软链接的区别
- 手撕:LRUCache
- 多线程优化方案
- 无反问
二面
1h
- 自我介绍
- 实习拷打
- 熟悉 C++ 哪个版本
- 讲讲 C++20 的特性
- C++20 的协程和其他语言的协程有什么区别(无栈协程,切换开销低)
- 项目拷打
- 设计一个序列化格式,有整数、浮点数、字符串三种字段
- 顺序存每个字段的类型+数据,注意转换成大端序
- 如果字段要支持随机访问呢
- 包头存每个字段的类型和偏移,解包先解析包头
- 设计一个哈希表的序列化方式,要求能直接 mmap 访问哈希表
- 文件头:存储总的元数据
- 桶数组:存储每个键值对的元数据
- 数据区:连续存储所有键值对
- 详细的序列化步骤
- 确定桶数量,填充文件头
- 按顺序写入每个键值对写到数据区,根据哈希值找到桶(开放寻址处理冲突)
- 将键值对在数据区的偏移和大小写入对应的桶
- 注意所有数据按设计对齐
- 设计一个分布式 KV 存储方案
- 请求路由、哈希分片、主从同步、热点缓存
- 手撕:合并两个有序链表
- 手撕:合并 N 个有序链表
- 反问
- 工作内容:特征存储
- 技术栈:C++17
强度大概975,但是对应届不太友好,很不稳
查看5道真题和解析