前言

同步和异步的概念描述的是用户线程与内核的交互方式:同步是指用户线程发起IO请求后需要等待或者轮询内核IO操作完成后才能继续执行;而异步是指用户线程发起IO请求后仍继续执行,当内核IO操作完成后会通知用户线程,或者调用用户线程注册的回调函数。阻塞和非阻塞的概念描述的是用户线程调用内核IO操作的方式:阻塞是指IO操作需要彻底完成后才返回到用户空间;而非阻塞是指IO操作被调用后立即返回给用户一个状态值,无需等到IO操作彻底完成。

异步I/O

在理解异步I/O之前,我们先要知道什么是同步I/O
阻塞同步I/O模型下,用户线程向内核发起 recvfrom 系统调用,当数据没有准备好的时候,用户线程阻塞。
此外还有一种非阻塞同步I/O,此时用户线程不阻塞于 recvfrom,而是反复向系统查询数据状态。当数据准备好了,就对数据进行后续处理。

Paste_Image.png

而在异步I/O模式下,用户线程在数据还没有准备好的时候既不阻塞也不反复查询,而是继续干自己该干的事情。内核会开启一个内核线程去读取数据,等到数据准备好了,内核给用户线程一个信号,用户线程中断去执行信号处理函数。

Paste_Image.png

node.js中的异步回调也是采用开线程的方式实现的

epoll

epoll/select 是一种I/O多路复用模型
用户线程可以先通过 epoll 注册多个I/O事件
然后用户线程反复执行调用 epoll/select 查询是否有准备好的事件
如果有准备好的I/O事件则进行处理
关键点是一个用户线程处理多个I/O事件

epoll/select 的区别在于
select 的底层原理是遍历所有注册的I/O事件,找出准备好的的I/O事件。
而 epoll 则是由内核主动通知哪些I/O事件需要处理,不需要用户线程主动去反复查询,因此大大提高了事件处理的效率。

Paste_Image.png

协程

协程是一种轻量级的线程本质上协程就是用户空间下的线程
如果把线程/进程当作虚拟“CPU”,协程即跑在这个“CPU”上的线程。

协程的特点

  1. 占用的资源更少。
  2. 所有的切换和调度都发生在用户态。

不管是进程还是线程,每次阻塞、切换都需要陷入系统调用,先让CPU跑操作系统的调度程序,然后再由调度程序决定该跑哪一个线程。而且由于抢占式调度执行顺序无法确定的特点,使用线程时需要非常小心地处理同步问题,而协程完全不存在这个问题。
因为协程可以在用户态显示控制切换

例子
传统的生产者-消费者模型是一个线程写消息,一个线程取消息,通过锁机制控制队列和等待,但一不小心就可能死锁。

如果改用协程,生产者生产消息后,直接通过yield跳转到消费者开始执行,待消费者执行完毕后,切换回生产者继续生产,效率极高:

import timedef consumer():r = ''while True:n = yield rif not n:returnprint('[CONSUMER] Consuming %s...' % n)time.sleep(1)r = '200 OK'def produce(c):c.next()n = 0while n < 5:n = n + 1print('[PRODUCER] Producing %s...' % n)r = c.send(n)print('[PRODUCER] Consumer return: %s' % r)c.close()if __name__=='__main__':c = consumer()produce(c)

协程的优点是可以用同步的处理方式实现异步回调的性能

文末给大家分享c/c++ Linux服务器高阶知识视频资料的朋友请加主页qun获取

知识点有C/C++,Linux,golang技术,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等等。

c++ 协程_深入理解异步I/O+epoll+协程相关推荐

  1. 深入理解异步I/O+epoll+协程

    前言 同步和异步的概念描述的是用户线程与内核的交互方式:同步是指用户线程发起IO请求后需要等待或者轮询内核IO操作完成后才能继续执行:而异步是指用户线程发起IO请求后仍继续执行,当内核IO操作完成后会 ...

  2. 深入理解异步I/O+epoll+协程,附上epoll原理解析以及协程现实与原理剖析视频

    前言 同步和异步的概念描述的是用户线程与内核的交互方式:同步是指用户线程发起IO请求后需要等待或者轮询内核IO操作完成后才能继续执行:而异步是指用户线程发起IO请求后仍继续执行,当内核IO操作完成后会 ...

  3. python生成器单线程_「Python异步编程-3」协程、生成器、yield 的联系

    异步编程的基础在于理解协程,而协程的基础在于理解生成器,而生成器的基础在于理解yield关键字,下面就来说说这几个概念. 什么是yield关键字? 相当于return关键字,在每次next(),或者f ...

  4. pdf 深入理解kotlin协程_深入理解Kotlin协程

    领取成功 您已领取成功! 您可以进入Android/iOS/Kindle平台的多看阅读客户端,刷新个人中心的已购列表,即可下载图书,享受精品阅读时光啦! - | 回复不要太快哦~ 回复内容不能为空哦 ...

  5. c++ 协程_理解Python协程(Coroutine)

    由于GIL的存在,导致Python多线程性能甚至比单线程更糟. GIL: 全局解释器锁(英语:Global Interpreter Lock,缩写GIL),是计算机程序设计语言解释器用于同步线程的一种 ...

  6. pdf 深入理解kotlin协程_协程初探

    Hello,各位朋友,小笨鸟我回来了! 近期学习了Kotlin协程相关的知识,感觉这块技术在项目中的可应用性很大,对项目的开发效率和维护成本有较大的提升.于是就考虑深入研究下相关概念和使用方式,并引入 ...

  7. 进程 线程 协程_进程 线程 协程 管程 纤程 概念对比理解

    不知道是不是我自己本身就有那么一丝丝的密集恐惧,把这么一大堆看起来很相似很相关的概念放在一起,看起来是有点麻,捋一捋感觉舒服多了. 相关概念 任务.作业(Job,Task,Schedule) 在进程的 ...

  8. python协程等待执行完成_异步等待的 Python 协程

    现在 Python 已经支持用协程进行异步处理.但最近有建议称添加协程以全面完善 Python 的语言结构,而不是像现在这样把他们作为生成器的一个类型.此外,两个新的关键字---异步(async)和等 ...

  9. java 协程_你真的了解kotlin的协程么?

    协程我的理解是协作的线程,就是说与主线程协作的线程,也就是工作线程. 而协程的本质确实是这样.Kotlin协程的底层就是Java的多线程,协程就是一个比较方便的线程框架.协程这种线程框架有什么好处呢? ...

  10. swoole mysql 协程_关于协程的优点以及swoole 协程的用法

    在上篇文章中php yield关键字以及协程的实现  我们讲到了协程的原理以及运行步骤. 现在我们来继续看下协程的执行顺序. 协程的运行是交叉式运行(串行),只要你发起了一次协程切换,则会立马暂停当前 ...

最新文章

  1. 回归算法分类,常用回归算法解析
  2. 4. 编程规范和编程安全指南--go语言
  3. 手动部署OpenStack环境(五:新建网络及部署虚拟机)
  4. 提高工作效率,请收下这8个神器
  5. Elasticsearch(一)架构及一般性应用
  6. 习题3-11 Kickdown UVA - 1588
  7. 三层神经网络实现手写数字的识别(基于tensorflow)
  8. mercurial使用_使用Mercurial在SQL数据库中对象更改的修订历史记录
  9. 常用类 (七) ----- 包装类
  10. Bootstrapbutton
  11. Logisim新手入门实验
  12. 分享2022年淘宝/天猫/京东618自动任务助手,带抢购功能源码
  13. es管理器免root_真正免root的ES文件浏览器详细使用教程
  14. 三色球问题python_面试题-三色球问题
  15. python的rs232通信_RS-232与Python的通信返回Gibberish
  16. GoLang结构体解析多维复杂json 坑了2天,毕竟还是我太弱了
  17. 真人电影中的幻想生物迷墙:索尼克为什么被骂到回炉重造?
  18. C语言的部分杂碎知识
  19. 基于Qt平台的集串口调试助手、示波器、图像显示功能于一体的上位机。
  20. (夏季)你不得不注意的一种比蚊子还可怕的东西!

热门文章

  1. MOSS提升权限方法
  2. 午夜时分的51CTO博客与白天有什么不同?
  3. Spring-day02
  4. 使用LoadRunner进行性能测试的简单步骤
  5. 数据库 char nchar varchar nvarchar 区别
  6. 自己写的一个分享按钮的插件(可扩展,内附开发制作流程)
  7. C#中奇怪的Queue T 行为!
  8. 拓端tecdat|python深度学习实现自编码器Autoencoder神经网络异常检测心电图ECG时间序列
  9. 拓端tecdat|R语言用关联规则和聚类模型挖掘处方数据探索药物配伍中的规律
  10. 拓端tecdat|R语言ggplot2 对Facebook用户数据可视化分析