博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
libco几点体会
阅读量:4683 次
发布时间:2019-06-09

本文共 878 字,大约阅读时间需要 2 分钟。

 

这里说的是Tencent开源的libco。

libco的用途

主要还是c/c++服务端,相比libevent,libco支持的平台有限。但是libco显得更先进,可以写“阻塞式代码”,改造旧库的时候甚至不需要改代码。

libco是独立的库,没有侵入性,能插入到几乎所有代码中使用。但是,libco需要运行一个永久阻塞的函数,这意味着,libco是独占的,一个系统线程内,不能有其他调度和阻塞函数,比如阻塞的网络函数,其他coroutine的类似实现,无限循环等。

 

学习libco

看例子是最快最直观的,官方库上就有很多example。

 

libco的调度,相比goroutine的不同

libco需要通过co_yield_ct()等yield函数主动进行切换,切换出去的微线程,需要其他微线程co_resume才能运行,否则是不会被调度的。这个和goroutine不一样。

libco的网络函数,会主动调用yield函数进行切换,然后由运行event_loop的微线程恢复,因此需要显式地调用co_eventloop这个函数。

 

libco的内存模型

libco的栈可以是独立的,也可以是共享的。

独立的预先申请栈大小使用,注意栈的大小,通常比较小。

共享的先申请一个大栈,然后libco切换的时候根据栈使用的大小拷贝到另一个内存。因此最大值还是受到共享栈大小的影响。

 

全局信息

libco的微线程信息,保持一个context上,这个context根据线程pid保存在一个全局大数组上。所以每一个线程独立调度下面的所有微线程。

所以每一个系统线程,有网络收发的都需要调用co_eventloop。

 

libco如何获得实际的栈大小

活着栈顶之后减去栈基。

//get curr stack sp
char c;
curr->stack_sp= &c;

int len = stack_mem->stack_bp - occupy_co->stack_sp;

 

转载于:https://www.cnblogs.com/dearplain/p/9820913.html

你可能感兴趣的文章
源代码管理工具
查看>>
0415评论博客园
查看>>
javamail邮件中插入图片
查看>>
【日记】SRAM的读取操作
查看>>
EBS创建相应的用户
查看>>
使用RMAN对控制文件进行restore
查看>>
简单去除exe自校验方式
查看>>
leetcode-1006 Construct Binary Tree from Inorder and Postorder Traversal
查看>>
Photoshop切图
查看>>
pygame学习笔记(4)——声音
查看>>
对图片进行压缩、水印、伸缩变换、透明处理、格式转换操作1
查看>>
Spring Boot 知识笔记(thymleaf模板引擎)
查看>>
Python爬虫(二十二)_selenium案例:模拟登陆豆瓣
查看>>
STL中list的erase()方法
查看>>
xcode如何支持8.0以下
查看>>
scrum 12.1
查看>>
@property参数
查看>>
Spring 中 SQL 的存储过程
查看>>
C语言中制表符小结(转)
查看>>
解决Kali Linux没有声音
查看>>