其实并非原创,只是摘录了Stevens的大作《UNIX网络编程》,写下来,一、加深理解和记忆;二、书是借的,记录一下备忘。感谢臻,借我此书一阅,受益匪浅。
6.2 I/O模型
阻塞式I/O;
非阻塞式I/O;
I/O复用;
信号驱动式I/O;
异步I/O;
一个输入操作通常包括两个不同的阶段:
1) 等待数据准备好;
2) 从内核向进程复制数据;
对于一个套接字上的输入操作,第一步通常涉及等待数据从网络中到达。当所等待分组到达时,它被复制到内核中的某个缓冲区。第二步就是把数据从内核缓冲区复制到应用进程缓冲区。
6.2.1 阻塞式I/O模型
最流行的I/O模型是阻塞式I/O(blocking I/O)模型,默认情况下,所有套接字都是阻塞的。以数据报套接字作为例子,我们有如图6-1所示的情形。
图6-1 阻塞式I/O模型
在图6-1中,进程调用recvfrom,其系统调用直到数据报到达且被复制到应用进程的缓冲区中或者发生错误才返回。我们说进程在从调用recvfrom开始到它返回的整段时间内是被阻塞的。recvfrom成功返回后,应用进程开始处理数据报。
6.2.2 非阻塞式I/O模型
进程把一个套接字设置成非阻塞是在通知内核:当所请求的I/O操作非得把本进程投入睡眠才能完成时,不要把本进程投入睡眠,而是返回一个错误。非阻塞式I/O(notblocking I/O)模型如图6-2所示:
图6-2 非阻塞式I/O模型
前三次调用recvfrom时没有数据可返回,因此内核转而立即返回一个EWOULDBLOCK错误。第四次调用recvfrom时已有一个数据报准备好,它被复制到应用进程缓冲区,于是recvfrom成功返回。我们接着处理数据。
当一个应用进程像这样对一个非阻塞描述符循环调用recvfrom时,我们称之为轮询(polling)。应用进程只需轮询内核,以查看某个操作是否就绪。这么做往往耗费大量CPU时间。
6.2.3 I/O复用模型
有了I/O复用(I/O multiplexing),我们就可以调用select或poll,阻塞在这两个系统调用中的某一个上,而不是阻塞在真正的I/O系统调用上。图6-3概括展示了I/O复用模型。
图6-3 I/O复用模型
我们阻塞于select调用,等待数据报套接字变为可读。当select返回套接字可读这一条件时,我们调用recvfrom把所读数据报复制到应用进程缓冲区。
比较图6-3和图6-1,I/O复用并不显得有什么优势,事实上由于使用select需要两个而不是单个系统调用,I/O复用还稍有劣势。使用select的优势在于我们可以等待多个描述符就绪。
与I/O复用密切相关的另一种I/O模型是在多线程中使用阻塞式I/O(我们经常这么干)。这种模型与上述模型极为相似,但它并没有使用select阻塞在多个文件描述符上,而是使用多个线程(每个文件描述符一个线程),这样每个线程都可以自由的调用recvfrom之类的阻塞式I/O系统调用了。
6.2.4 信号驱动式I/O模型
我们也可以用信号,让内核在描述符就绪时发送SIGIO信号通知我们。我们称这种模型为信号驱动式I/O(signal-driven I/O),图6-4是它的概要展示。
图6-4 信号驱动式I/O模型
我们首先开启套接字的信号驱动式I/O功能,并通过sigaction系统调用安装一个信号处理函数。改系统调用将立即返回,我们的进程继续工作,也就是说他没有被阻塞。当数据报准备好读取时,内核就为该进程产生一个SIGIO信号。我们随后就可以在信号处理函数中调用recvfrom读取数据报,并通知主循环数据已经准备好待处理,也可以立即通知主循环,让它读取数据报。
无论如何处理SIGIO信号,这种模型的优势在于等待数据报到达期间进程不被阻塞。主循环可以继续执行,只要等到来自信号处理函数的通知:既可以是数据已准备好被处理,也可以是数据报已准备好被读取。
6.2.5 异步I/O模型
异步I/O(asynchronous I/O)由POSIX规范定义。演变成当前POSIX规范的各种早起标准所定义的实时函数中存在的差异已经取得一致。一般地说,这些函数的工作机制是:告知内核启动某个操作,并让内核在整个操作(包括将数据从内核复制到我们自己的缓冲区)完成后通知我们。这种模型与前一节介绍的信号驱动模型的主要区别在于:信号驱动式I/O是由内核通知我们何时可以启动一个I/O操作,而异步I/O模型是由内核通知我们I/O操作何时完成。图6-5给出了一个例子。
图6-5 异步I/O模型
我们调用aio_read函数(POSIX异步I/O函数以aio_或lio_开头),给内核传递描述符、缓冲区指针、缓冲区大小(与read相同的三个参数)和文件偏移(与lseek类似),并告诉内核当整个操作完成时如何通知我们。该系统调用立即返回,并且在等待I/O完成期间,我们的进程不被阻塞。本例子中我们假设要求内核在操作完成时产生某个信号。改信号直到数据已复制到应用进程缓冲区才产生,这一点不同于信号驱动I/O模型。
6.2.6 各种I/O模型的比较
图6-6对比了上述5中不同的I/O模型。可以看出,前4中模型的主要区别在于第一阶段,因为他们的第二阶段是一样的:在数据从内核复制到调用者的缓冲区期间,进程阻塞于recvfrom调用。相反,异步I/O模型在这两个阶段都要处理,从而不同于其他4中模型。
图6-6 5种I/O模型的比较
6.2.7 同步I/O和异步I/O对比
POSIX把这两个术语定于如下:
同步I/O操作(sysnchronous I/O opetation)导致请求进程阻塞,直到I/O操作完成;
异步I/O操作(asynchronous I/O opetation)不导致请求进程阻塞。
根据上述定义,我们的前4种模型----阻塞式I/O模型、非阻塞式I/O模型、I/O复用模型和信号驱动I/O模型都是同步I/O模型,因为其中真正的I/O操作(recvfrom)将阻塞进程。只有异步I/O模型与POSIX定义的异步I/O相匹配。
分享到:
相关推荐
本主题聚焦于“网络编程IO模型源代码”,特别是使用C++语言和Windows Socket(Winsock)API的实现。 首先,让我们探讨IO模型的基本概念。IO模型主要有五种:同步阻塞IO、同步非阻塞IO、I/O多路复用、信号驱动IO和...
这篇文档“UNIX IO.doc”深入探讨了UNIX下输入输出的基本原理和使用技巧,这对于理解和开发UNIX系统上的应用程序至关重要。 首先,UNIX的I/O模型基于文件的概念,一切皆文件,包括硬件设备。这种抽象使得对I/O操作...
WS Socket五种IO模型代码 作为一名IT行业大师,我将根据提供的文件信息,生成相关知识点,以下是详细的解释: WS Socket五种IO模型 在Windows平台上构建服务器应用时,I/O模型是必不可少的考虑因素。Windows操作...
### IO模型与性能分析 #### 一、基本概念与背景 在探讨IO模型与性能分析之前,我们需要了解一些基础概念: - **时钟周期**:指的是一个时钟脉冲所持续的时间,它是衡量处理器速度的基本单位之一。 - **总线周期**...
事件通知是重叠IO模型中的关键部分,它通常依赖于信号量、事件对象或文件描述符(在Unix系统中)来告知线程何时有I/O操作完成。在C++中,我们可以使用Windows API中的CreateIoCompletionPort函数创建IOCP,然后使用...
Java IO模型1主要涉及到的是Java在处理网络数据交互时的不同方式。这里有五种主要的IO模型,它们分别是阻塞IO(BIO)、非阻塞IO、IO...对于高并发、高效率的网络应用,通常会选择非阻塞或异步IO模型,以提高系统性能。
本文将从 Unix/Linux 接口出发,介绍几种常用的 IO 模型,并分析它们的优缺点。 阻塞型 IO 模型 阻塞型 IO 模型是最基本的 IO 模型,使用 listen()、send()、recv() 等接口来实现网络通信。这些接口在调用时都可能...
本文将深入探讨“基于select IO模型的远程目录浏览与多线程文件下载”这一主题,这涉及到操作系统内核、网络编程、多线程以及文件I/O等多个核心知识点。 首先,我们要理解什么是select IO模型。在Unix/Linux系统中...
"socket select io模型传文件"指的是利用socket编程中的select机制来实现文件传输。这种模型允许我们处理多个连接,优化资源利用率,并确保数据的准确无误。 首先,让我们了解什么是socket。Socket是进程间通信...
这里采用的是`select`模型,它是早期Unix系统中广泛使用的异步IO模型。`select`函数允许程序监控多个文件描述符(FDs),当这些FDs中的任何一个准备就绪时(即有数据可读或可写),`select`会返回,从而使程序能够...
### 5种Winsock IO模型详解 #### 一、引言 在Windows平台上构建网络应用程序时,选择合适的I/O模型至关重要。Windows操作系统提供了多种I/O模型来满足不同场景下的需求,包括选择(Select)、异步选择...
在Richard Stevens 的《UNIX® Network Programming Volume 1, Third Edition: The Sockets Networking 》中,提到了五种IO 模型: 1. 阻塞IO (Blocking IO) 2. 非阻塞IO (Non-Blocking IO) 3. IO 多路复用 (IO ...
Socket IO模型是网络编程中的重要概念,特别是在设计高性能、高并发的服务器时,它提供了高效地处理多个连接的方法。在传统的多线程模型中,每个客户端连接都需要一个独立的线程来处理,这可能导致资源浪费和性能...
### C语言基础面试题(06-Unix系统编程) #### 知识点解析 ##### 1. 系统编程的程序模型 系统编程的核心在于如何有效地处理用户输入的数据,并通过程序进行必要的处理后输出结果。在这个过程中,键盘、显示器等...
史蒂文斯在《UNIX网络编程》中介绍了五种基本的I/O模型:阻塞I/O、非阻塞I/O、I/O多路复用(如select和poll)、信号驱动的I/O(SIGIO)以及异步I/O(POSIX的aio_functions)。阻塞I/O是最基础的模型,当调用I/O操作...
在Linux环境下,网络I/O模型主要包括同步和异步、阻塞和非阻塞四种类型。这些模型主要针对的是数据准备和数据拷贝这两个阶段的不同处理方式。 1. **阻塞I/O(Blocking IO)** - 阻塞I/O是Linux默认的I/O模式。在...
总结来说,优化后的`select`多路IO服务器模型通过`select`系统调用有效地处理了大量的并发连接,提高了服务器的吞吐量和响应时间。在实际应用中,开发者会根据具体场景进行各种优化,以达到最佳性能。
- **权限管理**:Unix的权限模型对Oracle的安全性至关重要,如正确设置用户权限、文件权限等。 - **日志分析**:系统和Oracle的日志文件是诊断问题的重要来源,定期检查和分析日志是必要的维护工作。 通过以上...
3. **Unix**:Unix系统通常使用select、poll和kqueue等机制来处理多路复用IO。 五、IO管理器的优化策略 1. **零拷贝**:通过避免数据在用户空间和内核空间之间多次拷贝,提高IO性能。 2. **预读取和延迟写入**:...
本文主要探讨了几种常见的I/O模型,以Unix/Linux平台上的Socket接口为例。首先,基础的网络编程通常涉及`listen()`, `send()`, `recv()`等接口,它们在默认情况下是阻塞型的。这意味着当调用这些接口时,如果操作...