网络通信与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将数据从内核缓冲区复制到用户缓存区。由于需要等待发送方数据,所以会导致用户程序长时间阻塞,占用线程资源时间比较长,会消耗大量线程资源。
在这里插入图片描述

2.非阻塞IO

同步非阻塞IO指的用户程序主动发起。如果内核缓冲区没有数据会立即返回,如果内核缓冲区有数据会等待内核将数据复制到应用缓存区后返回。不会长时间等待发送方数据到达,但是需要频繁轮询内核,会占用大量CPU资源。
在这里插入图片描述

3.IO多路复用

非阻塞IO中需要为每个Socket创建对应的监控线程,这样会消耗大量的线程资源和浪费CPU资源。
IO多路复用就是单个线程同时监控多个IO的文件描述符,从而减少线程资源和CPU资源消耗。这样一旦某个IO数据就绪,内核会将文件描述符的就绪状态返回给用户进程,用户进程就可以对就绪的IO进行相应操作。
在这里插入图片描述

4.信号驱动IO

当进程发起一个 IO 操作,会向内核注册一个信号处理函数,然后进程返回不阻塞;当内核数据就绪时会发送一个信号给进程,进程便在信号处理函数中调用 IO 读取数据。

5.异步IO

异步IO是指用户程序发起一个IO操作立即返回,当内核IO操作将到达内核缓冲区的数据复制到用户缓冲区后,会通知用户线程。用户线程直接使用数据即可。
在这里插入图片描述

三、IO多路复用

IO多路复用就是一个线程同时监控多个文件句柄。一旦某个句柄就绪就返回给应用程序,应用程序就行对应的IO读写操作;如果没有句柄就绪就需要阻塞监控的线程,然后让出CPU资源,等待IO唤醒监控线程。
用一个或者少量线程监控大量TCP连接,可以减少系统开销,不必创建过多线程。IO多路复用主要有三种实现方式:select、poll、epoll。

1.select机制

相关函数:

// nfds			所有监听的fd,数值最大的一个+1
// readfds		读事件集合
// writefds		写事件集合
// exceptfds	异常事件集合
// timeout		最长阻塞时间,NULL表示永久阻塞
int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);

在这里插入图片描述

1.1 底层原理

select机制是用bitmap来标识fd,将需要监控的fd和就绪的fd以bitmap的形式,在用户态和内核态之间传递。由数据结构可知,fd_set是一个16个元素的long数组,此结果可以存放1024个文件描述符。

// fd_set的底层,实际就是用的 位图 这个数据结构
typedef __kernel_fd_set     fd_set;
#undef __FD_SETSIZE
#define __FD_SETSIZE    1024
 
typedef struct {
    unsigned long fds_bits[__FD_SETSIZE / (8 * sizeof(long))];
} __kernel_fd_set;

1.2 底层机制

  • 调用select函数后,会将fd_set从用户态拷贝到内核态
  • 内核态对fd_set进行遍历,将有响应的文件描述符进行标记
  • 返回select函数,将fd_set从内核态拷贝到用户态
  • 用户程序遍历从内核返回的fd_set,对就绪的文件描述符进行下一步操作

1.3 优点

  • 支持跨平台 采用bitmap、节省空间,可以存储更多映射关系

1.4 缺点

  • 单个进程可监控fd数量受限,最多1024个
  • 每次调用会经历两次fd_set拷贝,在用户态和内核态传递复制开销大
  • 每次调用都会经历两次遍历所有文件描述符,系统效率低

2.poll机制

相关函数:

// fds:文件描述符数组
// nfds:文件描述符数组中描述符数量。
// timeout
int poll(struct pollfd *fds, nfds_t nfds, int timeout);
struct pollfd
{
    int fd; /* file descriptor */
    short events; /* requested events */
    short revents; /* returned events */
};

2.1 底层原理

poll机制是用链表来标识fd,将需要监控的fd和就绪的fd以链表的形式,在用户态和内核态之间传递。

2.2 底层机制

poll底层机制与select基本一致

2.3 优点

  • 单个进程监控fd数据不受限制,场景灵活

2.4 缺点

如果需要监控的fd数量较大情况下

  • 每次调用会经历两次链表拷贝,在用户态和内核态传递复制开销会很大
  • 每次调用都会经历两次遍历链表的文件描述符,系统效率低

3.epoll机制

相关函数:

// 创建epoll数据结构(红黑树和就绪队列)
int epoll_create(int size);
// 将需要监控的文件描述符和事件 加入到epoll的红黑树中并注册对应回调函数
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
// 等待所监控文件描述符有事件产生
int epoll_wait(int epfd, struct epoll_event *events,int maxevents, int timeout);

3.1 底层原理

epoll机制是用红黑树来标识待监控fd,用就绪列表来标识有响应的文件描述符。这两个结构是用户态和内核态共享,避免复制的开销。

3.2 底层机制

  • 调用epoll_create,建立红黑树和就绪队列
  • 调用epoll_ctl,将待监控fd加入到红黑树,并设置回调函数
  • 待监控fd数据就绪,内核会根据回调函数将fd加入到就绪列表
  • 调用epoll_wait,内核返回后,应用程序只需要将绪列表中fd进行下一步处理即可

3.3 优点

  • 单个进程监控fd数据不受限制,场景灵活
  • 用户态和内核态共享epoll的数据结构,避免复制的开销
  • 不用遍历文件描述符,系统效率高

3.4 触发方式

epoll支持边缘触发(edge trigger,ET)或水平触发(level trigger,LT)。select和poll只支持LT工作模式,epoll的默认工作模式是LT模式。

  • 水平触发:针对读操作,只要缓冲区不为空、就会返回读就绪;针对写操作,只要缓冲区不满就会返回可写状态;
  • 边缘触发:针对读操作,只有数据到达、才会返回读就绪;针对写操作,只要缓冲区有数据被发送走时会返回可写状态;

在边缘触发模式下,如果可读写事件发生,epoll_wait()会通知处理程序去读写。如果这次没有把数据全部读写完,那么下次调用epoll_wait()时,它不会通知你,也就是它只会通知你一次,直到该文件描述符上出现第二次可读写事件才会通知你。这种模式比水平触发效率高,系统不会充斥大量你不关心的就绪文件描述符。

总结

网络IO通信涉及到硬件网卡以及操作系统内核态与用户态。其中网卡与内核态数据交互主要是通过DMA来进行传输并且由内核进行控制。用户态不需要感知网卡数据的情况,用户态主要是需要知晓内核态socket缓冲区数据是否就绪、并且将数据复制到用户缓冲区。
IO模型是指用户态和内核态对IO数据交互处理方式。模型共有5种方式,可以根据连接数量和系统资源进行IO模型的选择,选择合适的IO模型可以加快系统效率节约资源。


参考链接

1.网络IO的通信原理及Reactor模型
2.详解IO多路复用
3.IO多路转接 —— poll和epoll

  • 19
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
本书详细介绍了TMS320C28x系列DSP的事件管理器、模-数转换器、32位CPU定时器、多通道缓冲串行口、串行外设接口、串行通信接口、增强型区域网络控制器、通用输入/输出多路复用器,以及电气特性和机械数据等内容。本书可供高等学校电子、通信、计算机、自动控制和电力电子技术等专业的高年级本科生及研究生作为教科书或参考书,也可作为各领域中从事信号处理、控制和电力电子技术的科研及工程技术人员的参考书籍 目录 第11章事件管理器(EV) 11.1事件管理器功能概述 11.1.1事件管理器功能 11.1.2 EV的增强特性 11.1.3事件管理器的寄存器地址 11.1.4通用目的(GP)定时器 11.1.5使用GP定时器产生PWM输出 11.1.6全比较单元 11.2 PWM电路 11.2.1有比较单元的PWM电路 11.2.2 PWM信号的产生 11.2.3空间向量PWM 11.3捕捉单元 11.3.1捕捉单元概述 11.3.2捕捉单元的操作 11.3.3捕捉单元的FIFO堆栈 11.3.4捕捉中断 11.3.5正交编码脉冲电路(QEP) 11.4事件管理器的中断 11.4.1事件管理器中断概述 11.4.2 EV中断请求和服务 11.5事件管理器的寄存器 11.5.1 寄存器概述 11.5.2定时器寄存器 11.5.3比较控制寄存器 11.5.4 比较行为控制寄存器 11.5.5捕捉单元寄存器 11.5.6事件管理器中断标志寄存器 11.5.7事件管理器控制寄存器 11.5.8寄存器位设置的区别 第12章模-数转换器(ADC) 12.1 ADC模块的特点 12.2 自动转换序列发生器的工作原理 12.2.1序列采样模式 12.2.2并发采样模式 12.2.3并发采样双序列发生器模式举例 12.2.4并发采样级联序列发生器模式举例 12.3连续自动序列化模式 12.3.1序列发生器启动/停止模式 12.3.2并发采样模式 12.3.3输入触发描述 12.3.4序列转换过程中的中断操作 12.4 ADC时钟预定标器 12.5低功耗方式 12.6加电顺序 12.7序列发生器的替换特性 12.8 ADC寄存器 12.8.1 ADC控制寄存器 12.8.2最大转换通道寄存器 12.8.3 自动序列状态寄存器 12.8.4 ADC状态和标志寄存器 12.8.5 ADC输入通道选择序列控制寄存器 12.8.6 ADC转换结果缓冲寄存器 第13章 32位CPU定时器O/1/2 13.1 CPU定时器的结构与工作原理 13.2 CPU定时器的寄存器 13.2.1定时器计数器寄存器 13.2.2定时器计数器寄存器高位 13.2.3定时器周期寄存器 13.2.4定时器周期寄存器 13.2.5定时器控制寄存器 13.2.6定时器预定标计数器低位 13.2.7定时器预定标计数器高位 第14章 多通道缓冲串行E!(McBSP) 14.1概述 14.1.1 McBSP介绍 14.1.2寄存器一览 14.1.3 McBSP操作 14.1.4 McBSP的采样率发生器 14.1.5 McBSP的意外/出错情况 14.2多通道选择模式 14.2.1通道、模块、分区 14.2.2 A-bis模式 14.2.3 SPI仂、议 14.3配置接收器和发送器 14.3.1接收器配置 14.3.2发送器配置 14.4仿真和复位事项 14.4.1 McBSP仿真模式 14.4.2数据打包实例 14.4.3 GPIO功能 14.5 McBSP的FIFO和中断 14.5.1 McBSP的FIFO概述 14.5.2 FIFO模式下McBSP的功能性与局限性 14.5.3 McBSP的FIFO操作 14.5.4 McBSP接收中断的产生 14.5.5 McBSP发送中断的产生 14.5.6 McBSP FIFO寄存器的说明 14.6 McBSP寄存器 14.6.1 数据接收和发送寄存器 14.6.2串行口控制寄存器(SPCRl和SPCR2) 14.6.3接收控制寄存器(RCRl和RCR2) 14.6.4发送控制寄存器(XCRl和XCR2) 14.6.5 采样率产生器寄存器(SRGRl和SRGR2) 14.6.6多通道控制寄存器(MCRl和MCR2) 14.6.7引脚控制寄存器(PCR) 14.6.8接收通道使能寄存器(RCERA-RCERH) 14.6.9发送通道使能寄存器(XCERA-XCERH) 14.6.10寄存器总结 第15章 串行外围接口(SPl) 15.1增强型SPI模块概述 15.2 SPI模块结构及工作原理 15.2.1 SPI模块信号总结 15.2.2 SPI模块寄存器概述 15.2.3 SPI操作 15.2.4 SPI中断 15.2.5数据格式 15.2.6波特率和时钟方案 15.2.7复位的初始化 15.2.8 SPI FIFO说明 15.3 SPI的寄存器组 15.3.1 SPI配置控制寄存器 15.3.2 SPI 512作控制寄存器 15.3.3 SPI状态寄存器 15.3.4 SPI波特率寄存器 15.3.5 SPI仿真缓冲寄存器 15.3.6 SPI串行接收缓冲寄存器 15.3.7 SPI串行发送缓冲寄存器 15.3.8 SPI串行数据寄存器 15.3.9 SPI FIFO发送、接收及控制寄存器 15.3.10 SPI优先权控制寄存器 15.4 SPI范例波形 第16章 串行通信接口(SCl) 16.1增强型SCI模块概述 16.2 SCI模块结构及工作原理 16.2.1 SCI模块信号总结 16.2.2多处理器和异步处理模式 16.2.3 SCI可编程数据格式 16.2.4 SCI多处理器通信 16.2.5空闲线多处理器模式 16.2.6地址位多处理器模式 16.2.7 SCI通信格式 16.2.8 SCI端口的中断 16.2.9 SCI波特率计算 16.2.10 SCI增强型特点 16.3 SCI寄存器组 16.3.1 SCI模块寄存器一览 16.3.2 SCI通信控制寄存器 16.3.3 SCI控制寄存器1 16.3.4 SCI波特率选择寄存器组 16.3.5 SCI控制寄存器2 16.3.6 SCI接收状态寄存器 16.3.7接收数据缓冲寄存器 16.3.8 SCI发送数据缓冲寄存器 16.3.9 SCI FIFO寄存器组 16.3.10优先权控制寄存器 第17章 增强型区域网络控制器(eCAN) 17.1 eCAN的结构 17.1.1 CAN概述 17.1.2 CAN网络和模块 17.1.3 eCAN控制器概述 17.1.4 消息对象 17.1.5消息邮箱 17.2 eCAN的寄存器 17.3 eCAN配置 17.3.1 CAN模块初始化 17.3.2分步配置eCAN 17.3.3远程帧邮箱操作 17.3.4中断 17.3.5 CAN功率下降模式 第18章 通用输入/输出(GPIO)多路复用器 18.1 GPIO多路复用器 18.2 GPIO多路复用器的寄存器 第19章 电气特性和机械数据 19.1 电气特性 19.2 机械数据 附录A寄存器速查参考 附录A.1 CPU寄存器速查参考 A.1.1访问CPU寄存器的指令和复位值 A.1.2寄存器图解 附录A.2事件管理器EV寄存器一览 附录A.3 片内ADC寄存器一览 附录A.4串行外围接El SPI寄存器一览 附录A.5 串行通信接 SCI寄存器一览 附录A.6 CPU定时器0/1/2的寄存器一览 附录A.7多通道缓冲串行ISl McBSP寄存器一览 附录A.8 eCAN寄存器一览 附录A.9通用I/0 H GPIO寄存器一览 附录A.IO时钟、系统控制及PIE寄存器一览 附录A.11片内Flash、OTP寄存器一览 附录A.12外设接H XINTF的寄存器一览 附录B 词汇表 参考文献

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值