随笔分类 - 协程
摘要:一、简介 定时器是网络框架中非常重要的组成部分,往往可以利用定时器做一些超时事件的判断或者定时清理任务等。 定时器有许多经典高效的实现。例如,libevent 采用了小根堆实现定时器,redis 则结合自己场景直接使用了简单粗暴的双向链表。 时间轮也是一个非常经典的定时器实现,Linux 2.6 内
阅读全文
摘要:一、协程如何被调度? 调度器的实现,有两种方案,一种是生产者消费者模式,另一种多状态运行。 1.1 生产者消费者模式 逻辑代码如下: 1 while (1) { 2 3 //遍历睡眠集合,将满足条件的加入到ready 4 nty_coroutine *expired = NULL; 5 while
阅读全文
摘要:1.libco简介 libco是微信后台大规模使用的c/c++协程库,2013年至今稳定运行在微信后台的数万台机器上,使得微信后端服务能同时hold大量请求,被誉为微信服务器稳定性的基石。libco在2013年的时候作为腾讯六大开源项目首次开源。libco源码地址 libco首先能解决CPU利用率与
阅读全文
摘要:引言 生产者消费者模型 1 #include <unistd.h> 2 #include <stdio.h> 3 #include <stdlib.h> 4 #include <queue> 5 #include "co_routine.h" 6 using namespace std; 7 str
阅读全文
摘要:基础知识 首先我们来看下栈帧的定义: In C and modern CPU design conventions, the stack frame is a chunk of memory, allocated from the stack, at run-time, each time a fu
阅读全文
摘要:引言 协程 yield 和 resume 的第三种情况,也就是会发生协程切换的第三种情况,即调用 read(), write() 等 I/O 操作而陷入 “阻塞”和最后又恢复执行的过程,需要注意的是, 这里的“阻塞”依然是用户态实现的过程。我们知道,libco 的协程是在底层线程上串行 执行的。如果
阅读全文
摘要:引言 poll是libco中所有hook后的函数中可以说是最重要的一个,因为我们不但可以这个函数来隐式的转移CPU执行权,而且其他hook后的函数还可以使用这个hook后的poll在不切换线程的情况下去监听套接字,并在超时或者套接字有事件到来的时候唤醒这个调用poll的协程。 在example_co
阅读全文
摘要:引言 我们总能在运行libco协程代码的最后看到对于函数co_eventloop的调用,它可以理解为主协程执行的函数。我们举一个简单的例子来说明它的作用: 1 void* routinefun(void* args){ 2 co_enable_hook_sys(); 3 while(true){ 4
阅读全文
摘要:引言 在探究这个机制之前我们先来看看libco为什么被腾讯的工程师们创造出来。 如今微信已经是一个月活近12亿的现象级软件,不可否认其背后的技术架构一定是首屈一指的。但是罗马不是一日建成的。实际在微信运行之初其并发能力并不是像现在一样。事实上当时大部分模块都采用了半同步半异步模型。接入层为异步模型,
阅读全文
摘要:事件驱动与协程调度 协程的“阻塞”与线程的“非阻塞” 生产者消费者模型 1 /* 2 * Tencent is pleased to support the open source community by making Libco available. 3 4 * Copyright (C) 20
阅读全文
摘要:Libco 协程的生命周期 创建协程(Creating coroutines) 前文已提到,libco 中创建协程是 co_create() 函数。函数声明如下: 1 int co_create( stCoRoutine_t **co,const stCoRoutineAttr_t *attr,vo
阅读全文
摘要:libco 的协程 通过上一篇的分析,我们已经对 libco 中的协程有了初步的印象。我们完全可以把 它当做一种用户态线程来看待,接下来我们就从线程的角度来开始探究和理解它的实现机制。 以 Linux 为例,在操作系统提供的线程机制中,一个线程一般具备下列要素: (1) 有一段程序供其执行,这个是显
阅读全文
摘要:导论 使用 C++ 来编写高性能的网络服务器程序,从来都不是件很容易的事情。在没有应用任何网络框架,从 epoll/kqueue 直接码起的时候尤其如此。即便使用 libevent, libev 这样事件驱动的网络框架去构建你的服务,程序结构依然不会很简单。为何会这样?因为这类框架提供的都是非阻塞式
阅读全文
浙公网安备 33010602011771号