360 C++二面总结

1. 先做个自我介绍,重点说说你的学习经历和项目经验

回答要点:

  • 教育背景和专业方向
  • 研究生期间的研究方向和成果
  • 参与的核心项目和技术积累
  • 个人技术特长和兴趣方向
  • 对360和应聘岗位的理解

参考回答:"您好,我是XXX,XX大学计算机专业硕士应届生。本科期间主要学习计算机基础课程,研究生阶段研究方向是分布式系统和高性能计算。

在研究生期间,我参与了导师的两个科研项目和一个企业合作项目。科研项目主要是分布式存储系统的优化,我负责设计了一个基于一致性哈希的数据分片算法,将数据均衡性提升了30%。企业合作项目是为某公司开发高并发Web服务,我负责核心网络模块的开发,使用epoll实现了支持万级并发的服务器框架。

技术方面,我对C++比较熟悉,有扎实的数据结构和算法基础,了解Linux系统编程和网络编程。平时喜欢研究开源项目源码,也在GitHub上维护了一些个人项目。

我对360的安全技术和大数据业务很感兴趣,希望能够加入团队,在实际业务中提升自己的技术能力。"

2. 详细介绍一下你最有挑战性的项目,从背景到实现到成果

回答要点:

  • 项目背景和业务需求
  • 为什么有挑战性
  • 技术方案的选型和设计
  • 遇到的具体技术难点
  • 如何解决这些难点
  • 最终的项目成果和收获

参考回答:"我最有挑战的项目是一个高并发Web服务框架的开发。

项目背景:这是导师和某互联网公司的合作项目,需要开发一个能够支持10万+QPS的HTTP服务框架。原有的服务在高峰期响应时间超过500ms,用户体验很差。

技术方案:我们采用了Reactor模式的架构设计:

  • 主线程负责accept新连接
  • 多个IO线程使用epoll处理网络IO
  • 线程池处理业务逻辑
  • Redis做缓存层,MySQL做持久化

遇到的挑战:

  1. 高并发下的性能瓶颈问题:压测时发现CPU利用率很高但QPS上不去排查:使用perf工具发现大量时间消耗在锁竞争上解决:将全局锁改为分段锁,每个IO线程维护自己的连接队列
  2. 内存管理问题问题:长时间运行后内存持续增长排查:使用Valgrind发现频繁的小对象分配释放解决:实现了对象池和内存池,减少内存分配次数
  3. 惊群效应问题:多个线程同时epoll_wait导致惊群解决:使用EPOLLEXCLUSIVE标志,保证只唤醒一个线程

项目成果:

  • QPS从5000提升到15万+
  • 平均响应时间从500ms降低到20ms
  • CPU利用率从80%降低到40%
  • 内存占用稳定,无内存泄漏

个人收获:这个项目让我深入理解了高并发服务器的设计原理,学会了如何进行性能分析和优化,也积累了解决实际问题的经验。"

3. 你提到了性能优化,具体是如何定位性能瓶颈的?用了哪些工具?

回答要点:

  • 性能分析的方法论
  • 使用的工具和命令
  • 具体的定位过程
  • 优化的思路和效果

参考回答:

性能分析方法:

1. 宏观分析

  • 使用top/htop查看CPU、内存使用情况
  • 使用iostat查看磁盘IO
  • 使用netstat查看网络连接状态
  • 使用vmstat查看系统整体性能

2. 微观分析

  • perf工具:perf top:实时查看热点函数perf record:记录性能数据perf report:分析性能报告发现大量时间消耗在pthread_mutex_lock上
  • 火焰图:使用perf生成火焰图直观看出函数调用关系和耗时占比快速定位性能瓶颈
  • gprof:分析函数调用次数和耗时找出热点函数

3. 代码级分析

  • 在关键路径添加时间统计
  • 使用std::chrono测量函数耗时
  • 分析日志找出慢操作

具体案例:通过perf发现锁竞争严重,进一步分析发现是全局任务队列的锁。优化方案是改为每个线程一个队列,使用无锁队列,性能提升了3倍。

优化思路:

  • 减少锁竞争:降低锁粒度、使用无锁数据结构
  • 减少内存分配:对象池、内存池
  • 减少系统调用:批量操作、缓冲
  • 算法优化:降低时间复杂度

4. 项目中遇到过最难解决的bug是什么?如何排查和解决的?

回答要点:

  • bug的现象和影响
  • 排查的思路和过程
  • 使用的工具和方法
  • 最终的解决方案
  • 从中学到的经验

参考回答:

bug现象:服务在生产环境运行一段时间后会偶发性崩溃,没有规律,复现困难。崩溃时没有core dump文件,日志也没有明显异常。

排查过程:

1. 收集信息

  • 查看系统日志:dmesg发现"segmentation fault"
  • 开启core dump:ulimit -c unlimited
  • 等待下次崩溃获取core文件

2. 分析core文件

  • 使用gdb分析:gdb ./server core.xxx
  • bt查看调用栈,发现崩溃在一个字符串操作函数
  • 但调用栈显示的代码看起来没问题

3. 怀疑内存问题

  • 使用Valgrind检测:valgrind --leak-check=full ./server
  • 发现"Invalid read"错误,访问了已释放的内存
  • 定位到是一个shared_ptr的使用问题

4. 深入分析

  • 发现是多线程环境下的竞态条件
  • 线程A正在使用对象,线程B将对象从容器中删除
  • shared_ptr引用计数变为0,对象被析构
  • 线程A继续访问导致崩溃

解决方案:

  • 使用weak_ptr代替shared_ptr存储在容器中
  • 使用前先lock()转换为shared_ptr
  • 如果对象已被删除,lock()返回空指针,可以安全处理

经验教训:

  • 多线程环境下要特别注意对象生命周期
  • 使用智能指针不代表完全安全
  • 充分的单元测试和压力测试很重要
  • 工具(Valgrind、AddressSanitizer)能帮助发现隐藏的问题

5. 你在研究生期间发表过论文吗?做过哪些科研工作?

回答要点:

  • 研究方向和课题
  • 研究的创新点
  • 遇到的困难和解决方法
  • 研究成果(论文、专利等)
  • 科研对工程能力的帮助

参考回答:

研究方向:我的研究方向是分布式存储系统的负载均衡优化。

研究内容:传统的一致性哈希算法在节点数量变化时,数据迁移量较大,影响系统性能。我提出了一种改进的虚拟节点分配算法,通过动态调整虚拟节点数量,减少了数据迁移量。

创新点

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

C++八股文全集 文章被收录于专栏

本专栏系统梳理C++技术面试核心考点,涵盖语言基础、面向对象、内存管理、STL容器、模板编程及经典算法。从引用指针、虚函数表、智能指针等底层原理,到继承多态、运算符重载等OOP特性从const、static、inline等关键字辨析,到动态规划、KMP算法、并查集等手写实现。每个知识点以面试答题形式呈现,注重原理阐述而非冗长代码,帮助你快速构建完整知识体系,从容应对面试官提问,顺利拿下offer。

全部评论

相关推荐

晚上和一个老哥聊天,加深了自己对一些事情的思考就是一个人在公共场合敢实名表达自己的感受,自己的思考,自己的观点,是一件需要非常非常大勇气的事情,这意味着你触达内心的想法感受,会被大众所注视,审判,而绝大多数人都会异常在意别人对自己的看法,所以当大规模的眼光都看在你身上的时候,这种压力不是谁都能抗下来的。小一点的是在朋友圈写小作文发表自己内心的想法,之前我是能经常看到不少同学吃一个东西 或者 去一个地方玩然后长篇大论写下自己感受的朋友圈,但现在我也很少在朋友圈看到这些内容了,大家是长大了,开始忽略这些感受了,还是越来越不愿意拿出来分享了……大一点是直接做自媒体,更大范围地展示自己,直接向全互联网的人述说自己的经历,表达自己的想法,展示自己性感的大脑,让互联网的所有人凝视你,审判你,赞扬你,诋毁你……说实话,这非常像把自己扒光了游街示众的感觉,只有真正在互联网上实名发表过这种口播视频之后,才懂这种感觉有多奇妙哈哈哈我们不说钱不钱的问题,关说对个人能力的提升,这非常锻炼人,非常非常锻炼人,你的表达能力,你的心理素质都在全方面提升,你的心理抗压能力也会不断提升,因为无论怎么说都有人骂你,你说苹果手机好用,都有人骂你叛国贼[捂脸][捂脸][捂脸]一开始最大的障碍就是怕熟人看到,特别尴尬,怕大家议论你,嘲笑你,但其实真的有那么多人关注你吗?真的有那么多人嘲笑你吗?可能都是自己在臆想,出现幻觉了就算真的有人当面嘲笑你,这又怕什么呢,我始终坚信一个真正从0到1在某个领域做成功一件事的人(标准:得到这个领域人的普遍认可)是不会嘲笑一个开始很笨拙的人,因为谁不是这样走过来的?谁一开始就做的很好,谁刚开始做就很随心所欲,是你吗?一个健身大神会嘲笑一个刚入健身房的新手吗?一个高级程序员会嘲笑一个刚学会打hello world的新手吗?一个减肥成功的人会嘲笑刚开始跑几步路就喘的胖子吗?一个作家会嘲笑刚开始写小作文词不达意语句不通顺的菜鸟吗?一个人但凡能嘲笑你,那就证明他没做成哪怕至少一件事,没在一个领域得到绝大多数人的普遍认可,这种人的嘲笑是多么无力,这是他无能的狂怒,他自己不敢,自己半途而废,他怕你做成了,证明他自己是废物而已(这里说话比较难听)从我刚开始从化学跨行当程序员时,我就开始向外展示这些事情,然后无论在现实里还是在互联网上,我都听过非常非常多嘲笑的声音,否定的声音,所以我一度非常敏感,非常脆弱在大二这一年我几乎不敢见人,我每天吃喝拉撒都在实验室的小工位,我怕出去会被人嘲笑,会被否定,因为随随便便一句话我就能蹲在天台哭一晚上,直到我突然进了美团的日常实习,直到我突然进了字节的暑期实习,直到我秋招又拿了字节的offer,这个时候我已经站在高处,我回头看,我向下看,之前那些否定嘲笑的声音早已听不见,我已经在山上了,而他们又在哪呢?而我发现当时那些鼓励我,认可我,支持我的兄弟们,不是那些已经在某个领域取得一定成果的人,就是那些同样在路上的同伴,好像只有这些人,他们才会对蹒跚学步的新手给予鼓励与帮助……最后居然戏剧性地来了一个callback 呼应了我大一演小品的一句台词且视他人之疑目如盏盏鬼火大胆地去走你的夜路!这是我自己的亲身经验,也是我想表达,传递的内容,想干什么就去干吧,至于别人怎么看,随他吧,反正弱者才会嘲笑你,强者都会向你伸出援手……
牛友故事会
点赞 评论 收藏
分享
评论
点赞
2
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务