brpc源码解析(十五)—— bthread栈创建和切换详解

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


以前的文章讲到了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的过程,如

评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值