异步通讯中使用纤程(Fiber/UserSpaceThread)

本文探讨了在异步通讯中使用纤程(UserSpaceThread)优化线程切换开销的方法。通过在用户空间内执行多个纤程,实现了解码过程中遇到消息不完整情况时的快速切换,从而减少了传统线程池带来的性能损耗。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在异步通讯中,一般使用一个线程来select/poll/epoll,收到信号后,解码消息头,或者整个消息,然后将相应的fd交给其他线程处理。

这看上去的确是个很好的办法,但是,如果使用Tcp,并且遇到一个复杂的派发过程:收到的消息大小未知,而只能使用序列化方法解码消息然后根据其内容进行派发。这种情况的特征是:在大多数情况下,都可以无阻塞地读取并解码整条消息,但也有极小的可能在某条消息上阻塞(消息不完整)。

这种情况往往使用线程池,select线程一得到可读信号,就把相应的fd交给线程池处理。这样是解决了问题,但是又有个新问题:线程切换的开销太大。如果在高速局域网内,并且每个请求的实际执行时间非常短,问题就会比较显著。

想了很久,也想出了一个解决办法:利用Fiber/UserSpaceThread,中文译作纤程/用户空间线程,不懂的看这里

select线程收到读信号后,仍然执行解码,如果消息不完整,就将当前执行绪切换到Select执行绪,用行话说就是:将当前Fiber挂起,切换到Select Fiber。因为这多个Fiber都在用户空间中运行,所以速度非常快,并且,还不需要内核调度。其实速度的提升主要不是在这里,而是在大多数情况下不需要切换线程。

 

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值