以前的文章讲到了bthread的相关机制,但主要是调度的规则等总体上的流程,关于bthread本身创建和切换相关的细节没有太多涉及,好久没看brpc代码了,这篇聊一下bthread是如何实现在pthread上进行创建和切换的。
一.bthread的本质
我们常说的linux线程指的是Light-weight process(轻量级进程,简成LWP), 在NPTL(Native POSIX Thread Library)的实现里,也就是pthread的实现里,是1:1的,也就是一个pthread对应一个LWP,而bthread则是M:N的,具体到实现上就是bthread运行在pthread上,并且可以在不同的pthread之间切换,一段时间内,同一个pthread可以运行不同的bthread,这很类似于协程,只不过我们常说的协程是N:1线程库,即所有的协程都运行于一个系统线程中,但除了这一点, bthead和协程很类似,它和协程一样,对于一个pthread来说,无论是bthread还是传统意义上的协程,核心都是如何在用户态完成协程或者bthread的切换,以减少上下文切换的开销。通俗地讲可以理解为如何进行各个子程序的切换。我们知道,程序在运行过程中的独有的状态主要有包含局部变量的栈和各个cpu寄存器,要切换本质上就是这些上下文的切换,目前开源生态里有不少组件提供了这些上下文的保存和切换,用于方便大家在用户态切换协程,比较有名的有boost::context,bhtread用到的则是libcontext,一个boost::context的轻量级版本。bthread的切换,具体到实现上,就是每个bthread有一块自己的栈存储空间,切换的时候就是切换栈顶指针和从栈里存取寄存器值。
二、相关汇编基础知识
为了更好的理解,我们需要先了解一下所用到的汇编的相关知识,这里简单介绍下相关的寄存器和指令。
2.1 x86-64CPU通用寄存器
通用寄存器分为寄存器分为被调用者保存寄存器,和调用者保存寄存器。假设有P调用Q的过程,如

本文深入探讨了bthread机制,解析其在Linux环境下的本质及如何在用户态完成线程切换,减少上下文切换开销。文章详细介绍了bthread的创建过程、堆栈结构及其切换原理,并辅以x86-64架构下的汇编指令进行说明。
949

被折叠的 条评论
为什么被折叠?



