滴滴 8.19 一面 二面
一面 (50min)
- 讲项目
- 讨论项目中细节
- 线程池中线程如何负载均衡?(网卡住了,然后就没问了)
- JUC 中有哪些类
算法题:
链表:1234567 转换为:7563421。
写完主题代码讲了思路,没有运行,面试官问了些代码细节。
给我两点建议:
- 将项目挑重点,讲的详细但是费时间,如果面试官问的少,有一个没答上来,那么错误比重就很大。
- 写代码变量和函数名起有意义的名字。(我写算法习惯命名简单点,名字长了累眼睛)
一面面试官的建议很有用。
二面 (1h10min)
- 讲讲最近项目的收获吧(我自己讲了项目10分钟)
- 面试官对于项目可靠性投递的提问
- 讲讲 NIO 比之前的 IO 优化在哪里?说说你理解的阻塞
- Unix 如何实现非阻塞?Unix 非阻塞和 NIO 的区别?面试官想问的是os阻塞用户进程的过程,我跑题了?还提到了AIO相比NIO,其实就是优化了用户去像操作系统轮询的用户态内核态的性能消耗,相当于操作系统帮忙完成了这部分。
- Netty 框架做什么的
- RocketMQ 如何保证可靠性?单机和集群。说是 RocketMQ 实现 IM 是最简单容易的方法。
- 多 Producer 和 Consumer 之间如何做负载均衡?(我先说的 consumer 绑定 broker 队列,然后说的的 consumer 根据消息堆堆压、CPU负载、内存负载来动态路由,做一个中间负载均衡层,他说太重, 可以直接权重轮询效果就很好)
- 讲讲理解的多路复用?
- Unix 如何实现多路复用(select,poll,epoll)
- epoll 比 select 优化在哪里?(数据结构,时间复杂度O(1),空间复杂度O(1),零拷贝)
- 我提到了 epoll 可以原址返回就绪事件,面试官问如何实现原址返回呢(面试官耳朵真灵,立马发现了原址,其实我都忘了,以前看的手册中印象中提到了epoll原址操作)
我说了下我的猜想,从CPU控制用户态内核态内存方法和内存保护角度猜测可能是CPU做了指令的特殊处理,允许访问特定一个内核区间段。 - 从网卡接收到数据流到 JVM 中接收到数据的流程?
- 上述流程哪里可以优化?我说的用户态内核态零拷贝,他问怎么实现的零拷贝?我说直接内存访问,他说那问题又回到了用户态如何访问内核态数据的问题(即问题11),面试官给出了答案,利用虚拟内存机制,将内核内存空间映射为一块逻辑空间,然后用户程序访问这块逻辑空间,分离实际内存地址和程序的耦合关系,通过虚拟内存来绕过CPU的检查(他提到了mmap?)。也是 11 的答案。
- 接着 13,还有哪些地方可以优化?面试官说网卡处可以使用 DMA 进行零拷贝,然后和面试官讨论了下 DMA,原来零拷贝不只是说减少拷贝,通过 DMA 节省 CPU 拷贝时间也算零拷贝的一种。学习了,还说现在已经有机制可以直接用户态访问硬件设备缓冲区。
算法题
滑动窗口最大值
一开始说用大顶堆,但是时间复杂度太高。做过这类题但是一时间想不起来了,然后说是单调栈,然后最后他提示单调队列,然后我说了思路,写了几行代码就说不写了自己回去写吧。
反问
部门:网约车
技术栈:PHP--> Go
#面经##滴滴#和二面面试官聊的很开心,有种循循诱导的过程,和引导分析思路的过程,并且也学到了东西,很棒的面试官。