百度提前批第一轮+第二轮 C++/PHP/Go研发工程师
第一轮:
1.进程和线程的区别?
2.HTTP和HTTPS的区别以及HTTPS的加密过程?(又问到了,还好复习了)
3.TCP/IP四层参考模型?
4.为什么采用IP寻址而不采用MAC寻址,具体能说说吗?
这个没有回答上来,但面试官一直追问......。
5.了解过哪些设计模式?
6.单例模式和工厂模式有什么好处?
面试官追问:"还了解过其它设计模式吗?",我:"对这两种设计模式比较熟悉"(高情商回答,哈哈)。
手撕代码:
1.LC21 合并两个有序链表。
2.LC124 二叉树中的最大路径和。(没调出来,难受)
第一轮感受:主要是上述两个问题没答出来,整体难度偏易。
第二轮:
前言:
- 基于小根堆实现的定时器,关闭超时的非活动连接;
- 利用单例模式和阻塞队列实现异步的日志系统,记录服务器运行状态;
几乎所有的问题都围绕着简历里面写的这两个项目功能展开。
1.你是如何用小根堆实现的定时器?
2.有了小根堆,为什么还要用哈希表呢,小根堆的堆顶元素不就是最小值吗?
我的回答是:"依据小根堆得到的文件描述符在哈希表中查找对应客户端并进行关闭"。
3.那你是如何实现定时检测呢?
这里扯皮了很久。。。,自己还得回去看看项目代码。 4.那你实现一个堆排序吧?
我猜测这里在检测这个小根堆是不是自己实现的,看我很久没写代码,他说你先说说堆的实现原理,然后我讲了很久包括:"插入一个数,删除一个数,求集合中的最小值,删除最小值,删除任意一个元素,修改任意一个元素如何实现",但是自己很久没有写堆排序了,面试官就说:"哦,你是用STL实现的"。
5.你是如何用单例模式和阻塞队列实现异步的日志系统的?
不是很熟悉这个项目功能,然后我说这个和线程池的实现是类似的,扯到线程池的实现去了(又该滚回去复习项目了)。
6.那你手写一个单例模式吧?
7.多个线程去执行你这个代码有什么问题呢?
上锁,lock(mutex)、解锁,unlock(mutex)。
8.日志系统是如何实现分级打印的呢?
我说:"日志系统没有用分级打印"(分级打印又是什么鬼)。
9.日志系统主要打印了什么内容呢,无区分打印吗?
我说:"是"(项目好像直接就打印了吧。。。)
10.我还想再听听单例模式和阻塞队列如何是实现异步日志的?
(我去。。。,这尼玛是回滚嘛)
11.select和epoll的区别?
12.new和malloc的区别?
13.实现一个void* memcpy(void* dest, const void* src, size_t n)?
和之前做过和strcpy这个函数十分相似 没有考虑内存重叠(复习) 优化参考:https://blog.csdn.net/xiaobo620/article/details/7488827 void* mymemcpy(void *dst, const void* src, size_t num) { if (src == NULL || dst == NULL) { return NULL; } const char *psrc = (char *)src; char *pdst = (char *)dst; while (num-- > 0) *pdst++ = *psrc++; return dst; }14.你这个项目实现了上万QPS,每个客户端连接进来需要多长时间多长时间,有测过吗?
我说:"可以计算出来的,webbench如压力测试60s,有10000个客户端连接进来,每个客户端就是60 / 10000"。
面试官:"那你测的是多少?"。
我说:"emmm,60 / 10000 = 0.006"。(这里估计是面试官看你是否真的测了)
第二轮感受:比之前蚂蚁一面的压力更大,感觉项目一问很深入就不太会了,然后面试官检测你是不是做过还会让你手写如堆、单例模式等代码,唉,项目有得好好看看了,不过我也认为这才是二面该有的难度。