概述:4月4日投递,4月14日笔试,4月24日面试,钉钉会议,没想到是纯项目面,准备不足,面的汗流浃背,最后秒挂
面试流程:
1.自我介绍
2.协程库是基于什么实现的?是C++自己的协程库吗?u_context(Linux提供API)
3.有栈协程还是无栈协程?有栈,独立栈,分配在堆上
4.为什么要用协程?切换快、用户管理(忘记答方便异步并发)
5.协程库用在什么场景?讲协程调度器的实现(面试官说实际上还是线程处理任务,和协程没关系?)
6.协程的resume用在什么场景?要阻塞的时候切换
7.怎么判断要阻塞了?非阻塞IO
8.异步IO还是同步IO?等待缓冲不阻塞,数据拷贝阻塞
9.是一个协程绑定一个fd不断地进行IO操作吗?是
10.那这个逻辑和用lambda操作捕获fd和相关参数实现有什么区别?人懵了,没理解意思
11.不用协程,用自己写的一个结构体去保存上下文,进行切换,与使用协程有什么区别?继续懵逼,觉得没什么区别
12.手动保存的上下文和协程保存的上下文有什么区别?还是懵逼
13.上下文主要是保存什么?CPU寄存器的值、PC指针、参数
14.需要用到哪些寄存器的值,每个寄存器是干什么的?完全没印象,说ucontext有接口获取,底层不清楚
15.协程的一些操作(讲了几个单词,没听出来是什么)是什么时候用到的?硬讲切入和切出
16.缓冲区一直没好,什么时候加入协程队列?根据读写超时时间设置定时器
17.epoll_wait是在哪里调用,是单独的线程吗?每个空闲线程调用,管道、事件、定时器通知
18.相当于是将epoll_wait封装成一个任务吗?为什么这样考虑?空闲线程阻塞在epoll上,就不占用cpu
19.每个任务对应多个还是1个fd?1个
20.如果整个线程池比较忙,会不会有延时的场景,就是连接数量超过线程数量的时候?卡住很久,感觉会延时(事后感觉这就是项目一个致命的缺陷,调度算法就是最简单的先来先服务)
21.epoll_wait的具体逻辑是怎么样的?线程如果在协程队列中能获取到任务就执行,否则就执行idle协程,陷入epoll_wait,等待唤醒
22.epoll_wait什么时候唤醒?事件、定时器、新任务通知管道
23.想问的是陷入epoll_wait后如何切换?不切换,就是因为没有任务,就要陷入epoll_wait中,而不要切换(感觉面试官没有从我之前的回答中理解整个逻辑,主要是我没有讲调度协程和任务协程的切换,总之就感觉我们一直不同频)
24.所有线程都陷入epoll_wait,那协程岂不是没用了?说明没有任务要运行,有任务的时候线程就被唤醒了
25.只有一个线程,陷入epoll_wait,不能切换,来了新连接,是不是无法处理了?这里当时慌了,一直在说管道和事件、定时器,实际上就是epoll_wait设置了最大超时时间,超过这个时间就会唤醒去检查是否有新任务
26.epoll_wait监听的是哪些fd,只有管道吗?协程调度器只有一个epoll对象,一开始注册了一个管道,然后有新的连接时,连接的fd注册事件时也会注册到这个epoll对象上
27.为什么要用管道?用于线程间的通信,通知有新任务
28.fd注册了事件也可以用来通知,为什么还要用管道?这里说协程任务不止socket fd,给自己挖了大坑
29.http服务器应该主要是socket套接字,还用到其他的fd了吗?上一问的坑,想不出,然后就说还有定时器任务
30.有几个epoll fd,哪些fd要注册到epoll fd上?心态崩了,感觉之前讲的没给讲明白,重新讲26的回答
31.协程池有多少个epoll_wait任务?(晕)空闲线程都epoll_wait
32.epoll_wait任务什么时候加入到协程任务队列?不用加入到协程任务队列,线程运行的函数中存在一个判断,如果能从协程任务队列中找到协程任务,就取出来执行,否则执行空闲协程,空闲协程中epoll_wait()
33.出于什么考虑做这个项目?
34.手撕:两个线程交替打印A和B,由于忘记线程的操作(尴尬),换了个反转链表
35.反问:看重什么能力(代码能力、学习能力)流程
总结:面试官可能对协程比较熟悉,按照他的理解全程提问项目,但是明显感觉我们没有同频,我跟不上他的节奏,他也一直没有通过我的回答理清我项目的逻辑,所以很多问题都重复问,我面的汗流浃背,很多地方都反应不过来。一方面是我以为一面可能偏八股,没怎么准备项目,细节生疏很多(最该死的是没有准备多线程的题)另一方面也发现这个项目的不足,调度算法太简单了,可能应付不了拷打。成为阿里一面杀手了,难绷
#软件开发2024笔面经##我的实习求职记录#