Qemu中coroutine机制的实现

最近在看virtio的代码,看到virtio后端时发现在Qemu处理IO的时候使用了coroutine,之前对coroutine不了解,因此专门找了点资料学习并分析了下Qemu中的实现,于是做个笔记。Qemu貌似提供了好几种coroutine的实现方式(gthread、ucontext、sigalstack),我只看了利用ucontext实现的部分。

网上有一篇同主题的博文(http://www.cnblogs.com/VincentXu/p/3350389.html),里面有Qemu中coroutine机制相关的两个数据结构的介绍,所以就不写这两个结构体了;除此之外,还需要用到ucontext相关的和setjmp/longjmp,这些网上也有大把资料。

为了描述上的方便,将coroutine的执行函数(也就是传递给makecontext的第二个参数)称作“coroutine-function”,将在“coroutine-function”中会调用的真正进行用户期望的函数(也就是Coroutine结构中的entry函数指针)称作“user-code”。

Qemu中如何使用coroutine:

Qemu中主要提供了三个接口,使用的话应该要遵循qemu_coroutine_create-->qemu_coroutine_enter-->qemu_coroutine_yield这样的顺序。其中qemu_coroutine_yield可以不调用,这样的话Qemu将在“user-code”返回的时候主动去COROUTINE_TERMINATE。如果调用了qemu_coroutine_yield,比如说是在异步IO中,此协程会被“挂起”,等到IO完成时候在callback中调用qemu_coroutine_enter进入该协程运行,而此时刚好该协程运行的是“主动COROUTINE_TERMINATE”那句,从而完成了协程的推出

qemu_coroutine_create分析:

Qemu中有一个coroutine池,如果启用了coroutine池,那么会尝试从中取出一个,当然池中没有coroutine实例或者没启用coroutine池的话那就只能用qemu_coroutine_new分配一个实例:
Coroutine *qemu_coroutine_create(CoroutineEntry *entry)
{
    Coroutine *co = NULL;

    if (CONFIG_COROUTINE_POOL) {
        co = QSLIST_FIRST(&alloc_pool);
        if (!co) {
            ......
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值