UNIX 5种I/O模型
Unix 5 I/O模型
I/O操作分为两步:
(1)先将数据从 存储介质 (磁盘或者网络等)拷贝到 内核缓冲区,此时称为数据准备好,可以被用户读取。
(2)由用户应用程序拷贝内核缓冲区数据 到用户缓冲区。
1.阻塞I/O模型
函数 recfrom 视为系统调用。 不论该函数如何实现, 都会有 从应用进程中运行 到 内核中运行的 切换, 一段时间以后 还会有 一个返回 到应用进程的切换。
应用程序 调用一个I/O 函数, 导致应用程序阻塞 并等待数据准备就绪。 如果数据没有准备好 就一直等待。 如果数据准备好了, 则从内核拷贝到用户空间拷贝数据,IO函数 返回成功指示。
进程调用 recvfrom 此系统调用 直到 数据报到达 且被复制到应用进程的缓冲区中 或发生 错误才返回, 常见的错误如 系统调用被信号中断。
进程在调用 recvfrom开始 到它 返回的 整段时间内是阻塞的, 该函数成功返回后,应用程序 开始处理 数据报。
2.非阻塞I/O模型 (数据就绪之前 一直轮询)
非阻塞接口 告诉内核 ,当所请求的IO未完成时,返回一个错误,而不是将进程睡眠。 因此,IO操作函数将不断的测试,数据是否已经准备好了。
不断轮询,直到数据准备好为止。
前三次调用 recvfrom 函数 都无数据返回, 内核返回一个 EWOULDBLOCK错误。 第四次调用recvfrom时,数据报已准备好,被拷贝到应用缓冲区, recvfrom返回成功指示, 接着处理数据。
当一个应用进程 非阻塞 循环调用 recvfrom时,我们称为轮询 polling 。
3.I/O 复用模型 (select poll)
I/O 复用模型会用到 select 或者 poll 函数, 这两个函数也会使进程阻塞, 但是和阻塞I/O不同的是,这两个函数 可以 同时阻塞多个I/O操作。
而且可以同时 对多个读操作,多个写操作的 I/O 函数 进行检测, 直到有数据可读 可写才真正调用 IO操作函数。
只要有数据就绪, select 调用返回, 应用程序调用 recvfrom 将数据 从内核区拷贝至 用户区。
优势在于,每次select阻塞 结束返回后, 可以获得多个准备就绪的套接字(即一个select 可以对多个套接字进行管理,类似于同时监控多个套接字事件是否就绪)。
和阻塞IO相比较, select I/O 复用模型相当于提前阻塞了。 等到有数据到来时,再调用revcfrom函数 就不会因为要等数据而发生阻塞。
4.信号驱动 I/O模型
让内核在数据就绪时 用信号SIGIO通知应用程序。
首先,允许套接字进行信号驱动I/O, 并通过系统调用sigaction 安装一个信号处理程序。 此系统调用立即返回,进程继续工作,它非阻塞。
当数据报 准备好被读时,就为该进程生成一个 SIGIO 信号。 应用程序可以在信号处理程序用 调用 revcfrom 来读取数据报。
5.异步I/O
让内核启动操作, 在整个操作完成后(将数据 从内核拷贝到 用户空间) 通知应用程序。
调用aio_read函数, 告诉内核描述字, 缓冲区指针,缓冲区大小, 文件偏移以及通知的方式,然后立即返回。 当内核将数据拷贝到缓冲区后,在通知 应用程序。
五种IO 模型对比:
文中涉及的 unix 函数:
The recvfrom() and recvmsg() 调用用于从套接字接收消息,并且可以被用于接收套接字上的数据是否是面向连接的。
UNIX 5种I/O模型的更多相关文章
- I/O模型之一:Unix的五种I/O模型
目录: <I/O模型之一:Unix的五种I/O模型> <I/O模型之二:Linux IO模式及 select.poll.epoll详解> <I/O模型之三:两种高性能 I ...
- Unix下5种I/O模型
Unix下I/O模型主要分为5种: (1)阻塞式I/O (2)非阻塞式I/O (3)I/O复用(select和poll) (4)信号驱动式I/O (5)异步I/O 1.阻塞式I/O模型 unix基本的 ...
- Unix网络编程中的五种I/O模型_转
转自:Unix网络编程中的的五种I/O模型 下面主要是把unp第六章介绍的五种I/O模型. 1. 阻塞I/O模型 例如UDP函数recvfrom的内核到应用层.应用层到内核的调用过程是这样的:首先把描 ...
- Unix下 五种 I/O模型
Unix下共有五种I/O模型: 1. 阻塞式I/O 2. 非阻塞式I/O 3. I/O复用(select和poll) 4. 信号驱动式I/O(SIGIO) 5. 异步I/O(POSIX的aio ...
- Unix下可用的五种 I/O 模型
介绍 当TCP客户端同时处理两个输入时:标准输入和TCP套接字,当客户端fgets(在标准输入上)被阻塞并且服务器进程被终止时,我们遇到了问题.服务器TCP正确地将FIN发送到客户端TCP,但由于客户 ...
- 转:Windows Socket五种I/O模型
原文转自: Windows Socket五种I/O模型 Winsock 的I/O操作: 1. 两种I/O模式 阻塞模式:执行I/O操作完成前会一直进行等待,不会将控制权交给程序.套接字 默认为阻塞模 ...
- Windows Socket五种I/O模型
转载:http://www.cnblogs.com/tianzhiliang/archive/2010/08/31/1813637.html 如果你想在Windows平台上构建服务器应用,那么I/O模 ...
- Unix中的I/O模型
本文所指的I/O均是网络I/O. 一. POSIX对同步.异步I/O的定义 我们先大致看看POSIX对同步.异步的定义,不用细究,重点看我标红的部分就行. 同步I/O会导致请求进程阻塞,直到I/O操作 ...
- 5种网络IO模型
5种网络IO模型(有图,很清楚) 同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非阻塞(non-blocking)IO分别是什么,到 ...
随机推荐
- <转>jmeter JDBC Request之Query Type
本博客转载自:http://www.cnblogs.com/imyalost/category/846346.html 个人感觉不错,对jmeter讲解非常详细,担心以后找不到了,所以转发出来,留着慢 ...
- MkDocs 文档生成逻辑浅析
Markdown 和 MkDocs 简介 Markdown 的语法简洁明了.学习容易,而且功能比纯文本更强,因此有很多人用它写博客.世界上最流行的博客平台 WordPress 和大型 CMS 如 Jo ...
- js 正则表达式(reg)
一.RegExp对象方法: 1.exec() 检索字符串中指定的值,并返回值(找不到返回null) 效果: <textarea name="content" id=&qu ...
- Thread类和Runnable接口的比较
Thread和Runnable的联系 Thread类的定义: public class Thread extends Object implements Runnable 联系:从Thread类的定义 ...
- JS之判断json对象中是否含有某个key值
var json = {"key1":"val1","key2":"val2","key3":&qu ...
- java.lang.IllegalArgumentException: invalid comparison: java.util.Date and java.lang.String
在重构项目的时候,遇到了mybatis的一个异常: java.lang.IllegalArgumentException: invalid comparison: java.util.Date and ...
- Nearest Common Ancestors(LCA板子)
题目链接:http://poj.org/problem?id=1330 Nearest Common Ancestors Time Limit: 1000MS Memory Limit: 1000 ...
- 在ionic3自定义组件中使用官方组件
先创建组件: ionic g component xxx 在components里面如下图引入
- Python数据分析学习之Numpy
Numpy的简单操作 import numpy #导入numpy包 file = numpy.genfromtxt("文件路径",delimiter=" ",d ...
- django notes 二:URL dispatcher
一般在 settings.py 中会有一个 ROOT_URLCONF ,请求到来时 django 会从 ROOT_URLCONF 指向的文件中查找 urlpatterns 变量配置的路由. url ...