网络通信与IO多路复用
一、网络通信
不同的机器想要进行信息互通需要将信息序列化后通过网络进行交换。其中每个机器分为操作系统和网卡,其中操作系统又分为内核态和用户态。针对TCP通信来说,这个过程涉及到应用程序缓冲区、系统内核缓冲区和网卡等。
1.缓存
1.1 网卡缓存
网卡缓存不属于内核空间也不属于用户空间。网卡缓存属于硬件缓存,由于硬件对数据的读写与操作系统对数据的操作速度上有差异,所以需要在网卡与操作系统之间加一个缓冲。
1.2 内核缓存
内核缓冲区是在内核空间,作为从硬件读取数据或者写入硬件的数据缓冲区。
1.3 用户缓存
用户缓冲区是在用户空间,作为用户空间与内核空间数据交换的缓冲区。
2.发送过程
- 用户进程准备数据,将数据存储在用户缓冲区
- 用户进程进行发送系统调用,进程转入到内核态,CPU将数据从用户缓冲区写入到内核发送缓冲区
- 内核发送缓冲区数据写入完毕,切换回用户态
- 内核异步调用DMA,DMA将数据从内核发送缓冲区写入到网卡缓存
- 网卡将网卡缓存数据发送到网络
3.接收过程
- 网卡从网络读取数据流,将数据存储到网卡缓存
- 内核异步调用DMA,DMA将数据从网卡缓存写入到内核接受缓冲区
- DMA通知CPU内核接受缓冲区写入完毕,内核等待用户进程读取数据
- 用户进程进行读取系统调用,进程转入到内核态。如果数据已经在内核中,则CPU将数据从内核接受缓冲区写入到用户缓冲区;如果数据还没准备好,则需要等待数据到达。
- 用户进程对用户缓冲区进行处理
二、IO通信模型
由以上网络通信流程可知,网卡缓存与内核缓冲区主要是由DMA进行复制,内核负责内核缓冲区与用户应用程序之间数据的复制。如果应用程序需要网络通信,应用程序需要通过内核才能感知是否有信息到达,然后内核IO将数据从内核缓冲区复制到应用程序缓存区,应用程序进行后续处理。IO模型主要是指应用程序与内核针对接受IO数据的交换方式,IO模型总共有五种。
1.阻塞IO
同步阻塞IO指的用户程序主动发起,需要等待内核IO操作彻底完成后返回到用户空间的IO操作。整个IO操作过程中,用户进程处于阻塞状态。其中需要等待对方发送消息,数据从网卡缓存复制到内核缓存区,内核IO将数据从内核缓冲区复制到用户缓存区。由于需要等待发送方数据,所以会导致用户程序长时间阻塞,占用线程资源时间比较长,会消耗大量线程资源。