协程库——面试问题

1 同步、异步

1.1 同步

代码顺序执行,完全由用户控制.

同步阻塞

等待可读、可写的时候阻塞,不让出cpu。读、写之后,下面的代码才能执行、

同步非阻塞

等待可读、可写时,不会阻塞cpu,返回失败,设置错误码为EAGAIN 或 EWOULDBLOCK ,告知应用程序此时没有数据可读,用户需要自行决定怎样等待数据到来

可以轮询,

使用epoll,为fd注册读事件,然后去执行其它操作

1.2 异步

代码不按照顺序执行,不完全由用户控制。

异步的实现方式:        

  1.           异步库和异步框架:libevent、ibuv、libev等
  2.           操作系统异步io接口
  3.           c++11异步机制:std::async 和 std::future

异步IO库大概逻辑

将套接字设置为非阻塞状态,然后为套接字的事件绑定回调函数,接下来进入IO多路复用的循环,等待事件发生,调用对应的回调函数。 

2 进程、线程、协程

进程是操作系统进⾏资源分配的基本单位,每个进程都有⾃⼰的独⽴内存空间;

线程是cpu调度的基本单位,线程共享父进程的虚拟地址空间;

协程是用户态线程,协程通常在线程中运行

2.1 切换上下文

进程

cpu上下文——寄存器

内存管理上下文——页表相关

资源管理上下文——文件句柄等

同步机制上下文——锁、信号量等

线程

线程切换不需要切换虚拟地址空间,

只需要切换cpu寄存器上下文和少量的资源管理上下文

协程

部分cpu寄存器,

当前调用栈栈基地址代码的执行位置等,当前的上下文保存到线程的堆区

2.2 多进程/线程/协程

多进程

fork()创建子进程,子进程拷贝父进程地址空间,写时复制,代码段相同,执行任务相同

exec 系列函数可以在子进程中加载新的可执行程序,将子进程的代码替换为新程序的代码。这样,子进程将执行与父进程不同的任务。

多线程

父进程创建多个线程,每个线程有自己的入口函数,执行不同的任务。多个线程共享父进程的资源。

协程

每个协程由自己的入口函数,执行不同的任务。

协程通常是在单线程中运行的,协程可以在线程中实现切换,开销比线程和进程切换小,可以实现高并发。

协程经常与多线程一起使用。

3 协程优缺点

协程优点

轻量级:创建和销毁开销小,占用资源少

高并发:协程切换开销小,速度快,可同时处理更多的协程,实现高并发。协程切换在线程中进行,由用户控制,避免了线程切换的开销。


 不是很理解!!!====================???=================================

简化异步编程使用类似于同步编程的方式编写异步代码,避免避免了回调函数嵌套和复杂的并发控制逻辑,使得代码更加清晰和易于理解。

缺点

⽆法利⽤多核资源:线程才是系统调度的基本单位,单线程下的多协程本质上还是串⾏执⾏的,只能⽤到单核计算资源,所以协程往往要与多线程、多进程⼀起使⽤。 

难以调试:由于协程的切换和异步执行,调试协程代码可能更加困难。当协程之间存在复杂的依赖关系和交互时,追踪问题的根因可能变得复杂。

4 协程适用于I/O密集型任务的原因

I/O密集型任务通常涉及等待外部资源,等待的过程中,需要释放cpu,切换到其它任务。协程切换快速,开销小。

使用线程的话,线程阻塞等待IO,会切换到其它线程,切换开销比协程大

单核

不管使用多线程还是协程,都只能串行处理。

如果是cpu密集型任务,多线程和协程区别不大,因为不会频繁因为阻塞切换;

如果是io密集型任务,需要经常切换,协程切换效率更高。

多核

多线程的优势就是可以利用多核处理器,而协程只能在一个线程上运行。

IO密集型任务,使用多线程+协程

5 协程实现的是真正的异步吗?

可以实现异步效果,但本身并不是异步机制。

本项目中,当一个协程等待io时,可以切换到其他协程。当io完成后,它可以被唤醒并继续执行。这种方式可以让程序在等待I/O的同时执行其他任务,充分利用 CPU 资源,从而达到类似于异步的效果。这并不是真正的异步。

异步编程中:

        各个任务是解耦的,某个任务被阻塞,只影响该任务本身,不影响其它任务的执行

而多线程或协程中:

        任务间仍有一些资源是共享的,当一个线程或协程阻塞或出现异常,可能会影响整个进程的执行。

衡量⼀个协程库性能的标准

响应时间 :衡量在给定负载下协程调度的快慢。较低的响应时间表示更⾼的性能。
吞吐量 :指在单位时间内执⾏的任务数量。较⾼的吞吐量表示更⾼的性能。
并发能⼒ :指同时处理的协程数量。更⾼的并发能⼒表示更好的性能。
上下⽂切换开销: 在协程库中,上下⽂切换是指从⼀个协程切换到另⼀个协程的操作。较低的上下⽂切换开销表示更⾼的性能,因为过多的上下⽂切换会浪费时间和资源。
资源利⽤率 :⼀个好的协程库应该有效地利⽤系统资源,例如处理器、内存和⽹络等。协程库在资源利⽤⽅⾯的优化程度可以影响性能。

7 Go协程

8 C++协程

9 为什么要有空闲协程

在任务队列为空时,阻塞在idel协程中的epoll_wait中。

idel协程负责使用epoll监听事件,实际发生后,将对应回调函数添加到调度队列中。

调度协程只负责任务调度。

降低不同功能之间的耦合,便于后序扩展和维护。

10 每建⽴⼀个⽤户连接就要创建⼀个协程,不会影响性能吗?

 会的,高并发时,会有大量的协程创建和销毁,会占用较多系统资源。

可使用协程池的方法解决。

11 怎样测试的

12 简单介绍项目

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/25669.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

I/O 系统的功能、模型与接口

目录 I/O 系统的基本功能 1. 设备独立性 2. 缓冲 3. 设备共享 4. 高速缓存 5. 设备管理 I/O 系统的层次结构与模型 1. 单块传输模型 2. 缓冲管理模型 3. 通道模型 4. 虚拟设备模型 5. 直接内存访问(DMA)模型 6. 层次结构示意图 I/O…

【代码随想录训练营】【Day 48】【动态规划-7】| 卡码 57, Leetcode 322, 279

【代码随想录训练营】【Day 48】【动态规划-7】| 卡码 57, Leetcode 322, 279 需强化知识点 python 的幂次计算, 10 ** 5, 10 **(0.5) 题目 卡码 57. 爬楼梯(第八期模拟笔试) 注…

RK3568-修改fiq-debugger调试串口

瑞芯微SDK默认将uart2_m0作为调试串口,以下方法将调试串口修改为uart5_m1。修改bootloader 修改/OK3568-linux-source/rkbin/tools/ddrbin_param.txt文件,5表示串口5。1表示复用m1。执行./ddrbin_tool ddrbin_param.txt ../bin/rk35/rk3568_ddr_1560MHz_v1.11.bin命令修改ub…

Permissions 0644 for ‘/home/jsy/.ssh/id_rsa‘ are too open

1、问题 执行git pull --rebase 报错 WARNING: UNPROTECTED PRIVATE KEY FILE! Permissions 0644 for /home/jsy/.ssh/id_rsa are too open. It is required that your private key files are NOT accessible by others. This private key will be ignored. Load key…

el-table 实现表头置顶【干货满满】附源码

a)一般情况下,想要在 ElTable 上实现表头固定,滑动滚动条时希望表头常显,不被滚动条顶上去。这时候就需要给表格添加高度,但是这个高度需要提前确定好,不是很方便,表格上边一段距离不是固定的,常…

字节面试:CPU100% 如何处理?

尼恩说在前面 在40岁老架构师 尼恩的读者交流群(50)中,最近有小伙伴拿到了一线互联网企业如得物、阿里、滴滴、极兔、有赞、希音、百度、网易、美团的面试资格,遇到很多很重要的线上问题的场景题: 1.CPU100%,你是怎么处理的&…

操作系统复习-存储管理之虚拟内存

虚拟内存概述 有些进程实际需要的内存很大,超过物理内存的容量。多道程序设计,使得每个进程可用物理内存更加稀缺。不可能无限增加物理内存,物理内存总有不够的时候。虚拟内存是操作系统内存管理的关键技术。使得多道程序运行和大程序运行称…

算法金 | A - Z,115 个数据科学 机器学习 江湖黑话(全面)

大侠幸会,在下全网同名「算法金」 0 基础转 AI 上岸,多个算法赛 Top 「日更万日,让更多人享受智能乐趣」 机器学习本质上和数据科学一样都是依赖概率统计,今天整整那些听起来让人头大的机器学习江湖黑话 A - C A/B Testing (A/B …

windows域控共享网络驱动器

背景 假设在一家公司,有新入职的员工。我们给其创建了域账号,有一些共享的文件需要其可以直接访问到。我们可以采用共享目录的形式,但是每次都要输入共享端的ip或者主机名,比较麻烦。我们希望创建的域账号访问共享文件更便捷一些…

数据库原理(概论)——(1)

数据库概述 一、数据库的四个基本概念 1.数据 描述事物的符号记录 2.数据库 数据库是长期存储在计算机内的、有组织的、可共享的大量数据的集合。数据库中的数据按一定的数据模型组织、描述和存储、具有较小的冗余度、较高的数据独立性和易扩展性,并可为各种用户共…

注解 - @RequestBody

注解简介 在今天的每日一注解中,我们将探讨RequestBody注解。RequestBody是Spring框架中的一个注解,用于将HTTP请求体中的内容绑定到控制器方法的参数上,通常用于处理JSON数据。 注解定义 RequestBody注解用于将HTTP请求体的内容绑定到方法…

-31-()

在终端运行时消除输入空格对程序的影响可以使用{在scanf后加“getchar()”或者在scanf(“空格%d”,&a)} 按位与和移位操作符只能用于整数且都要转位二进制后进行相应操作 不创建临时变量,实现两个数的交换:1——使用加减法&…

MySQL bin-log日志恢复数据

目录 一、开启二进制日志 二、检查二进制日志是否开启 三、使用二进制日志备份和恢复 使用二进制日志备份恢复前先创建备份: 应用二进制日志: 扩展用法: 四、常见命令和操作 五. 使用 mysqlbinlog 工具查看二进制日志 1. 查看二进制…

数据结构笔记 线性表的查找 顺序,折半,分块查找

顺序查找:从头找到尾,或者从尾找到头 顺序查找的性能: 其中,辅助空间的O(1)用于存放哨兵的 折半查找:向下取整:指当计算的结果不为整数时取小于计算结果的整数。 折半查找的性能&am…

Magnet pro for mac v2.14.0中文激活版:高效窗口管理工具

Magnet for Mac是一款专为Mac用户设计的窗口管理工具,旨在帮助用户更高效地管理和布局多个应用程序窗口,提升工作效率。 Magnet pro for mac v2.14.0中文激活版下载 这款软件拥有直观易用的界面和丰富的功能,支持用户将屏幕分割成多个区域&a…

textattack报错:不能导入自定义search_methods (cannot import name ‘xxx‘ from ‘xxx‘)

1. 报错信息 ImportError: cannot import name AAA from textattack.search_methods (/home/666/anaconda3/envs/textattack37_env/lib/python3.7/site-packages/textattack/search_methods/__init__.py)2. 出错简述 贴一段test1.py的模块导入 #建议使用! import…

CPython源码学习5:字节对象

字节的结构体 PyBytesObject 浮点数的结构体 PyBytesObject ,定义在头文件 Include/bytesobject.h 中,包含PyObject_VAR_HEAD 说明字节是可变大小的对象。 // Include/bytesobject.h typedef struct {PyObject_VAR_HEAD // 可变大小的对象Py_hash_t ob…

深度解析地铁票务系统的技术架构与创新应用

在城市交通体系中,地铁作为一种快速、便捷的公共交通方式,已经成为现代都市生活的重要组成部分。而地铁票务系统的技术架构,则是支撑地铁运营的核心之一。本文将深度解析地铁票务系统的技术架构与创新应用,从系统设计、数据管理、…

高德地图官网文档

高德地图官网文档(快速上手-入门-教程-地图 JS API 1.4 | 高德地图API)

【PL理论】(16) 形式化语义:语义树 | <Φ, S> ⇒ M | 形式化语义 | 为什么需要形式化语义 | 事实:部分编程语言的设计者并不会形式化语义

💭 写在前面:本章我们将继续探讨形式化语义,讲解语义树,然后我们将讨论“为什么需要形式化语义”,以及讲述一个比较有趣的事实(大部分编程语言设计者其实并不会形式化语义的定义)。 目录 0x00…