【网易】C++岗-一面一小时,被问到爆炸!
网易一面
自我介绍和项目介绍
-
简单自我介绍下吧
-
- balabala
-
你对哪方面是最熟的,是不是Linux C++ 或者说是最感兴趣?
-
- 表达自己倾向基础方向开发
-
问下项目经历吧,能不能详细介绍下这个项目里做了哪些事情,解决了什么问题啊?
-
- 详细的介绍了项目和之前准备好的一个问题(socket方向的,自己通过 netstat 等监控工具排查问题经过,讲得很详细,感觉面试官比较满意)
-
你中间有没有去提升或者改善性能啊,比如说改参数啊或者调整什么机制,有没有这方面的努力?
-
- 也是简单介绍了下自己怎么优化的,达到了什么效果(QPS)
-
蛮多和项目相关的问题就不细说了,反正就是大家准备项目的时候提前准备一些比如遇到的困难、如何解决的、性能如何、如何优化这样子的问题。
基础
-
你对 Linux 内核 IO 机制有没有了解,就比如说 select 和 epoll 有什么差别?
-
- 哈哈哈问到这个问题我就笑了,然后就开始先说差别,比如select 有文件描述符限制,频繁的内核态和用户态拷贝、O(n)遍历这些,然后讲了 select 和epoll 都是基于文件系统中 file_operations 的 poll 调用,然后开始详细讲 epoll,大概讲到了内核用红黑树维护监听描述符,就绪队列,回调函数机制避免O(n)的遍历这些,答完面试官就说说得比较全面深入。
-
刚才你说你用 netstat 命令去检查连接状态,你能不能说下这个命令是做什么,看到的链接状态会有哪些?
-
- 就讲了ESTABLISHED、SYN_RCVED、CLOSE_WAIT、TIME_WAIT(故意最后答这个引过来)
-
如果是你在部署某一个程序服务的时候,看到大量的TIME_WAIT连接是怎么回事?
-
- 分析了 TIME_WAIT 是主动关闭一方,所以服务器应该是有大量短连接请求
-
那么大量的 TIME_WAIT 会导致什么问题呢?
-
- 大概从端口占用 2 MSL 不能使用,可能导致后续没有端口接受新连接之类方向分析
-
那我们怎么去避免这个问题,避免大量 TIME_WAIT
-
- 讲了设置 socket 选项 SO_LINGER 或者设置 SO_REUSEADDR 让端口和地址重用
-
平时用什么语言,做什么开发?
-
- C++ 一般用来和网络 Linux 相关的开发, Java 的话是偏 Web 后端, Python一般是写脚本或者爬虫也有用后端框架
-
Python的话用到过装饰器吗?
-
- 嗯,然后讲了装饰器来干嘛,比如无侵入的增加函数功能(比如计时),有点类似 Java 注解,支持 AOP 编程。乱扯了一堆…
-
那 Java 你有哪些了解得常用设计模式?
-
- 讲了装饰器模式和在 jdk IO 流中的运用,单例模式
-
那单例我们一般用来做什么?
-
- 只需要一个对象的场景,比如数据库连接池、文件系统这种。。。
-
了解过 Java 里面的线程安全问题吗?
-
- 感觉不妙引到 Java 上来了,赶紧给面试官说自己 Java 不是很熟悉,讲下 C++ 中的吧,然后开始 C++ 的问题
-
讲下 C++ 里虚函数
-
- 虚函数表 虚函数表指针 函数指针 动态绑定 基类指针指向派生类对象这些,还有接口设计方面
-
在 C++ 里面结构体和类的区别
-
- 默认访问权限 + 一点其它自己的使用感觉
-
用过智能指针吗,能不能介绍下它解决的问题和你使用的经验?
-
- 首先讲了裸指针生命周期管理的困难,内存泄漏、野指针这些
- 然后讲了智能指针是如何利用 RAII 来解决的,然后顺便提了那几个智能指针区别
- 讲了自己项目中如何利用 shared_ptr 的,还有如何用 weak_ptr 解决环形引用的
-
刚才你提到内存泄漏,那你是如何在 debug 发现或者是定位内存泄漏的呢?
-
- 讲了下 Valgrind 套件下的 memcheck
-
那后面用了智能指针之后你再去跑内存泄漏有减少吗?
-
- 嗯,工具检测没有内存泄漏发生了
-
可以讲下树的深度遍历和广度遍历
-
- 前 中 后 用栈或者递归
- 层次 用队列
-
讲一下 hash 表
-
- 详细讲了下 STL unordered_map 底层
-
那哈希表冲突怎么解决?
-
- 线性探测和平方探测,说了这两个有主聚集和次聚集缺点
- 大多数语言 map 用的是开链法
-
如何判断链表是否有环?
-
- 说了用 set 和快慢指针两种
-
OK,我问几个操作系统方面的问题哈
OS
-
你知道 copy on write 吗
-
- 详细讲了 fork 的COW, 锁定父子进程页表只读,任何一进程写时就分配页框复制之类,顺便还提了下 C++ 中 COW 在string 上的应用
-
实现进程间通信的方式
-
- 匿名管道 有名管道 共享内存 信号量 消息队列 socket, 然后强调自己偏向使用 socket 通信,因为方便将单机多进程扩展到多机多进程
-
你单机开发和实验用的什么 Linux 开发版啊?
-
- 讲了 Ubuntu 和 deepin
-
了解一些运维命令吗,比如你在测试的时候怎么看负载啊
-
- 答了 top
-
后面详细问了 top, 比如问我知道 Load Avg 代表什么含义,进程的 CPU 利用率会超过 100% 吗,top 还能看什么性能指标?
- 你有什么问题问我吗