今天一天走完了奇安信的流程,虽然比较累,但是很开心,终于有一家公司走完流程了。
提前批一面(75min)
- 自我介绍
- 堆排序和快排的平均时间复杂度和最坏时间复杂度
- 哈希表实现
- 哈希表线程安全问题
- 红黑树
- 红黑树和哈希表的场景
- 从内存池实现,聊到对象池、
ptmalloc
,还有一个比较有意思的问题:内存池分配出去的内存,怎么检测访问越界?例如调用memset
的时候越界。- 使用hook的方法,将
memset
封装起来,对外提供封装版本的menset
函数,内存池的内存块除了内容以外,使用起始的 4 个字节记录内存块的内容区域的大小。memset
被调用的时候,会比较内存块大小和传进来得len
。如果len
更大,内存访问就越界,抛出异常。面试官提到这个方案的一个问题:没法检测得到p + 5
的这种情况。
- 使用hook的方法,将
ping baidu.com
的请求过程,尽可能详细地描述- TCP 滑动窗口的作用
- 介绍项目,介绍到日志系统的时候,面试官提到无锁队列(多写者单读者)
- 提问环节
一面面试官体验很好,还给我介绍了微软的工具包,里面有很多无锁队列。
提前批二面(50min)
strcpy
会拷贝字符串最后的/0
吗?new
和malloc
的区别- 现有一程序崩溃了,且知道了崩溃的代码,需要通过调试,获得该行被调用了多少次之后程序才崩溃:
- 程序运行很久才能到崩溃的地方,但是程序编译很快
- 程序编译很久,但是很快就能运行到崩溃的地方
- 我们有程序的源代码和编译环境,需要检查程序的内存泄漏情况:
- 内存池
- 类似
tcmalloc
的思路 - 类似
valgrind
的思路 - 对象的构造函数、析构函数中统计内存使用量
- 面试官提示换种思路,不从系统库替代的层面考虑,通过观察任务管理器。
- 内存泄漏在循环或者递归中,可以观察到内存突然暴增,循环或者递归结束,程序内存趋于平稳
- 内存泄漏不在在循环或者递归中,因为我们有源代码,可以将
main
函数逻辑放到一个循环中(面试官提示)
- 常见的代码缺陷
char c = fgetc(fp);
这行代码会有什么问题?- 十万以内的不相等的数字,使用时间复杂度最优的方法排序(桶排序 + bitmap 优化空间)
- 类似老鼠试毒的智力题
- (我简历上的)项目的来源、测试性能
二面的面试体验是春招依赖最好的,面试官说了很多遍“很不错”,还跟我说:“跟你说实话,今天都没其他说过这话”,这也太直率了,赞。讨论调试内存泄漏情况的时候,还说:“不要有压力,前面回答得已经很好了,现在只是在考察思考深度,没想到也没关系”。后面从hr那了解到面试官是做代码卫士的,保证代码安全性。难怪问了调试方面的场景题和代码缺陷(这名词还是第一次在面试中被问到)。
提前批hr面(50min)
hr面比较常规:
- 个人信息、学校情况
- 实习内容和收获
- 平时的学习方法
- 兴趣爱好
- 秋招公司、偏向
- 提问环节
总结
奇安信的面试体验实在太好了,特别是二面的体验。这也算最近比较顺利的面试,希望能拿到offer,安慰安慰最近被虐的心灵。
关于sp
有点狂了,开始打sp的坏主意了。请教一下大家,我从hr那了解到,两面面试官对我的评价还蛮好的,尤其是二面面试官。如果能拿到offer,不知道能不能依据这个 argue sp。当然前提是要先能拿到offer。有其他offer,对于 argue sp 有帮助。
全部评论
(7) 回帖