360 C++服务端开发 一面面经
概述:10月12日一面,面试官主要问项目(sylar的webserver,做这个项目的可以参考下),问的比较犀利,30分钟不到结束。后续二面由于时间冲突,拒绝后再无消息,面试时间不能协商且提前一天发面试就很抽象。
面试流程:
1.自我介绍
2.介绍项目
3.采用的是什么调度算法(FIFO,讲线程)
4.协程任务队列是怎么设计的,数据结构是什么(链表)
5.所有线程都访问同一个协程任务队列的并发导致锁的颗粒度比较大,如何解决(可以给每个线程分配单独的协程任务队列)
6.各线程单独的协程任务队列协程数量不均匀怎么办(学习go的思想,偷其他队列的任务,再偷全局队列,每次偷一半)
7.协程是怎么实现的(封装ucontext)
8.用到的信号量和互斥锁是线程的还是协程的(线程)
9.用互斥锁,一个协程拥有资源,占用锁后,切换出去,新协程请求不到资源,陷入锁的阻塞队列,无法切出,怎么办(自旋锁)
10.自旋锁只适合短时间拥有锁,长时间会导致CPU空转,还有其他方法吗(没有想出来,然后问我做项目的时候有没有了解相关内容,说没有就不问了)
- 上面这些问题本质应该是要设计一个用户态的协程锁,事后想的思路是模仿互斥锁,每个锁拥有一个挂起队列,当请求锁时发现锁被使用,则将协程切出,并保存在挂起队列,当锁被释放时,从挂起队列取出协程放到协程任务队列去等待执行,还存在两个点需要考虑
- 模拟自旋锁的情况,自旋一段时间如果获取不到锁再加入挂起队列
- 如果被唤醒时的时间过久则将协程加入到任务队列的队首快速执行
11.定时器怎么实现的(epoll的超时时间,map)
12.hook是怎么实现的,举个网络IO的例子
13.文件IO有用到吗(没有,现在的理解(不一定正确)是正常的文件IO应该是阻塞的,没有等待磁盘这一步,只有等待CPU,除非使用异步IO或者DMA,才能通过协程切换释放CPU)
14.手撕:3个一组反转链表
15.反问:技术栈
#软件开发笔面经##360求职进展汇总#