快手-二面-2023年9月14日
每次大厂面试都是一次道心破碎的折磨。
- 自我介绍
- 算法:第 k个max。快排的思路,对pivot二分找order,然后就可以排除一半。平均复杂度是O(n)
- C++
- 多态。静态多态和动态多态。实现原理。静态实现有模板和重载,为什么C里没有函数重载。动态实现虚表,虚表的实现和查找过程。主要是在子类对象中包含有一个虚表的指针,每个类都有自己的虚表,找到对应的类的虚表,再在虚表上查找真正的函数地址。
- 类型转换。const/static/dynamic/interpreter的区别。其中,dynamic是什么时候判断是否能转换(运行时RTI?),会返回什么(空指针)
- program once有什么用
- const 修饰类函数
- 操作系统
- 内核和用户态的使用。切换需要什么代价。
- 线程同步方式。互斥锁、读写锁、自旋锁区别。适用什么场景。比如自旋锁主要适用短小的互斥代码逻辑。判断依据是执行互斥代码逻辑开销小于线程沉睡唤醒的切换开销。
- 开放题:重I/O服务器如何优化性能。
- I/O多路复用模型。select,poll,epoll。有什么区别。
- 提示:比如epoll模式中,考虑CPU占用率高的话可能在哪些部分。比如系统调用,用户态到内核态的切换会有损耗。如何减小这个开销。提了一个批处理思路。还给了一个DMA技术。
- epoll水平触发和边缘触发的实现。边缘触发的话, 如果有100 byte,然后读了50byte,之后再来了2byte数据,那剩下52byte数据会触发事件回调吗
- 协程的了解。对比线程如何降低了切换开销。
- 线程和进程的共享内存有什么区别。提示了一个生命周期。
- TCP首部的字段包含哪些字段。拥塞控制的实现:慢启动、拥塞避免、快重复、快恢复。阈值的设定依据。TCP四次挥手,最后一次ACK发出以后可以直接退出了吗。要等待一段时间,为什么。等待时间(2MSL)是怎么设定的。
- 项目。
- OSG是啥,用了干嘛。
- 今年的实习项目做什么。做的算法。
- 反问。
- 业务:音视频大部门下的流量中心,比如CDN处理等。技术栈大概有:网络、系统比如协议栈的优化、流媒体多媒体技术比如视频封装、业务理解和平台搭建等,涉及java和go。
- 研发大概有7/80人,base深/杭/北京。
复盘晚点发。