当前位置: 首页 > Linux

浅谈Linux的五种IO模型

时间:2023-04-07 00:33:25 Linux

微信搜索:码农StayUp主页地址:https://gozhuyinglong.github.io源码分享:https://github.com/gozhuyinglong/blog-demos日常Coding,如果你或多或少地接触过网络IO,你会想要了解更多。看了很多文章,总觉得一头雾水。直到看了《UNIX网络编程 卷1:套接字联网API》里的介绍,才恍然大悟。这里我就分享给大家。如果有不对的地方,请指出。一、概念描述为了便于理解后面的内容,我们先来了解一些概念。1.1SocketSocket中文翻译为套接字,是计算机网络中进程间双向通信的端点的抽象。Socket代表网络通信的一端,是操作系统提供的一种进程间通信机制。在操作系统中,通常会为应用程序提供一套应用程序编程接口,称为套接字接口(SocketAPI)。应用程序可以通过Socket接口使用网络Socket进行数据传输。一个Socket由IP地址和端口组成,即:Socket地址=IP地址:端口号。在同一台计算机上,TCP协议和UDP协议可以同时使用同一个端口(Port),互不干扰。要实现网络通信,至少需要一对Socket,其中一对运行在客户端,称为ClientSocket;另一个运行在服务器端,称为ServerSocket。Sockets之间的连接过程可以分为三个步骤:(1)服务器监听;(2)客户端连接;(3)连接确认。1.2Socket缓冲区每个Socket创建后,内核会分配两个缓冲区:输入缓冲区和输出缓冲区。通过Socket发送数据并不是立即将数据传输到网络上,而是先将数据写入输出缓冲区,然后将数据从输出缓冲区通过TCP协议发送到目标主机。通过Socket接收数据也是如此,它也是从输入缓冲区中读取数据,而不是直接从网络中读取。1.3用户空间、内核空间和系统调用操作系统的进程空间可分为用户空间(UserSpace)和内核空间(KernelSpace),它们需要不同的执行权限。大多数系统交互操作都需要在内核空间运行,比如设备IO操作。我们的应用运行在用户空间,没有系统层面的直接操作权限。应用程序要想访问系统的核心功能,必须通过系统调用(SystemCall)来完成。例如,调用recv()函数会将输入缓冲区的内容复制到用户缓冲区。系统调用运行在内核空间,是操作系统为应用程序提供的接口。下面列出了Linux操作系统中的一些系统调用接口(部分函数将在后面的章节中用到):sendto发送UDP信息recv通过socket接收信息recvfrom接收UDP信息listen监听socket端口selectpolls多路同步IOshutdown关闭socket上的连接sigaction设置指定信号的处理方式1.4阻塞和非阻塞blocking和non-blockingfor描述调用者在等待返回结果时的状态。阻塞:调用者发起请求后,会等待结果返回,期间当前线程会被挂起(阻塞)。非阻塞:调用者发起请求后,立即返回,当前线程不会阻塞。本次调用的结果不会立即得到,调用者需要周期性轮询查看处理状态。1.5同步和异步同步和异步用来描述调用结果的返回机制(或通信机制)。同步:调用方发起请求后,会一直等待返回结果,即调用方主动等待调用结果。异步:调用者发起请求后立即返回,但不会立即获取结果,而是执行结束后被调用者主动通知(如Callback)调用者。2、五种IO模型IO模型是指:采用什么样的通道或通信方式进行数据传输,很大程度上决定了程序通信的性能。Linux系统为我们提供了五种可用的IO模型:阻塞IO模型、非阻塞IO模型、IO多路复用模型、信号驱动IO模型和异步IO模型。2.1阻塞IO模型阻塞IO(BlockingIO):从应用进程发起IO系统调用到内核返回成功标志,应用进程处于阻塞状态。2.2非阻塞IO模型非阻塞IO(Non-BlockingIO):应用进程可以将Socket设置为非阻塞的,这样应用进程在发起IO系统调用后会立即返回。应用进程可以轮询的方式发起IO系统调用,直到内核返回成功标志。2.3IO多路复用模型IO多路复用(IOMultiplexin):可以将多个应用进程的Socket注册到一个Select(多路复用器)中,然后用一个进程监听这个Select(这个操作会阻塞),Select会监听所有注册的Socket。只要有数据准备好的Socket,就会返回这个Socket。然后应用进程发起IO系统调用完成数据读取。2.4信号驱动IO模型信号驱动IO(SignalDrivenIO):可以为Socket开启信号驱动IO功能。应用进程需要向内核注册一个信号处理程序,运行立即返回。当内核中数据就绪后,会向应用进程发送一个信号,应用进程可以在信号处理函数中发起IO系统调用,完成数据的读取。2.5异步IO模型异步IO(AsynchronousIO):应用进程发起IO系统调用后,会立即返回。当内核中的数据准备好并复制到用户空间时,会产生一个信号通知应用进程。3、小结从以上五种IO模型可以看出,应用进程向内核发起IO系统调用后,内核会经过两个阶段来完成数据传输:第一阶段:等待数据。即应用进程发起IO系统调用后,等待数据;当数据传输到服务器时,它会将数据放入内核空间,此时数据已准备就绪。第二阶段:将数据从内核空间拷贝到用户空间,返回给应用程序识别成功。前四个模型的第二阶段是一样的,都是阻塞状态,主要区别在第一阶段。异步IO模型不同,应用进程在这两个阶段是完全非阻塞的。IO模型Phase1Phase2BlockingIOBlockingBlockingNon-blockingIONon-blockingBlockingIOMultiplexingBlocking(Select)BlockingSignalDrivenIOAsynchronousBlockingAsynchronousIOAsynchronous异步参考资料UNIX网络编程卷一:SocketsTheInternetofWordsAPI推荐阅读36张图讲解网络基础知识75张图带你了解网络设备、网络地址规划、静态路由、实战练习