知乎问题:多路复用一样会阻塞用户线程,那它和同步阻塞有什么区别? - Twosee的回答

有个叫@轩辕之风的答主用打电话和微信作比喻,让我觉得很有意思,所以作了这篇回答。

同步阻塞就是语音通话,一个人同时只能处理一个会话,对端不说话就是读阻塞,你说的太快对方听不过来就是写阻塞… 但是用短信作为多路复用的比喻让我感觉差了那么点意思,或许改成QQ微信聊天更佳,我斗胆扩写一下:

普通人:

  • 在和女神的单聊界面苦等(阻塞等待,对应阻塞的recv()等)
  • 工作的时候也要动不动关注女神有没有回复,陷入备胎陷阱,心思没办法维持在工作上,效率低下 (CPU时间被大量浪费在阻塞系统调用上,频繁陷入内核态,上下文切换开销很大)
  • 出现了新的恋爱机会,但是没办法同时处理,因此只能拱手让人(一个同步阻塞进程同时只能处理一个连接,当Master进程调度时或当其他进程也在监听同一端口时(REUSE_PORT),新的连接会被分配给其它进程)
  • 虽然看起来很捞,但是很专一 ,并且这也是大多数普通人的求偶方式。(虽然性能不如多路复用,但是网络编程生态很大一部分都建立在同步阻塞的编程模型之上,并且它易于理解,对于开发者心智负担较低

海王:

  • 从不在工作的时候主动等消息,游刃有余(充分利用CPU时间,尽量跑在用户态上)
  • 有空摸鱼的时候才顺便打理鱼塘,看下手机有没有消息(CPU运算任务告一段落,检查是否有IO事件,对应**epoll_wait()**之类的调用)
  • 检查有多少个妹子给自己发消息了,点亮手机发现收到100个联系人的未读消息通知 (epoll_wait()返回了100,说明有100个文件描述符就绪
  • 遍历处理,但绝不在和某个妹子的会话上单独等待,除非除了把妹之外没事可干了,否则处理完后马上就该干嘛干嘛,进入下一轮循环。(遍历处理可读可写事件,执行非阻塞IO操作,即不会长时间阻塞在某个socket上,而是进入下一轮事件循环再统一等待

那么,哪怕是一个只会把妹,别的人事啥也不干的海王,它搞定100个妹子的时间也不过是MAX(搞定妹子0的时间, 搞定妹子1的时间, 搞定妹子2的时间, ...搞定妹子99的时间),而普通人可能就需要 搞定妹子0的时间 + 搞定妹子1的时间 + 搞定妹子2的时间 + 搞定妹子99的时间 ,当妹子的数量越多,搞定妹子的时间越长,海王的优势就越明显。(如本地网络IO速度极快,多路复用的性能优势就不明显,而外部网络尤其是慢速网络环境下,多路复用技术就能体现出其巨大的性能优势

设计合理的高性能海王能快速祸害成百上千的妹子,而同步阻塞的普通人或许终其一生都无法达到十之一二就因为阳寿耗尽(ETIMEDOUT)被KILL了。

原有的车马很慢书信很远一生只够爱一个人已不能满足当代人日渐空虚的内心和永远填不满的情感需求,海王之风因而大行其道(当原有的多进程多线程+同步阻塞模式不能满足日益增长的高并发需求,多路复用技术因此而兴起)。


脑洞又开了开,每当出现一个新来的妹子时,伺机而动的单身狗们全都被惊动,变成舔狗,但它们之中只有一个人能得逞,这就是惊群,频繁的惊群极大地损害了得不到妹子的舔狗们的身心,造成了感情的浪费。(惊群问题是计算机科学中,当许多进程等待一个事件,事件发生后这些进程被唤醒,但只有一个进程能获得执行权,其他进程又得被阻塞,这造成了大量的系统上下文切换开销

而如果你是屌丝,你大概率会倒在这几步

  • 找不到妹子 (DNS resolution failed)
  • 找到心仪的妹子加微信被拒绝(Connection refused)
  • 加上妹子了妹子发现你是屌丝然后装死 (Connection timed out)
  • 加上妹子了妹子发现你是屌丝然后把你删了(Connection reset by peer)
  • 在你发消息的时候你发现妹子把你删了(Broken pipe)
  • 妹子把你拉黑了(加入防火墙黑名单)

但是我们不用气馁,海王撩妹也是有上限的,因为微信有5000个好友的上限,那么即便是最顶级的海王,也只能同时搞定5000个妹子,这就是经典的C5K问题(笑,这里对应了单机能力是有上限的,不能无限扩展

但是坏了,写到这里我才想来,海王可以有多个手机,多个微信,这就升级到集群了……集群还可以解决单个微信每天加的妹子太多,被微信限制的问题,多个微信均衡负载,每天可以加的妹子数量又上升了…

高级别的海王意识到用一个微信很容易出岔子,发个朋友圈还得小心翼翼地设置有谁可见,那么它就会对自己的服务拆分,工作、家庭、亲戚、朋友、鱼塘全都解耦,于是分布式海王诞生了…

注重安全的海王会和妹子用多种社交APP建立联系,防止某个约妹APP突然挂了或是被下架导致鱼塘损失,这是多活容灾

找到规律的海王会形成一套把妹话术,妹子多了很难一一应付,就在把妹之前预加载好话术,根据妹子的类型找到话术缓存,降低压力。

知进退的高级海王知道有些妹子不好对付,引入了熔断降级机制,而普通人只知道在一棵树上吊死,感情失败黑化了,想学习海王,结果被妹子拒得心态血**(雪)崩**。

虽然跑题跑远了… 但是这还可以告诉大家,网络编程到多路复用这里只是刚刚开始,C10K后面还有C10M,现在还喜欢动不动就百万千万亿万并发的,瞎几把编到这里我也编不下去了….