【中间件】bthread效率为什么高?

bthread效率为什么更高?

1 基本概念

bthread是brpc中的用户态线程(也可称为M:N线程库),目的是:提高程序的并发度,同时降低编码难度,在多核cpu上提供更好的scalability和cache locality。其采用M:N模型,即多个用户线程(bthread)映射到少量的系统线程(pthread)上。
linux当下的pthread实现(NPTL)是1:1的,M个bthread也相当于映射至N个LWP。
bthread前身是Distributed Process(DP)中的fiber,一个N:1的合作式线程库,等价于event-loop库,但是同步方式。

注:

  1. NPTL(Native POSIX Thread Library) 是 Linux 系统中用于实现 POSIX 线程(pthread)标准的线程库。

2 高效做法

  1. 用户态调度:避免内核态和用户态之间的切换开销,上下文切换更快。系统线程的切换需要内核接入,而用户态线程的切换完全在用户空间完成,减少了系统调用和上下文切换的开销。
  2. 更轻量级的上下文切换:用户态线程的上下文数据量小,只需要保存必要的寄存器状态,而内核线程需要保存更多的状态信息,比如浮点寄存器、信号处理器等。
  3. M:N模型:多个用户线程由较少的系统线程调度,减少了系统线程的创建和销毁开销,同时也减少了上下文切换的次数。系统线程的数量通常与cpu核心数相当,避免了过多的线程竞争。
  4. 无锁或细粒度锁的数据结构:任务队列使用无锁队列或细粒度锁,减少了线程间的竞争和等待时间,提高了并发性能。
  5. 工作窃取(work stealing):当某个工作线程的任务队列为空时,可以从其他线程的队列中窃取任务,实现负载均衡,避免线程空闲,提高资源利用率。
  6. 定制化的内存池管理:采用内存池技术,复用栈空间,减少内存分配和释放的开销,避免频繁的系统调用。
  7. 避免阻塞系统调用:通过异步IO或非阻塞IO配合事件驱动,减少了线程因IO操作而阻塞的情况,提高了CPU利用率。

进一步解释

  1. 用户态调度
    避免内核陷入;
    能够实现0系统调用(无需内核调度器);
类型 上下文切换时长 操作
用户态 50 - 100 ns 仅需保存/恢复必要的寄存器(约10个reg)
内核态 1-5 us 保存完整的上下文(浮点寄存器、信号处理器等);切换内核态堆栈
  1. M:N模型
维度 M:N模型 1:1模型(eg. pthread)
线程数量 百万级用户线程 千级系统线程
调度开销 用户态协作式调度 内核抢占式调度
内存占用 每个线程约4-64KB栈 每个线程约2-10MB
创建/销毁成本 微秒级(纯用户态操作) 毫秒级(需内核参与)
  1. 任务调度策略
  • 工作窃取算法
Task *steal_task()
{
   
   
	for (Worker &w : other_workers) {
   
   
		
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值