图解|深入理解Linux高性能网络框架的那些事
1. 落寞的小黑
小黑 : 你今天下班挺早呀!
大白 : 就咱这觉悟,心里有工作,哪里都是办公桌,不要拘泥于形式嘛。
大白 : 下午去面的哪家?啥岗位?咋样?
小黑 : 是一家做自动驾驶的创业公司,网站是看团队介绍还不错,就去看看了,这次没咋准备,很多问题其实都熟悉,但是回答的不到位。
大白 : 哦,明白了,那就是当时理解的不到位,稀里糊涂过去了,现在忽然问起来,想不起重点。
小黑 : 差不多吧,问我都做过哪些高性能的网络框架模型,也就是IO和事件驱动那一套。
大白 :黑哥,你说这个问题确实不好回答,全是术语和略带歧义的东西,我觉得我们抓住本质去阐述就好。
小黑 :来,请开始你的表演,我学习学习。
- IO事件和IO复用
- 线程模型和事件驱动模型的架构
- 基于事件驱动的Reactor模式详解
- 同步IO和异步IO简介
2. IO事件和IO复用
2.1 什么是IO事件
IO的本质是数据的流动,数据可以从网卡到程序内存,也可以从程序内存写到网卡,磁盘操作也是如此。
- 网络IO :内存和网卡的数据交互
- 文件IO :内存和磁盘的数据交互
- 可读事件
- 可写事件
- 异常事件
2.2 什么是IO复用
3. 网络框架设计要素
-
远端的机器A发送了一个HTTP请求到服务器B,此时服务器B网卡接收到数据并产生一个IO可读事件; -
我们以同步IO为例,此时内核将该可读事件通知到应用程序的Listen线程; -
Listen线程将任务甩给Handler线程,由Handler将数据从内核读缓冲区拷贝到用户空间读缓冲区; -
请求数据包在应用程序内部进行计算和处理并封装响应包; -
Handler线程等待可写事件的到来; -
当这个连接可写时将数据从用户态写缓冲区拷贝到内核缓冲区,并通过网卡发送出去;
备注:上述例子是以同步IO为例,并且将线程中的角色分为Listen线程、Handler线程、Worker线程,分别完成不同的工作,后续会详细展开。
- IO事件监听
- 数据拷贝
- 数据处理和计算
4. 高性能网络框架实践
4.1 基于线程模型
4.2 基于事件驱动模型
事件驱动编程是一种编程范式,程序的执行流由外部事件来决定,它的特点是包含一个事件循环,当外部事件发生时使用回调机制来触发相应的处理。通俗来说就是: 有一个循环装置在一直等待各种事件的到来,并将到达的事件放到队列中,再由一个分拣装置来调用对应的处理装置来响应 。
4.3 Reactor反应堆模式
核反应堆是核电站的心脏 ,它的工作原理是这样的:原子由原子核与核外电子组成,原子核由质子与中子组成。
当铀235的原子核受到外来中子轰击时,一个原子核会吸收一个中子分裂成两个质量较小的原子核,同时放出2-3个中子。
这裂变产生的中子又去轰击另外的铀235原子核,引起新的裂变 , 如此持续进行就是裂变的链式反应。
5.反应堆模式详解
反应堆模式是一种思想,形式却有很多种。5.1 反应堆模式的本质是什么
- IO操作 :数据包的读取和写入
- CPU操作 :数据请求的处理和封装
- 单Reactor线程
- 单Reactor线程和线程池
- 多Reactor线程和线程池