探究coroutine(二)

previously

在上一篇我们简单了解了linux下的调用约定:每个CPU上有16个通用寄存器,其中6个在调用函数的时候用作参数传递,多余6个的参数通过栈来传递。进程的栈空间每调用一层函数就向低地址方向扩展一个栈帧。

这两篇文章的目的是讲清楚协程在线程的栈上切换的流程。本文分析两个开源项目:云风的coroutine和腾讯的libco。我们只关注其栈的切换逻辑。

coroutine

coroutine的地址为:cloudwu/coroutine 。 这个项目实现的非常简洁,核心就两个文件 coroutine.hcoroutine.c. 头文件提供的接口:

阅读更多

探究coroutine(一)

what is coroutine

在很多高级语言中有协程,比如golang中的goroutine,lua中的coroutine,boost中的fiber。协程是比线程更小的运行单位,通常支持协程的语言都是在一个线程中运行多个协程,线程中某一时刻只有一个协程在运行。当协程进入阻塞调用时,切换上线文,把pending的其他协程还原到线程栈内执行下一个协程。

协程让我们写的代码看起来是同步的,但是实际运行时却是异步。

coroutine impl

如何实现协程?实际上协程的切换就是线程上线文的切换。为了搞清楚上下文切换,我们首先需要搞清楚进程内如何调用子过程。

阅读更多

网络丢包的追查

问题背景

最近业务反馈了一个问题:业务进程启动过程很慢,通过pstack查看卡在了我们提供的组件内。这个问题出现在业务的preonline环境,生产环境并没有出现。所以我认为与我们的服务关系不大,但是究竟什么回事,还是需要有个说法。

追查过程

现象

业务进程启动过程中的pstack状态如下

阅读更多