阿里控股 C++ 一面凉经

概述: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笔面经##我的实习求职记录#
全部评论
老哥项目里用到了协程吗
点赞
送花
回复
分享
发布于 05-02 19:08 陕西
我的理解吧,感觉先来先服务并不是主要的调度算法,他也许只是想用这个调度器配合epoll去实现自动唤醒一些异步任务,因为事情总得一件一件做?还有就是后面的hook模块可能才是这和协程真正发挥作用的地方,异步模拟成同步?个人理解,期待和楼主讨论。
点赞
送花
回复
分享
发布于 05-02 23:00 安徽
滴滴
校招火热招聘中
官网直投
请问项目是webserver?
点赞
送花
回复
分享
发布于 05-04 10:38 江苏
这个项目怎么样 我想把15445给换成这个了 15445面试官都不问😭😭😭
点赞
送花
回复
分享
发布于 05-05 23:50 广东

相关推荐

10 49 评论
分享
牛客网
牛客企业服务