协程库项目面试常见问题 | 简历写法
文章目录
- 问题1: 简单介绍一下项目:
- 主要工作:
- 问题2:进程、线程和协程的概念:
- 多进程:
- 多线程:
- 协程:
- 问题3:对称协程和非对协程的应用场景:
- 对称协程
- 非对称协程
- 问题4:协程的优缺点:
- 协程优点:
- 协程缺点:
- 问题5:协程有什么用:
- 问题6:非对称协程使用于I/O密集型任务的原因:
- 问题7:协程实现的是真正的异步吗?
- 协程和异步的区别?
- 问题8:你的协程是怎么调度的?
- 问题9:你学习过其他协程或者说了解过?
- Go协程
- 问题10:性能测试
- 其他可能被问到的问题:
- uncontext是什么?
- RAII思想解释一下:
- 本项目中用过的锁:
- 本项目的设计模式
- Hook的实现细节:
- 【滴滴】衡量一个协程库性能的标准:
- 【科大讯飞、中望软件】你这个项目遇到的最大困难是什么?
- 【华为】服务器运行时每建立一个用户就要创建一个协程,不会影响性能吗?
- 【科大讯飞】为什么要用空闲协程,和主协程合成一个不就行了?
- 【滴滴】协程你是怎么样调度的?
- 【阿里云、华为】了解c++的协程吗?
- 遇到的困难以及测试和优化:
- 测试及优化
- 困难1:子协程切换
- 困难2: hook
- 简历如何写
问题1: 简单介绍一下项目:

主要工作:


问题2:进程、线程和协程的概念:
多进程:
fork()创建子进程,子进程拷贝父进程地址空间,写时复制,代码段相同,执行任务相同。 exec 系列函数可以在子进程中加载新的可执行程序,将子进程的代码替换为新程序的代码。这样,子进程将执行与父进程不同的任务。
多线程:
父进程创建多个线程,每个线程有自己的入口函数,执行不同的任务。多个线程共享父进程的资源。
协程:
每个协程有自己的入口函数,执行不同的任务。 协程通常是在单线程中运行的,协程可以在线程中实现切换,开销比线程和进程切换小,可以实现高并发。 协程经常与多线程一起使用。
问题3:对称协程和非对协程的应用场景:
对称协程

非对称协程

问题4:协程的优缺点:
协程优点:
因为在用户态,不需在内核态执行,故不用操作系统调度

协程缺点:

问题5:协程有什么用:
提高资源利用率,提高程序并发性能。协程允许开发者用同步的方式编写异步代码,实现非阻塞的并发操作,通过在适当的时候挂起核恢复协程,可以有效管理多个任务的执行,提高程序的并发性能。
与线程相比,协程是轻量级的,它们的创建和上下文切换开销较小,可以同时执行大量的协程,而不会导致系统负载过重,可以在单线程下实现异步,使程序不存在阻塞阶段,充分利用cpu资源。 简化异步编程逻辑。使用协程可以简化并发编程的复杂性,通过使用适当的协程库或语言特性,可以避免显式的线程同步、锁和互斥量等并发编程的常见问题,用同步的思想就可以编写成异步的程序。
问题6:非对称协程使用于I/O密集型任务的原因:
非阻塞IO条件下,等待IO的过程中,会切换到其他任务继续执行; 在本项目中通过利用hook加IO协程调度,对SocketIO的API进行,改写使其行为变成非阻塞,意味着我能做recv或sleep函数时,暂停对函数的执行转而去调度其他任务,这样提高了整体的并发性。
问题7:协程实现的是真正的异步吗?
底层使用的是同步非阻塞IO,协程还是同步的,但是可以实现异步的效果,调用返回后,数据就已经读取完成,期间不需要用户干预。
协程和异步的区别?


问题8:你的协程是怎么调度的?
非对称协程,参考IO+协程调度文档中的模块详解已分析
问题9:你学习过其他协程或者说了解过?
Go协程
Go从语言层面支持协程,Goroutine就是Go中最基本的执行单元。每一个Go程序至少有一个Goroutine,从main函数开始,Go程序会为main函数创建一个默认的Goroutine。
一文看懂Go语言协程的设计与原理
C++的协程是从C++20标准开始引⼊的⼀种语⾔特性,旨在提供⼀种⽅便、⾼效处理异步任务和并发编程的机 制。C++的协程通过关键字co_await和co_yield来实现,结合协程类型和协程函数来定义和使⽤协程。更多细 节可参考:
渡劫 C++ 协程(1):C++ 协程概览
问题10:性能测试
具体可以看性能测试模块或者上面测试部分提到的内容协程库项目可以优化的地方 | 性能测试
其他可能被问到的问题:
这里主要可能要你说的项目中细节,比如说锁或者RAII是什么,或者ucontext,线程池这些。
uncontext是什么?
具体在模块协程的学习有详细的讲解协程库(前置知识)
RAII思想解释一下:
Resource Acquisition is Initialization,资源获取即初始化。 使用类来管理资源,在构造函数中申请分配资源,在析构函数中释放资源,**将资源和对象的生命周期绑定。**智能指针是RAII最好的例子。
本项目中用过的锁:
c++17的读写锁,c++11的互斥锁lock_grud和unique_lock、递归互斥锁

本项目的设计模式
在模块详解与代码分析中中使用单例模式为FdManager提供全局唯一实例,保证全局仅有一份实例,节约内存资源;避免多个实例产生冲突。

FdManager 类使用单例模式来确保文件描述符管理器只有一个实例,属于 懒汉模式,并且是线程安全的实现方式,通过双重检查锁定保证多线程环境下只有一个实例被创建。

IOManager 类:
IOManager 继承自 Scheduler,并且实现了 TimerManager。它通过 addEvent、delEvent 和 cancelEvent 等方法来注册、删除或取消对文件描述符的事件监听,这些操作类似于观察者模式中的“订阅”和“退订”机制。
事件触发和回调:
当某个文件描述符(如套接字)上的事件发生时,IOManager 会触发对应的回调函数。这里的回调函数充当观察者,监听某个文件描述符上的事件变化

Hook的实现细节:

【滴滴】衡量一个协程库性能的标准:

【科大讯飞、中望软件】你这个项目遇到的最大困难是什么?
可以参考简历如何写模块中的项目难点部分;
【华为】服务器运行时每建立一个用户就要创建一个协程,不会影响性能吗?
是的,会存在这个问题,在承受⾼并发时,⼤量的协程的创建、析构都会消耗较⼤的系统资源,可以采⽤“协 程池”的⽅法解决,提前创建指定数量的协程,有新的任务执⾏时,选择⼀个协程进⾏任务函数绑定,任务完成将协程重置返回到协程中。
【科大讯飞】为什么要用空闲协程,和主协程合成一个不就行了?
在IO协程调度器空闲协程⾥要进⾏epoll监听,添加协程任务,最基本的协程调度器包含idle协程,IO协程调度器对其进⾏了重写,主协程只进⾏任务调度,idle只进⾏任务添加,降低了不同功能之间的耦合,便于后续 扩展维护。
【滴滴】协程你是怎么样调度的?
这个部分上面回答过。
【阿里云、华为】了解c++的协程吗?
C++的协程是从C++20标准开始引⼊的⼀种语⾔特性,旨在提供⼀种⽅便、⾼效处理异步任务和并发编程的机 制。C++的协程通过关键字co_await和co_yield来实现,结合协程类型和协程函数来定义和使⽤协程。更多细 节可参考:
渡劫 C++ 协程(1):C++ 协程概览
遇到的困难以及测试和优化:
测试及优化

困难1:子协程切换

在执行调度任务时,可以通过调度器的GetThis()方法获取到当前调度器,再通过schedule方法继续添加新的任务,这就变相实现了在子协程中创建并运行新的子协程的功能
困难2: hook

简历如何写




之后我会持续更新,如果喜欢我的文章,请记得一键三连哦,点赞关注收藏,你的每一个赞每一份关注每一次收藏都将是我前进路上的无限动力 !!!↖(▔▽▔)↗感谢支持!
