【网易】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 还能看什么性能指标?

  • 你有什么问题问我吗

发表评论

后才能评论