2019-04-25 15:35
⁄ 工业·编程
⁄ 共 9715字
最近研究高性能C++协程,网上了解到了魅族libgo、腾讯libco、开源libaco、boost coroutine,这里记录一下。
1 什么是协程
协程可以很轻量的在子例程中进行切换,它由程序员进行子例程的调度(即切换)而不像线程那样需要内核参与,同时也省去了内核线程切换的开销,因为一个协程切换保留的就是函数调用栈和当前指令的寄存器,而线程切换需要陷入内核态,...
libaco, libco, libgo, 协程阅读全文
2017-08-08 17:59
⁄ 工业·编程
⁄ 共 1558字
1、协程是什么?
(1)线程
每一个线程都代表一个执行序列。当我们在程序中创建多线程的时候,看起来,同一时刻多个线程是同时执行的,不过实质上多个线程是并发的,因为只有一个CPU,所以实质上同一个时刻只有一个线程在执行。在一个时间片内执行哪个线程是不确定的,我们可以控制线程的优先级,不过真正的线程调度由CPU的调度决定。
(2)协程
协程跟线程都代表一个执行序列。不同的是,协程把线程中不确定的地方尽可能的去掉...
协程阅读全文
2017-07-25 15:40
⁄ 工业·编程
⁄ 共 4734字
libco 协程库在单个线程中实现了多个协程的创建和切换。按照我们通常的编程思路,单个线程中的程序执行流程通常是顺序的,调用函数同样也是 “调用——返回”,每次都是从函数的入口处开始执行。而libco 中的协程却实现了函数执行到一半时,切出此协程,之后可以回到函数切出的位置继续执行,即函数的执行可以被“拦腰斩断”,这种在函数任意位置 “切出——恢复” 的功能是如何实现的呢?
本文从...
libco, 协程阅读全文
2017-07-18 12:15
⁄ 工业·编程
⁄ 共 5451字
微信诞生于2011年1月,当年用户规模为0.1亿左右;2013年11月,微信月活跃用户数达到3.55亿,一跃成为亚洲地区拥有最大用户群体的移动终端即时通讯软件。
面对如此体量的提升,微信后台也曾遭遇棘手的窘境;令人赞叹的是技术人及时地做出了漂亮的应对。
这背后有着怎样的技术故事?
此时此刻,你在微信手机端发出的请求,是怎样被后台消化和处理的?这次,我们聚焦微信后台解决方案之协程库libco。该项目在保留后台敏捷的同步风...
libco, 协程, 微信阅读全文
2017-05-17 08:16
⁄ 工业·编程
⁄ 共 2404字
对于后台开发,一个重要问题即使用尽可能少的服务器资源处理海量的请求,除了我们再架构上做多机自动扩容外,我们还必须尽可能提高单机硬件的利用率(CPU利用率+IO利用率)
为了提高硬件的利用率往往我们采用三种技术路径:
多线程
异步IO
协程
协程和异步IO以及多线程的对比
多线程
多线程可以充分利用CPU的多核,实现真正的并行,它是操作系统的基础设施。但是线程是一个粗粒度、相对比较笨重的多任务的抽...
协程阅读全文
2017-05-10 07:26
⁄ 工业·编程
⁄ 共 1957字
之前一直没想明白了一个问题, 就是关于协程如何进行上下文切换。众所周知, 协程是分为有栈协程和无栈协程俩种. 区别在于是否有自己的调用栈来进行函数调用等操作.
有栈协程
有栈协程这里的做法比较好理解, 一般来说有俩种做法:
采用操作系统提供的api 类似 ucontext 或者 setjump longjump
用汇编操控寄存器保存状态 典型的例子
static void context_swap(struct Context* prev_, struct Context* next_)
{
// store in .da...
协程阅读全文
2017-05-03 06:45
⁄ 工业·编程
⁄ 共 1665字
https://github.com/tonbit/coroutine是一个精巧的C++非对称协程库。库只有一个.h文件(<500行的代码),使用时也仅需要include这个头文件。但是在功能上,可以提供Linux/Macos/Windows平台的几个必备的协程API(命名空间coroutine):
* 创建协程:routine_t create( std::function<void()> f );
* 销毁协程:void destroy( routine_t id );
* 恢复协程:int resume( routine_t ...
协程阅读全文
2017-04-26 18:17
⁄ 工业·编程
⁄ 共 1663字
对于IO密集型的程序,一般比较高效的做法是选择异步来实现,因为使用异步的方法更容易写出高效的程序。然而使用异步的话,经验较少的人往往会使自己的程序结构变得很混乱,进而导致程序的可读性变差。记得有人说过,在硬件飞速发展的现在,程序的可读性和可维护性的重要性在不断提高,甚至有一种更激进的说法,程序的可读性是第一位的。
从Boost的1.54版本开始,coroutine引入了一种新型...
协程阅读全文
2017-03-21 13:59
⁄ 工业·编程
⁄ 共 2693字
协程是在线程之上由“用户”构建的并发单元,对OS来说无感知,协程的切换由用户自己管理和调度。(这里的用户是相较于内核而言的,一些通用库这里也理解为用户)
C/C++怎么实现协程
作为一个C++后台开发,我知道像go, lua之类的语言在语言层面上提供了协程的api,但是我比较关心C++下要怎么实现这一点,下面的讨论都是从C/C++程序员的角度来看协程的问题的。
boost和腾讯都推出了相关的库...
协程, 多线程编程, 并发阅读全文