当前位置: 首页 > news >正文

协程库项目面试常见问题 | 简历写法

文章目录

  • 问题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

在这里插入图片描述

简历如何写

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

http://www.lryc.cn/news/625390.html

相关文章:

  • 使用OpenCV计算灰度图像的质心
  • 前端面试核心技术30问
  • Springboot使用Selenium+ChormeDriver在服务器(Linux)端将网页保存为图片或PDF
  • 【完整源码+数据集+部署教程】太阳能板表面损伤检测图像分割系统源码和数据集:改进yolo11-DynamicHGNetV2
  • Linux------《操作系统全景速览:Windows·macOS·Linux·Unix 对比及 Linux 发行版实战指南》
  • C#项目集成海康SDK指南:从搭建环境到实现视频预览、录制、截屏
  • 什么是AKSK?
  • F003疫情传染病数据可视化vue+flask+mysql
  • 100202Title和Input组件_编辑器-react-仿低代码平台项目
  • 全平台轻量浏览器推荐|支持Win/macOS/Linux,极速加载+隐私保护+扩展插件,告别广告与数据追踪!
  • 私有化部署全攻略:开源大模型本地化改造的性能与安全深度评测
  • 在 IntelliJ IDEA 中修改 Git Commit 描述
  • Linux的ALSA音频框架学习笔记
  • Voice Agents:下一代语音交互智能体的架构革命与产业落地
  • 项目一系列-第5章 前后端快速开发
  • 【qml-5】qml与c++交互(类型单例)
  • 如何计算 PCM 音频与 YUV/RGB 原始视频文件大小?
  • 【Git Submodules 与微前端架构技术指南】
  • 指针的应用学习日记
  • Hive 存储管理测试用例设计指南
  • CSDN 创始人蒋涛:以开源驱动技术创新,拥抱黄金十年
  • 【SpringBoot】15 核心功能 - Web开发原理 - 请求处理 - 常用请求参数注解
  • 如何安全删除GitHub中的敏感文件?git-filter-repo操作全解析
  • 玳瑁的嵌入式日记D20-08019(数据结构)
  • Hive常用命令参考
  • 开源游戏引擎Bevy 和 Godot
  • 分布式搜索(Elasticsearch)深入用法
  • Leetcode 3652. Best Time to Buy and Sell Stock using Strategy
  • 【Rust嵌入式键值对数据库redb】第一课 第一次写入
  • 极品飞车21:热度(NFS Heat)