探究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状态如下

阅读更多

Rust语言

Rust 初识

初次知道rust-lang要从PingCap开始,PingCap开源的TiKV使用了rust作为开发语言,底层是RocksDB,使用rust ffi调用RocksDB的接口。所以就顺着去了解了一下Rust语言。

看了看Rust的语言特性,确实比较吸引人:所有权系统、泛型、trait、闭包、并发,包括了一个现代语言应该具备的所有特性。

阅读更多

经济学十大原理

概要

最近买了《经济学原理》上下册,想要了解一些基本的经济学原理。这两本书是很多人推荐过的,语言简单易懂,举例也很生动。如果有读者想要了解一点经济学,我也会推荐这套书。

个体决策

权衡取舍

我们总是面对各种决策以决定取舍,为啥会有取舍,因为个人资源是有限的。资源可以是时间,自由等无形的东西,也可以是食物,水等有形的东西。个体将资源分配到一项活动,就舍弃了另一项活动。从社会层面看,取舍实际上是一种对效率和平等的权衡。效率是指从资源中获得最大的利益,平等是指利益平均的分配给社会成员。

阅读更多

C++防坑(一)

引言

最近项目开发中遇到一些的小细节。很多时候我们明白导致问题的原理,但是在开发中还是会不小心犯错。这里列一下最近自己遇到的和看到的组内发现的错误。

引用失效

在一个模块中使用了vector来模拟队列,模块内一个线程以一定的频率从begin向end扫描,以处理那些达到条件的元素。处理的时候由于首先要判断条件是否满足,于是开发的时候手残的使用了引用。伪代码如下:

阅读更多