创作人QQ:851301776,邮箱:lfr890207@163.com,欢迎大家一起技术交流,本博客主要是自己学习的心得体会,只为每天进步一点点!

个人座右铭:
1.没有横空出世,只要厚积一定发。
2.你可以学历不高,你可以不上学,但你不能不学习

此博客总结,主要是方便日后查看学习

以tcp server+epoll说明

一、同步和异步

同步:检测IO和读写IO在同一个流程

优点:代码逻辑简单,

缺点:相对异步效率较低(测试1000个连接接收数据和发送完成需要7000ms左右,因机器而异)

核心原因:阻塞等待接收数据

样例:

func () {while (1) {epoll_wait(); for(;;) {recv();send();}}}

异步:检测IO和读写IO不在同一流程

优点:多个线程共用一个fd,相对同步效率较高(测试1000个连接接收数据和发送完成需要1400ms左右,因机器而异)

缺点:逻辑复杂,代码难懂,需要引入多线程,占内存较大

核心思想:异步并不是两个线程,而是CPU切换去操作准备就绪IO,不用阻塞等待

样例掩码:

thread_cb(void *arg) {poll()recv();send();}func () {while (1) {epoll_wait();for (;;) {push_other_thread();}}}

二、上下文切换

举例:A线程对应IO刚操作完成,B线程对应IO准备就绪,此时CPU需要从A线程切换到B线程。

步骤如下:
        (1)CPU把寄存器里的值保存到A线程的栈中

(2)CPU把B线程数据加载到寄存器中

(3)开始运行B线程

三、同步异步与切换的关系

同步的计算机思维为:阻塞等待IO就绪,不做切换操作,慢的主要原因是,阻塞等待的时间过长,简单理解是以时间换取空间

异步的计算机思维为:如果IO未就绪,就切换到已准备就绪的IO去操作,大量减少了阻塞等待时间,从而使得CPU的使用率提高,来提高效率。简单理解:以空间换取时间

四、协程解决什么问题?

协程是使用同步的编程思想,达到异步的效率

核心点:

1.使用异步IO未就绪,就切换到已经准备就绪的IO去操作
           解决了异步代码逻辑复杂,同步效率低的问题,效率接近异步

2.协程的栈可以设置比线程更小,使得更加容易

解决了线程占用栈空间更大的问题,硬件的使用率更高,同异步的效率,硬件成本会更低

        3.线程的创建代价和调度代价相对比较高

五、协程的缺点

1.寄存器

目前网上主要的协程库为:libgo/Netco,目前代码中都是x86架构的通用寄存器,那么我们如果在x86架构开发,如果寄存器不存在偏差,那么YYDS了,但是如果想要移植到ARM或者寄存器有偏差的,就需要非常熟悉寄存器,对于很多的软件工程师而言,能不能拿到CPU对应的寄存器说明也会比较难。所以,在使用之前你必须先熟悉对应的寄存器。

2.栈的认识和理解

很多的做纯软件的,根本不会关心栈问题,但是使用协程必须关心栈的问题,需要根据自己的实际情况去设置,如果使用过小,无法跑起来,使用过大,就失去了协程一定的优势。

3.抽象

要想用好协程,即使调用的对应的API,那也需要对协程的原理认识比较清楚,协程的原理很抽象,比较难理解。对很多基础东西:epoll、reactor、异步操作等等,基础要求比较多在加上,涉及到了一些比如协程定义、调度器等等,不好理解。如果不能理解清楚,在使用的时候必然也会存在一定的误区和偏差。

4.使用汇编实现

代码中牵扯到切换部分,使用原子操作,使用汇编实现,需要对原子操作和汇编有基础的了解

六、协程的做法

1.longjmp和setjmp

这个可能听过的人比较少,大部分知道try/catch,其实logjmp和setjmp是try/catch的核心实现,网上有人说此种方式无法实现,具体后期有时间了,可以自己验证,留一个后补在这里

2.使用汇编自己实现跳转

目前大数据的lib库,都是使用这种方式,只不过使用语言有所偏差

协程一(协程优缺和解决实际问题)相关推荐

  1. 计算机的usn插口无法读取,USB3.0还缺谁 解决主板插槽不健全方案

    1干净利落 解决主板插槽不健全 USB3.0无论多么火热,对于老平台或前一代LX版的主板而言也是空谈.目前多数用户无法体验到高速接口优势的主要原因并不是承担不起产品售价,平台限制才是最大的问题. 常用 ...

  2. 碳化硅MOSFET、硅MOSFET及IGBT的优缺对比

    碳化硅MOSFET.硅MOSFET及IGBT的优缺对比 1:高工作频率:传统MOSFET工作频率在60KHZ左右,而碳化硅MOSFET在1MHZ 用途:高频工作,可以减小电源系统中电容以及电感或变压器 ...

  3. 2021计算机行业还有前途吗?从业十二年的程序员告诉你优缺!

    高考成绩公布之后群里总有小伙伴问码哥,大学学什么专业好?计算机专业还有发展前景吗?话不多说,我们上图 计算机这个专业从它诞生的那一天起到现在一直都是一个热门,而且从图中我们可以了解到,直到现在都没有退 ...

  4. 车仪表台上的装饰_汽车仪表台用放防晒垫吗?知道其优缺点后,你还敢放置吗?...

    汽车已成为我们出行的主要交通工具,几乎是家家户户都有了自己的小汽车,并且10个车主中有9个车主都比较爱惜自己的爱车,比如说为了减少盲点在后视镜上加装小圆镜.后车牌旁边贴有壁虎标识.汽车档杆处放有佛珠. ...

  5. 步步为营!高手教你如何有效使用深度学习解决实际问题

    来自法国 Capgemini Invent 公司的高级数据科学家 Ahmed BESBES 三个月前参加了一个其公司内部的比赛:使用机器学习方法帮助海洋科学家更好的识别鲸鱼,根据鲸尾页突的外观作为主要 ...

  6. 如何利用计算机解决定量问题,管理运筹学解决实际问题的步骤及内容.doc

    管理运筹学解决实际问题的步骤及内容 管理运筹学解决实际问题的步骤及内容 管理运筹学是管理科学.近代应用数学和计算机技术的一个交叉学科,主要是将生产.管理等过程中出现的一些带有普遍性的资源运筹问题加以提 ...

  7. 【CCAI 2016】大疆李泽湘:智能机器人解决实际问题的路径

    8月26日至27日,在中国科学技术协会.中国科学院的指导下,由中国人工智能学会发起主办.中科院自动化研究所与CSDN共同承办的2016中国人工智能大会(CCAI 2016)在北京辽宁大厦盛大召开,这也 ...

  8. 【每日新闻】 百度张亚勤:小公司不要做平台,应聚焦解决实际问题 | 工信部:确保取消流量“漫游”费7月1日如期兑现...

    点击关注中国软件网 最新鲜的企业级干货聚集地 2018中国软件生态大会暨第十一届中国软件渠道大会首站在北京成功举行,同时拉开了覆盖北京.上海.深圳.成都.西安等全国16个重点城市生态对接与合作年度盛会 ...

  9. 运用《深入理解Java虚拟机》书中知识解决实际问题

    前言 以前看别人博客说看完<深入理解Java虚拟机>这本书并没有让自己的编程水平提高多少,不过却大大提高了自己的装逼水平.其实,我倒不这么认为,至少在我看完一遍这本书后,有一种醍醐灌顶的感 ...

最新文章

  1. Retrofit 网络请求参数注解@Path @Field @Query 等使用
  2. 我去,你写的 switch 语句也太老土了吧
  3. python中float与eval式一样的吗_用Python最原始的函数模拟eval函数的浮点数运算功能...
  4. VirtualBox 使用 NAT 方式网络的 SSH 连接
  5. treasure what you have now
  6. 代码创建 WPF 旋转动画
  7. .net core 注入中的三种模式:Singleton、Scoped 和 Transient
  8. C语言中的“三字母词”坑了工程师
  9. oracle怎么查语句消耗时常,Oracle 查找常见耗性能的语句
  10. “驱动能力”是什么意思???
  11. android 蓝牙开锁功能,蓝牙智能锁工作原理及功能介绍
  12. 微信翻译助手小程序 day2 -翻译功能页
  13. iPadOS、iOS13降级iOS12.3.1方法
  14. 软件开发的心得体会(一)
  15. TIBCO Rendezvous 概念
  16. EasyRTMP手机直播推流到EasyDSS进行RTMP直播过程中分辨率反复切换崩溃问题解决
  17. 呼吸灯在哪里设置苹果_苹果前呼吸灯在哪里设置
  18. Java 无需解压直接读取ZIP压缩包里的文件及内容
  19. 再见 Win10!再见操作系统!
  20. SPM——Spatial Pyramid Matching

热门文章

  1. STC89C52实现时钟功能
  2. 一个简洁的斐波那契求法和它的简单应用
  3. 富友eERP打造服装企业电子商务快鱼时代
  4. LinkPdf转换器-PDF转换成Word使用教程
  5. 移动端苏宁首页制作和rem
  6. Python爬取百度百科,BeautifulSoup提取关键信息
  7. 【Sqlite】sqlite安装与使用
  8. 北邮计科院导师简况2009-09-27 14:13:38
  9. 开发视频直播APP需要了解的技术原理和技术细节
  10. 什么是项目?项目有哪些特点?