`
m635674608
  • 浏览: 5029077 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

Unix下的五种I/O模型图

    博客分类:
  • java
 
阅读更多

Unix下共有五种I/O模型

 

l         阻塞I/O

 

l         非阻塞I/O

 

l         I/O复用(selectpoll

 

l         信号驱动I/OSIGIO

 

l         异步I/OPosix.1aio_系列函数)

 



l        
阻塞I/O模型

 

应用程序调用一个IO函数,导致应用程序阻塞,等待数据准备好。

 

如果数据没有准备好,一直等待。。。。

 

数据准备好了,从内核拷贝到用户空,IO函数返回成功指示。

 

在这种模式下,基本上IO操作都会用一个Work Thread来进行(Java)。

 

 

 

 



l         非阻塞I/O模型

 

我们把一个套接口设置为非阻塞就是告诉内核,当所请求的I/O操作无法完成时,不要将进程睡眠,而是返回一个错误。这样我们的I/O操作函数将不断的测试数据是否已经准备好,如果没有准备好,继续测试,直到数据准备好为止。在这个不断测试的过程中,会大量的占用CPU的时间。

 




l        
I/O复用模型

 

I/O复用模型会用到select或者poll函数,这两个函数也会使进程阻塞,但是和阻塞I/O所不同的是,这两个函数可以同时阻塞多个I/O操作。而且可以同时对多个读操作,多个写操作的I/O函数进行检测,直到有数据可读或可写时,才真正调用I/O操作函数。

 



目前Java只能支持到多路复用一级,在这种模式下,在一个线程里面以阻塞的模式监听连接,优点在于不用开过多的线程以阻塞的模式等待连接。



l         信号驱动I/O模型

 

 

首先我们允许套接口进行信号驱动I/O,并安装一个信号处理函数,进程继续运行并不阻塞。当数据准备好时,进程会收到一个SIGIO信号,可以在信号处理函数中调用I/O操作函数处理数据。

 



l        
异步I/O模型

 

调用aio_read函数,告诉内核描述字,缓冲区指针,缓冲区大小,文件偏移以及通知的方式,然后立即返回。当内核将数据拷贝到缓冲区后,再通知应用程序。

 

这个操作和信号驱动的区别就是:异步模式等操作完毕后才通知用户程序而信号驱动模式在数据到来时就通知用户程序。

 



几种
I/O模型的比较

 

前四种模型的区别是第一阶段,第二阶段基本相同,都是将数据从内核拷贝到调用者的缓冲区。而异步I/O的两个阶段都不同于前四个模型。

 




同步
I/O和异步I/O

 

a.同步I/O操作引起请求进程阻塞,直到I/O操作完成。异步I/O操作不引起请求进程阻塞。

 

b.我们的前四个模型都是同步I/O,只有最后一个异步I/O模型是异步I/O

 

Java nio和多路复用

java 1.4 nio提供的select,这是一种多路复用I/Omultiplexed non-blocking I/O)模型,底层是使用select或者pollI/O复用就是,阻塞在select或者poll系统调用的某一个之上,而不是阻塞在真正的I/O系统调用之上。JDK 5.0 update 9JDK 6.0linux下支持使用epoll,可以提高并发idle connection的性能(http://blogs.sun.com/alanb/entry/epoll)。

 

各种IO的特点

  • 阻塞IO:使用简单,但随之而来的问题就是会形成阻塞,需要独立线程配合,而这些线程在大多数时候都是没有进行运算的。JavaBIO使用这种方式,问题带来的问题很明显,一个Socket需要一个独立的线程,因此,会造成线程膨胀。
  • 非阻塞IO:采用轮询方式,不会形成线程的阻塞。JavaNIO使用这种方式,对比BIO的优势很明显,可以使用一个线程进行所有Socket的监听(select)。大大减少了线程数。

 

  • 同步IO:同步IO保证一个IO操作结束之后才会返回,因此同步IO效率会低一些,但是对应用来说,编程方式会简单。JavaBIONIO都是使用这种方式进行数据处理。
  • 异步IO:由于异步IO请求只是写入了缓存,从缓存到硬盘是否成功不可知,因此异步IO相当于把一个IO拆成了两部分,一是发起请求,二是获取处理结果。因此,对应用来说增加了复杂性。但是异步IO的性能是所有很好的,而且异步的思想贯穿了IT系统放放面面。


IO分两个阶段:
1.通知内核准备数据。2.数据从内核缓冲区拷贝到应用缓冲区

根据这2点IO类型可以分成:
1.阻塞IO,在两个阶段上面都是阻塞的。
2.非阻塞IO,在第1阶段,程序不断的轮询直到数据准备好,第2阶段还是阻塞的
3.IO复用,在第1阶段,当一个或者多个IO准备就绪时,通知程序,第2阶段还是阻塞的,在第1阶段还是轮询实现的,只是
所有的IO都集中在一个地方,这个地方进行轮询
4.信号IO,当数据准备完毕的时候,信号通知程序数据准备完毕,第2阶段阻塞
5.异步IO,1,2都不阻塞,windows的iocp是真正的异步IO
"BIO是指阻塞IO方式,即读和写必须为同步方式,NIO是指异步读,同步写的方式,AIO是指异步读,异步写的方式。
在网络协议上java对于TCP/IP和UDP/IP均支持,在网络IO的操作上,目前java仅支持BIO和NIO两种方式。"

转载http://blog.csdn.net/blueboy2000/article/details/4485874

分享到:
评论

相关推荐

    浅谈Linux 网络 I/O 模型简介(图文)

    根据UNIX网络编程的分类,Linux提供了五种I/O模型,分别是阻塞I/O、非阻塞I/O、I/O复用模型、信号驱动I/O以及异步I/O。 1. **阻塞I/O模型**: 在这个模型中,进程调用如`recvfrom`这样的系统调用时,会一直等待...

    5.1_1_I_O设备的基本概念和分类1

    在I/O模型中,有几种常见的处理方式: - 阻塞I/O:当一个进程尝试读取或写入I/O设备时,如果设备没有准备好,进程会被挂起,直到I/O操作完成。 - 非阻塞I/O:在这种模式下,进程不会被挂起,而是立即返回一个状态...

    IO模型1

    在Linux环境下,网络I/O模型主要包括同步和异步、阻塞和非阻塞四种类型。这些模型主要针对的是数据准备和数据拷贝这两个阶段的不同处理方式。 1. **阻塞I/O(Blocking IO)** - 阻塞I/O是Linux默认的I/O模式。在...

    UNIX环境高级编程

    本书的前15章着重于理论知识的阐述,主要内容包括UNIX文件和目录、进程环境、进程控制、进程间通信以及各种I/O。在此基础上,分别按章介绍了多个应用实例,包括如何创建数据库函数库,PostScript 打印机驱动程序,...

    第10章1

    《第10章 系统级I/O》主要探讨了Unix/Linux操作系统中的输入/输出(I/O)机制,这一章的内容涵盖了Unix I/O的基本概念、接口以及不同类型的文件。以下是对这些知识点的详细阐述: Unix I/O是Linux内核提供的一种...

    Linux-UNIX系统编程手册(上册)1

    1. 高效地读写文件:理解I/O操作的优化技巧,包括缓冲、异步I/O等。 2. 使用信号、时钟和定时器:掌握如何处理程序中的事件和时间管理,例如SIGALRM、SIGVTALRM等。 3. 创建和管理进程:了解fork、exec系列函数,...

    UNIX平台下C语言

    3. **文件I/O**:在UNIX中,C语言通过标准I/O库和文件描述符进行文件操作。`fopen`, `fclose`, `fprintf`等函数用于处理文本文件,而`open`, `close`, `read`, `write`等系统调用适用于二进制文件和更底层的操作。 ...

    unix网络编程中文版第二版 卷二

    3. **多路复用I/O和异步I/O**:这部分内容涵盖了select、poll和epoll等多路复用I/O机制,以及异步I/O模型,如SIGIO和AIO,这些技术对于高效处理大量并发连接至关重要。 4. **高级套接字编程**:书中详细讨论了套接...

    UNIX培训教材 豆豆

    2. **内核**:作为操作系统的核心,负责内存管理、进程调度、I/O控制等关键任务。UNIX内核以其高效、稳定著称。 3. **Shell**:是用户与操作系统交互的界面,提供命令行解释器功能。常见的有Bash(Bourne-Again ...

    UNIX环境高级编程第二版

    - **文件I/O操作**:涵盖了标准I/O库函数、缓冲区I/O、非阻塞I/O以及异步I/O等高级话题,帮助读者理解如何更有效地进行文件读写操作。 - **网络编程**:深入分析了套接字编程模型,包括流式套接字和数据报套接字的...

    unix网络编程--第一卷----套接口API

    8. **异步I/O**:介绍非阻塞I/O和异步I/O模型,如SIGIO信号驱动I/O。 9. **高性能服务器设计**:探讨如何设计高效的并发服务器,如多线程、多进程、事件驱动模型等。 10. **套接字编程实践**:提供丰富的示例代码...

    操作系统.pdf

    I/O模型包括同步和异步,阻塞和非阻塞。例如,DMA(直接存储器访问)允许数据在设备和内存之间直接传输,而无需CPU介入,提高了效率。 Shell是操作系统提供的一种命令行接口,用户可以通过它执行系统命令和程序。在...

    UNIX环境高级编程共23章pdf_23

    3. **I/O操作**:涵盖标准输入/输出、文件描述符、缓冲I/O、非阻塞I/O、异步I/O等,以及select、poll和epoll等I/O多路复用技术。 4. **信号处理**:介绍如何捕获和处理信号,以及信号在进程控制中的应用。 5. **...

    unix network programming(Volume 1 • Third Edition).pdf

    5. 非阻塞和异步I/O:除了常规的阻塞I/O操作,书中还介绍了如何使用非阻塞套接字和异步I/O技术来提高网络应用的响应性和性能。 6. 套接字安全性:随着网络攻击的日益增多,网络通信的安全性变得尤为重要。本书讨论...

    UNIX 高级教程系统技术内幕

    8.2.5 分散-聚集I/O(Scatter-Garther I/O) 8.2.6 文件加锁 8.3 文件系统 8.3.1 逻辑磁盘 8.4 特殊文件 8.4.1 符号链接 8.4.2 管道和FIFO 8.5 文件系统框架 8.6 vnode/vfs 体系结构 8.6.1 目标 8.6.2 设备 1 门的...

    linux下测试磁盘io性能工具

    4. **fio (Flexible I/O Tester)**:这是一款强大的I/O性能测试工具,支持多种工作负载模型,包括随机读写、顺序读写等,可以进行非常详细的性能分析。 5. ** Bonnie++ 和 Sysbench**:这些是更全面的基准测试套件...

    基于TCP的异步通信例子

    4. **Epoll(Linux)/Kqueue(FreeBSD)**:在Unix-like系统中,Epoll和Kqueue提供了类似的功能,用于高效地管理大量套接字的I/O事件。 5. **选择器(Selectors)**:如Java的Selector API,它们允许程序在一个单独...

Global site tag (gtag.js) - Google Analytics