面试经历: 9月份开始校园招聘,标准的校招流程,2次技术面+1次hr面,顺利拿到offer
所有面试都在广州大学城进行 面试官提的问题: 一面:
基础知识:1.编码中有没遇到过野指针的情况(有,C++ class的深复制、浅复制)
2.关于C++异常的处理(答了构造函数中要注意捕捉异常的情况,若在构造函数中申请一块内存后,程序没有捕捉异常就结束,之前申请的内存是没有释放的)
操作系统:1.进程与线程的区别
Linux中进程与线程的结构是一致的(不知道现在新版本内核还是不是这样),只是线程通常只有自己的堆栈和寄存器,多个线程共享同一个进程的数据,同时线程切换的时间远小于进程切换的时间
2、怎么解决线程的竞争
锁、信号量
3.堆与栈的区别
堆通常由程序员分配、释放,系统不会自动释放,地址不一定是连续的(管理内存分配的数据结构是链表),堆的大小受限于计算机系统中有效的虚拟内存
栈由编译器分配、释放,用于存放函数参数、局部变量等,栈的最大容量是系统预先规定好的
两者地址增长的方向是相反的
数据结构:1.用hash、红黑树、b-tree、二叉搜索树做索引的区别(自己谈了一下不同数据结构做索引的优缺点、时间复杂度)
2.假设用户的ID都是大于0的int型整数,怎么快速提供用户的在线状态查询
简单的做法可以是用一个int的数组来记录用户的状态,以用户ID作为索引,用0/1表示用户的状态
假如有上千万的用户呢,如何减小内存的开销?
可以使用bitmap,使用一个bit表示用户的状态,内存使用减少了32倍(原来需要32bit来表示用户的状态)
网络: select和epoll的区别
二面
基础知识:1.C/C++中传值的方式(值传递,指针,引用) 2.struct的内存对齐
项目: 1.项目用到了哪些技术 2.服务最多支持多少并发(要做压测,了解自己写的程序的性能)
网络: 服务器的设计方案,不同方案的优缺点(一个客户端一个进程、一个客户端一个线程、异步IO……可以参考Unix网络编程)
算法:1.集合中的元素都是整数,求两个集合的交集 2.如果两个集合是有交集的,我们认为这两个集合是一类的,现有N个集合,求他们的所有的分类