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模型的更多相关文章

  1. I/O模型之一:Unix的五种I/O模型

    目录: <I/O模型之一:Unix的五种I/O模型> <I/O模型之二:Linux IO模式及 select.poll.epoll详解> <I/O模型之三:两种高性能 I ...

  2. 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基本的 ...

  3. Unix网络编程中的五种I/O模型_转

    转自:Unix网络编程中的的五种I/O模型 下面主要是把unp第六章介绍的五种I/O模型. 1. 阻塞I/O模型 例如UDP函数recvfrom的内核到应用层.应用层到内核的调用过程是这样的:首先把描 ...

  4. 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 ...

  5. Unix下可用的五种 I/O 模型

    介绍 当TCP客户端同时处理两个输入时:标准输入和TCP套接字,当客户端fgets(在标准输入上)被阻塞并且服务器进程被终止时,我们遇到了问题.服务器TCP正确地将FIN发送到客户端TCP,但由于客户 ...

  6. 转:Windows Socket五种I/O模型

    原文转自:  Windows Socket五种I/O模型 Winsock 的I/O操作: 1. 两种I/O模式 阻塞模式:执行I/O操作完成前会一直进行等待,不会将控制权交给程序.套接字 默认为阻塞模 ...

  7. Windows Socket五种I/O模型

    转载:http://www.cnblogs.com/tianzhiliang/archive/2010/08/31/1813637.html 如果你想在Windows平台上构建服务器应用,那么I/O模 ...

  8. Unix中的I/O模型

    本文所指的I/O均是网络I/O. 一. POSIX对同步.异步I/O的定义 我们先大致看看POSIX对同步.异步的定义,不用细究,重点看我标红的部分就行. 同步I/O会导致请求进程阻塞,直到I/O操作 ...

  9. 5种网络IO模型

    5种网络IO模型(有图,很清楚)   同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非阻塞(non-blocking)IO分别是什么,到 ...

随机推荐

  1. JMeter—系统性能分析思路

    系统在工作负载中的性能受到许多因素影响,处理器速度.内存容量.网络或磁盘I/O控制器的数量以及磁盘的容量和速度是所以工作负荷的重要性能特征组件.还有其他应用程序自身的性能特征.工作负荷的特性.应用程序 ...

  2. uC/OS-II 函数之内存管理相关函数

    上文主要介绍了邮箱管理相关的函数,本文介绍内存管理相关的函数:OSMemCreate()内存块创建函数,OSMemGet()函数,OSMemPut()函数,OSMemQuery()函数.以前用过的uC ...

  3. c#中的classes和objects一些知识【1】

    首先我们需要知道面向对象语言(Object-oriented language)的三大特点:封装(Encapulation),继承(Inheritance),多态(Polymorphism). 引言: ...

  4. 移动web之一像素问题

    一.为什么会有一像素问题 弄明白这个问题,首先要知道DPR了. DPR(device pixel ratio)pixel等于picture element.设备像素比,是默认缩放100%的情况下,即D ...

  5. Netty 5 获取客户端IP(非HTTP)

    使用Netty 5.0.0.Alpha2时,想知道客户端的ip以区分客户端,发现网上都是通过解析HTTP头域完成的,这里提供一种比较简单的方法. System.out.println("Cl ...

  6. ubuntu 安装python3

    1.安装python3 apt-get install python3 2.安装pip3 apt-get install python3-pip 3.为python3添加包 pip3 install ...

  7. celery简单理解和使用

    解决同步阻塞的问题 将耗时任务放到后台异步执行,不影响用户其他操作. 实现原理 任务队列是一种跨线程,跨机器的机制. 任务队列中包含称作任务的工作单元.有专门的进程持续不断的监视任务队列,并从中得到新 ...

  8. 如何在NSDocumentDirectory内新建一个文件夹

    iOS下载文件一般保存到NSDocumentDirectory内,但是为了更好整理文件内容,那就要自定义的生成一些文件夹,和做一些删除文件夹的操作. - (NSString *)pathToPatie ...

  9. CDQZ Day4

    NOIP 模拟题By liu_runda题目名称 数 论 题源程序文件名 number.cpp theory.cpp problem.cpp输入文件名 number.in theory.in prob ...

  10. 匈牙利算法、KM算法

    PS:其实不用理解透增广路,交替路,网上有对代码的形象解释,看懂也能做题,下面我尽量把原理说清楚 基本概念 (部分来源.部分来源) 二分图: 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相 ...