Unix哲学与高并发_dog250-CSDN博客

在这里插入图片描述

说起高并发,一篇著名的古文值得一读:
http://highscalability.com/blog/2013/5/13/the-secret-to-10-million-concurrent-connections-the-kernel-i.html
这篇文章的核心是:

  • 不要将线程调度当作数据包调度,要自己做数据包调度。

细读此文,不再赘述。本文说另一个点:Unix哲学是一个控制面哲学,Unix哲学并不适合数据面。

引述一段文中的话:

He starts with a little bit of history, relating how Unix wasn’t originally designed to be a general server OS, it was designed to be a control system for a telephone network.

就算没这句话我们也该知道操作系统本就是控制面概念,引用这句话是为了说历史很重要。现在之所以如此,因为它一开始就是这个样子。

Unix哲学提倡组合只做一件事的小程序,而非写一个大程序。表面上看这和大并发的思路是相悖的,大并发要避免创建多个进程。把控制面和数据面分开就好理解了。

Unix作为控制面,提倡组合数量可预期的,功能不同的小程序协作完成一件事。高并发处理的是数据面,需要派生相同的任务处理相似的请求。

以工厂和住宅公寓为例,引用周日发的一则朋友圈:

Unix提倡编写多个独立的小程序进行协作,而协程却提倡创建多个协程组成一个大进程。这是矛盾的。因为Unix哲学是Unix作为控制面提出的,而在数据面设计中,独立进程处理单独数据流就不妥,会有至少O(n)损耗。好比工厂和住宅公寓对比,工厂为每一个单独的工序盖一座车间是必要的,车间之间以传送带和线缆连接,但为每一个工人造一座房子不合适,所有工人要挤在一座公寓楼。

每一个车间只完成一件事,并不高大,往往平层,多个车间组合就能生产产品。此即Unix哲学。

每一个工人只需要同一座公寓楼里一个房间,借由房门,电梯,楼梯调度沟通。此即数据面哲学。

将地基看作系统开销,显然每一个车间都需要一个独立的地基,而所有工人的房间共享同一座公寓楼的地基就行了。

基于以上理解,仅在并发意义上,看什么是协程。

协程是尽量将更多相同的任务塞进同一个操作系统线程的一个手段。

没人这么说过吧。是不是耳目一新?

协程对于大并发的关键就是多个协程共享同一个操作系统线程,至于协作式还是抢占式,调度切换,不是重点。

epoll编程大家都会,但写起来麻烦,要自己调API,自己轮询事件,自己处理事件。将公共操作封装进库,自己只处理业务逻辑就方便多了。程序员希望只写一个process函数:

void process(int socket)
{
    n = read(socket, ...)
    ...
    n = write(socket, ...)
}

协程提供了一种直接写process,剩下的都交给runtime的方法。

协程提供了一种看起来类似Apache mpm,但实际上却类似Nginx的编程方式。为每一个请求分配一个协程,但很多协程却运行在同一个系统线程中。写过一篇感想,参见:
dog250-anonymous:我错怪了goroutine
经常看到人们拿进程,线程,协程来比较,好像它们源于一脉,一脉相承,但协程和进程,线程有大不同。
进程,线程是操作系统级的执行体,线程是对进程的优化。而协程则不受系统管理,它不属于操作系统范畴,是数据面的概念。若采用协作式切换,协程甚至都不能算作是一种执行体,因此简体中文的“协程”有点名不副实,“共常式”更好些。

本文开头引用的文章提倡应用程序自己处理并发而不是交给系统。诚然,牛X到极致的优化肯定需要优良工匠的精雕细琢,但优良工匠不常有,可遇不可求。协程让普通工人处理高并发成为可能。协程之于精雕细琢,无异于秦弩之于魏国强弓,损失一点性能换取大规模列装,孰优孰劣,历史早有评说。

Unix哲学主控制面,多个不同的进程协作处理一件事;并发协程主数据面,同一个进程内处理多件相同的事。这跟我前面几篇文章说的是一回事:
dog250-anonymous:大并发大吞吐系统优化的共性和法门
dog250-anonymous:以通信方式共享内存,不要以共享内存方式通信
dog250-anonymous:以通信方式共享内存,不要以共享内存方式通信(2)

所不同的是,本文为略显逼格,上升到了哲学。

Unix一开始不是服务器,但Linux最终成了服务器,承载了越来越多的并发,海量并发处理越发吃力,逐渐地将Linux逼回了它的本位,它本质上和Unix一样,不适合处理数据面。所有Unix/Linux哲学均在阐释控制面,对于数据面,相对的是另一套与之相反的哲学,做所有相同的事。耳熟能详的那些数据面相关的词汇,DPDK,XDP,快路径,慢路径,无一不是为了彻底bypass内核协议栈,避开内核以便采用更干净的做法处理数据面逻辑,这说明数据面正在从作为控制面的系统内核中分离,独辟蹊径。优化内核协议栈已经过时且方向错误,现在正确的做法就是彻底bypass它。近几年,听闻各种数据面词汇,简历上各种数据转发,高性能服务器经验,深感一个时代已经过去,作此文。

浙江温州皮鞋湿,下雨进水不会胖。

原文链接: https://blog.csdn.net/dog250/article/details/124277286

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    Unix哲学与高并发_dog250-CSDN博客

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/405551

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年4月26日 上午9:16
下一篇 2023年4月26日 上午9:16

相关推荐