• 协程的相关概念


    1、在用户空间中实现线程

    1)特点:把整个线程包放在用户空间,内核对线程包一无所知。从内核角度考虑,就是按正常的方式管理,即单线程进程(存在运行时系统)

    2)优点

    1、用户级线程包可以在不支持线程的操作系统上实现。

    2、线程切换至少要比陷入内核要快一个数量级。在线程完成运行时,它调用thread_yield可以把该线程的信息保存在线程表中;进而,它可以调用线程调度程序来选择另一个要运行的线程。保存该线程状态的过程和调度程序都只是本地过程,所以启动它们比进行内核调用效率更高。另一方面,不需要陷阱,不需要上下文切换,也不需要对内存高速缓存进行刷新,这使得线程调度非常快捷。

     协程介绍

      协程,即协作式程序,其思想是,一系列互相依赖的协程间依次使用CPU,每次只有一个协程工作,而其他协程处于休眠状态。协程可以在运行期间的某个点上暂停执行,并在恢复运行时从暂停的点上继续执行。协程可以被认为是一种用户空间线程,与传统的线程相比,有2个主要的优点:   

      1. 与线程不同,协程是自己主动让出CPU,并交付他期望的下一个协程运行,而不是在任何时候都有可能被系统调度打断。因此协程的使用更加清晰易懂,并且多数情况下不需要锁机制。

      2. 与线程相比,协程的切换由程序控制,发生在用户空间而非内核空间,因此切换的代价非常小。

    http://blog.csdn.net/lujiandong1/article/details/44726373

    协程同步原理

        

        

      在一个线程内部,存在一个调度器,调度器的功能如下:

      1. 创建协程

      2. 负责调度这些协程

      3. 调度器内部维护一个多路复用(epoll/select/poll)。

      如上图所示,调度器首先创建3个协程,这三个协程将自己关注的socket事件注册到调度器上面,当调度器内部的多路复用(eppll/select/poll)受信时,则调度器恢复该受信socket所在协程的控制权。该协程开始执行具体的IO操作。这样,对某个协程而言,我们采用的是同步的模型,但是对于整个调度器(线程)而言,实际上却是异步模型。

    实现协程同步

      实现协程同步主要由两部分组成,一个是调度器,另一个则是具体的协程实现。通过查阅资料,可以用LibeventGNU Protable Threads这两个库来实现。 Libevent库是一个事件触发的网络库,用来做调度器来维护多路复用,而GNU Protable Threads是一个协程库,用这个库可以用来实现协程的创建、删除、挂起、恢复等功能。

    http://www.cnblogs.com/konakona/archive/2013/11/15/3425655.html

    协程

    协程通过在线程中实现调度,避免了陷入内核级别的上下文切换造成的性能损失,进而突破了线程在IO上的性能瓶颈。当涉及到大规模的并发连接时,例如10K连接。以线程作为处理单元,系统调度的开销还是过大。当连接数很多 —> 需要大量的线程来干活 —> 可能大部分的线程处于ready状态 —> 系统会不断地进行上下文切换。既然性能瓶颈在上下文切换,那解决思路也就有了,在线程中自己实现调度,不陷入内核级别的上下文切换。说明一下,在历史上协程比线程要出现得早,在1963年首次提出, 但没有流行开来。为什么没有流行,没有找到信服的资料,先挖个坑,以后那天了解后,再补上

    作者:Ljian1992

    链接:https://www.jianshu.com/p/f11724034d50

    来源:简书

    简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

  • 相关阅读:
    php l练习(写着玩)
    位、字节、字
    ueditor上传图片时目录创建失败的问题解决方法
    tp5插入百度富文本编辑器UEditor
    PHP实现用户异地登录提醒功能的方法
    tp5知识点
    TP5语法
    微擎url
    微擎多图片上传
    微擎函数Iserializer和Iunserializer序列化函数
  • 原文地址:https://www.cnblogs.com/feng9exe/p/10478308.html
Copyright © 2020-2023  润新知