首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
您找到你想要的搜索结果了吗?
是的
没有找到

C++|并发|libco协程剖析

linux根据POSIX标准提供了ucontext库支持原生协程,但是在POSIX.1-2008中被废除了。大概是因为协程在语言级别就能实现,所以没必要扔系统层,KISS?...makecontext(ucontext_t *ucp, void (*func)(), int argc, ...) - 创建ucontext并赋予栈空间 setcontext(const ucontext_t...*ucp) - 从ucp获取ucontext并设置上下文 getcontext(ucontext_t*ucp) - 保存当前的ucontext在ucp中 swapcontext(ucontext_t*...oucp, ucontext_t*ucp)- 相当于get然后set其他协程 生产者直接调度至消费者,最优调度 ---- Context Switch 上下文切换是调度的核心,在libco中通过coctx_swap.S...对应swapcontext(ucontext_t*oucp, ucontext_t*ucp) 结构体声明 印证了上面提到的TCB冗余,这里的上下文仅仅保存了除了r10和r11之外的通用寄存器、栈的大小、

92210

手把手教你从零开始实现C++协程

owl.context 接口设计 业界比较有名的上下文切换库有 ucontext 和 boost.context,其中 ucontext 的接口文档齐全且语义清晰,而 boost.context 的接口略显晦涩...为了代码便于理解,一开始 owl.context 打算直接兼容 ucontext 接口,仔细研究后发现 ucontext 的一些设计在如今看来并不合理,严格遵循 ucontext 的接口会导致不必要的实现复杂度...因此最终的接口整体保留了 ucontext 的语义,但在细节上做了一些优化。...中 makecontext 的函数原型为: void makecontext(ucontext_t *ucp, void (*func)(), int argc, ...); 由于其入口函数可以支持多个...int 参数,参数个数大于 4 时需要进行压栈,因此 ucontext 中实现 makecontext 会比较复杂。

3.1K50

Intel CET缓解措施深度研究

Ucontext ucontext涉及到协程相关的技术,该技术和系统调⽤在R3、R0间的切换⽐较类似。但是该技术作⽤于⽤户态,⽬ 的是给⽤户态程序提供更快的切换效果,以及使得⽤户态的代码能够更加灵活。...常⽤的函数为getcontext/setcontext: setjmp/longjmp的技术原理和实现和ucontext类似,就不提及了。...ucontext协程技术涉及到上下⽂切换的场景,也会存在数据栈切换的情况,因此,shadow stack也需要做出相应 的动作。 ...中的改动,先⽤ __NR_arch_prctl 系统调⽤获取当前shadow stack的基地址,其 次将其保存在SSP_BASE_OFFSET寄存器中,随后保存shadow stack基地址、ssp值在ucontext...结构体中,供后续 setcontext使⽤: 再来看setcontext中的改动,校验getcontext保存的ucontext中的shadow stack基地址和ssp,再恢复,达到切换 回上⽂状态的

79520

微信libco协程库源码分析

除此之外,libco不使用ucontext进行用户态上下文的切换,而是自行写了一套汇编来进行上下文切换。 另外,libco利用co_create创建的协程, 需要自行调用co_release进行释放。...协程上下文切换性能更好 我们之前提到,云风的coroutine库使用ucontext来实现用户态的上下文切换,这也是实现协程的关键。...而libco基于性能优化的考虑,没有使用ucontext,而是自行编写了一套汇编来处理上下文的切换, 具体代码在coctx_swap.S。...栈:rsp栈顶指针 相比于ucontext,缺少了浮点数上下文和sigmask(信号屏蔽掩码)。具体可对比glibc的相关源码。...据知乎网友的实验证明:libco的上下文切换效率大致是ucontext的3.6倍。

1.6K30

云风coroutine协程库源码分析

整体基于ucontext和共享栈模型实现了有栈协程,代码质量毋庸置疑,本文将详细剖析该协程库的实现原理。 同时,我也提供了coroutine注释版,辅助大家理解coroutine的代码。...Linux下提供了一套函数,叫做ucontext簇函数,可以用来获取和设置当前线程的上下文内容。这也是coroutine的核心方法。...接下来是makecontext,这个函数用来设置对应ucontext的执行函数。如上,将C->ctx的执行函数体设置为了mainfunc。...swapcontext 将当前上下文保存到当前协程的ucontext里面,同时替换当前上下文为主协程的上下文。 这样的话,当前协程会被挂起,主协程会被继续执行。...参考 ucontext簇函数学习 为什么觉得协程是趋势?

1.4K50

有栈协程和无栈协程

我们选用两个协程库进行介绍,云风的基于ucontext函数簇的协程库和libco。...基于ucontext协程库 ucontext即user thread context,用户线程上下文,是Linux系统自带的一套用于获取、修改和切换当前线程上下文的结构和相关方法;主要包括:ucontext_t...结构体和context函数簇; 关于ucontext函数簇 其中ucontext_t结构体: typedef struct ucontext { unsigned long int uc_flags...*ucp),将当前执行上下文信息保存在ucp指向的ucontext结构体中 int setcontext(const ucontext_t *ucp),将ucp中保存的寄存器信息恢复到CPU中,用于将当前程序切换到目标上下文...,初始化一个ucontext_t,并设置入口函数为func int swapcontext(ucontext_t *oucp, const ucontext_t *ucp),切换上下文,保存当前上下文到

4.3K43

扫码

添加站长 进交流群

领取专属 10元无门槛券

手把手带您无忧上云

扫码加入开发者社群

相关资讯

热门标签

活动推荐

    运营活动

    活动名称
    广告关闭
    领券