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操作。这样,对某个协程而言,我们采用的是同步的模型,但是对于整个调度器(线程)而言,实际上却是异步模型。
实现协程同步
实现协程同步主要由两部分组成,一个是调度器,另一个则是具体的协程实现。通过查阅资料,可以用Libevent和GNU 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
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。