360 服务端C++一面凉经

1. 自我介绍
2. 你实现的线程库是怎么实现的(讲了clone & futex)
3. futex介绍一下(快速用户空间互斥体,不用频繁陷入内核,高效)
4. 为什么频繁陷入内核效率会低?(频繁上下文切换,寄存器转移等)
5. 实现线程库的场景和原因?(只是个人尝试,没有场景)
6. 服务端开发的技术点?(TCP、IO多路复用、Unix网络编程)
7. http熟吗?(只了解http不同版本间的区别,和https是http加ssl。面试官说不熟就不问了)
8. tcp头部?(端口号、标识号,然后居然记错目的IP和源IP…面试官表示诧异马上想起是IP层,之后的忘了…可能是伏笔)
9. 知道TCP的keepalive吗?(调用不清楚,但大概讲了一下keepalive是什么机制,有什么好处(避免频繁链接和关闭的开销))
10. keepalive如何实现的?如果是你怎么实现(额,口胡了一下底层保留链接状态…然后面试官提示了不知道对方是否还在链接和原理是心跳,马上说对方可以设置定时器,到期则发送一个数据包告知我还活着…面试官点了点头)
11. TCP和UDP的区别?(TCP有链接UDP无连接,UDP使用场景和TCP不同,其他没想起来…)
12. 为什么TCP是可靠的?(确认机制和数据包序号,确保对方已经接收到数据了)
13. socket编程的接口(socket()+bind()+listen()+accept() ,socket() + bind() + connect())
14. 返回的文件描述符是随机的还是什么?(返回最小,有用这种技术来实现对标准IO的重定向等)
15. accept()为什么要放在循环里?(不知道…口胡说可能有多个客户端多个请求)
16. 那这样是不是多个客户端同时请求就会漏(额…我不是很清楚里面怎么实现,但应该有些排队机制…另一个伏笔)
17. IO多路复用讲一下
* select(): 使用,缺点是文件描述符有限制,用户空间和内核交互的数据较多,效率低
* poll():使用,缺点也有用户空间和内核交互的数据多,效率低;比select好的地方是不用大范围轮询,轮询参数数组即可,且不用每次调用重置数据
* 信号驱动IO:注册SIGIO的处理函数,问题是信号不排队可能会漏,可以通过fcntl改变SIGIO改成实时信号解决,但排队超过限制会恢复成SIGIO
* epoll():相比select和poll和内核交互的数据相对少,维护感兴趣fd,有IO事件发生则加入内核等待队列,只返回等待队列,epoll()常用于多fd但稀疏活跃的场景
18. select()适合什么场景(少且密集型的)
19. 写过C++吗?用什么环境,什么编译器?编译器版本?
20. 了解过的C++11新特性(移动语义、lambda【给自己挖坑】、auto,其他一时没记起来)
21. 移动语义有什么好处?(相对拷贝语义快,移动而不是拷贝。比如实现移动构造函数+移动赋值运算符的话,在有动态内存分配时只需要复制地址即可)
22. 拷贝语义为什么慢?(拷贝有大数据对象时开销较大。还有别的吗?拷贝时有动态内存分配时需要深拷贝)
23. lambda说一下(匿名的可调用对象。闭包了解吗?不了解…只是用过lambda,在语句较短且一次性使用时可以不用写一个重载调用运算符的类)【百度了一下闭包就是由函数和与其相关的引用环境组合而成的实体,这不就是lambda的语义吗,不了解概念把自己坑了】
24. 容器用过什么?(vector、map、set)
25. map底层?(红黑树。查找效率?完全平衡,logN。key是有序的还是value是有序的?key。类对象可以作为key吗?可以,但要重载<号。面试官点了点头)
26. 使用[]但下标在原map不存在时会发生什么?([]操作必会插入,但没有指定value的话就是初始值)
27. 插入是O(1)的容器?(unordered_map。用过吗?用过。对插入查询时间复杂度要求高就可以使用unordered_map,有序可能会用map)
28. vector内存是连续的吗?如何增长?(扩容,1.5或2.0扩容。2.0的实现是什么编译器?G++)
29. 如果已经有1G,插入一个新元素,那么翻倍会导致变成2G,你会怎么解决?(我可能会用deque,deque是不同缓冲区连在一起,插入一个新元素若不够则只会增加一个缓冲区的大小,不会翻倍。)
30. 进程的段?(.text/.rodata/.data/.bss/.heap/.stack/进程信息/内核)
31. 堆和栈是挨着的吗?(人懵了…回答:看起来挨着但他们之间会有一个空隙。堆栈增长方向?栈往下堆相反)
32. 如何减少内存泄露(类的话会在析构中delete,在外面的话new和delete需要一一对应,实在没办法就编译了使用valgrind来检测,Linux也有系统调用可以检测内存泄露但具体名字忘了。ps:我居然忘了智能指针…$¥#¥%)
33. 什么是可重入函数?(调用之后无论从哪里断开,其他线程再调用这个函数不会对之前的线程产生影响。不可重入的话可能是对全局变量的修改之类的。面试官不置可否的表情让人心慌…)
34. 有什么要问的?(我:有什么建议吗?面试官:实践是不是比较少?说实话听到这个评价人有点懵…这太打击leng了。但想到其他dalao那么强…只能回答额,对,可能是相对少了些,实践可能欠缺一点)
35. 最近在看什么书?(Linux系统编程手册(TLPI),Unix环境高级编程之类的)

几分钟后收到感谢信…360真滴痛快,有点快嗷

总结:全程40分钟,面试官很和蔼,我人很菜。以后尽量不给自己挖坑,这一次给自己挖了lambda…
各位大佬多提提建议帮我提高提高
#面经##C++工程师##360公司##校招#
全部评论
这么多答出来还挂了?
1 回复 分享
发布于 2019-09-12 13:33
tql
点赞 回复 分享
发布于 2019-09-12 13:30
这还挂了?
点赞 回复 分享
发布于 2019-09-12 13:41
😂你是一边回答一边记录吗
点赞 回复 分享
发布于 2019-09-12 14:50
答出来这么多竟然也挂了,看来360要求很高啊
点赞 回复 分享
发布于 2019-09-12 14:53
tql
点赞 回复 分享
发布于 2019-09-12 15:04
为啥我上来甩四个代码题🤣,都没怎么问基础
点赞 回复 分享
发布于 2019-09-12 16:18
话说我也是合工大,也是服务端,也是C++,然后并没有这多问题,上来先写个代码
点赞 回复 分享
发布于 2019-09-12 16:30
这么多。。。
点赞 回复 分享
发布于 2019-09-16 14:40

相关推荐

4 70 评论
分享
牛客网
牛客企业服务