1、jdk1.4之前(jdk1.4开始提供了nio)的早起版本,java对I/O的支持并不完善,开发人员开发高性能I/O程序时,面临的问题主要有:
     没有缓冲区,I/O性能存在问题
     没有Channel概念,只有输入输出流
     同步阻塞式I/O通信(BIO),通常会导致通信线程被长时间阻塞
     支持字符集有限,硬件移植性不好

简单的bio示例,maven项目:http://yunpan.cn/cwGDaENtaXgqw  访问密码 480c

使用java线程池处理I/O请求的bio的maven项目:http://yunpan.cn/cwGzKNdFe7UMm  访问密码 6bf2
2、linux的内核将所有外部设备都看做一个文件来操作,对一个文件的读写操作会调用内核提供的系统命令,返回一个file descriptor(fd,文件描述符)。而对一个socket的读写也会有响相应的描述符,称为               socketfd(socket描述符),描述符就是一个数字,它指向内核中的一个结构体(文件路径,数据区等一些属性)。根据unix网络编程对I/O模型的分类,unix提供了5种I/O模型,分别如下:
         (1)阻塞I/O模型:最常用的I/O模型就是阻塞I/O模型,缺省情况下,所有文件操作都是阻塞的。我们以套接字接口为例来讲解此模型:在进程空间中调用recvfrom,其系统调用知道数据包到达且被复制到应     用进程的缓冲区中或者发生错误时才返回,在此期间一直会等待,进程在调用recvfrom开始到它返回的整段时间内都是被阻塞的,因为被称为阻塞I/O模型。
          (2)非阻塞I/O模型:recvfrom从应用层到内核的时候,如果该缓冲区没有数据的话,就直接返回一个EWOULDBLOCK错误,一般都是对非阻塞I/O模型进行轮询检查这个状态,看内核是不是有数据到来。
          (3)I/O复用模型:linux提供了select/poll,进程通过将一个或多个fd传递给select或poll系统调用,阻塞在select操作上,这样select/poll可以帮我们侦测多个fd是否处于就绪状态。select/poll是顺序扫描     fd是否就绪,而且支持的fd数量有限,因此它的使用受到了一些制约。select的最大缺陷是单个进程所打开的fd是有一定限制的,默认值为1024。linux还提供了一个epoll系统调用,epoll使用基于事件驱动方式代     替顺序扫描,因此性能更高。当有fd就绪时,立即回调函数callback。epoll支持的fd上限是操作系统的最大文件句柄数。
          (4)信号驱动I/O模型:首先开启套接口信号驱动I/O功能,并通过系统调用sigaction执行一个信号处理函数(此系统调用立即返回,进程继续工作,它是非阻塞的)。当数据准备就绪时,就为该进程生成一     个SIGIO信号,通过信号回调通知应用程序调用recvfrom来读取数据,并通知主循环函数处理数据。
          (5)异步I/O:告知内核启动某个操作,并让内核在整个操作完成后(包括将数据从内核复制到用户自己的缓冲区)通知我们。这种模型与信号驱动模型的主要区别是:信号驱动I/O由内核通知我们何时可以开     始一个I/O操作;异步I/O模型由内核通知我们I/O操作何时已经完成。
3、epoll在select基础上的改进
    (1)支持一个进程打开的socket描述符(fd)不受限制(仅受限于操作系统的最大文件句柄数)。select支持的fd默认值是1024。
    (2)I/O效率不会随着fd数目的增加而线性下降
    (3)使用mmap加速内核与用户空间的消息传递
    (4)api更加简单

4、nio类库的相关概念
   (1)缓冲区Buffer
          在面向流的I/O中,可以将数据直接写入或者将数据直接读到 stream对象中。在nio库中,所有数据都是用缓冲区处理的。在读取数据时,它是直接读到缓冲区中,在写入数据时,写入到缓冲区中。任何时候       访问nio中的数据,都是通过缓冲区进行操作。缓冲区实质上是一个数组,同时缓冲区还提供了对数据的结构化访问以及维护读写位置(limit)等信息。最常用的缓冲区是ByteBuffer,java每一种基本类型              (Boolean除外)都对应一种缓冲区。
   (2)通道Channel
          Channel是一个通道,可以通过它读取和写入数据,它就像自来水管一样,网络数据通过Channel读取或写入。通道与流的不同之处在于通道是双向的,流只是在一个方向上的移动,而且通道可以用于读、写       或同时读写。Channel可以分为两大类:分别是用于网络读写的SelectableChannel和用于文件操作的FileChannel。
   (3)多路复用器Selector
          Selector会不断的轮询注册在其上的Channel,如果某个Channel上面有新的TCP连接接入、读或写事件,这个Channel就处于就绪状态,会被Selector轮询出来,然后通过SelectionKey可以获取就绪的           Channel的集合,进行后续的I/O操作。一个多路复用器Selector可以同时轮询多个Channel。

nio简单示例,maven项目:http://yunpan.cn/cwGzeTqX9PSYt  访问密码 6f7c

I/O知识的更多相关文章

  1. 你必须知道的EF知识和经验

    注意:以下内容如果没有特别申明,默认使用的EF6.0版本,code first模式. 推荐MiniProfiler插件 工欲善其事,必先利其器. 我们使用EF和在很大程度提高了开发速度,不过随之带来的 ...

  2. MySQL高级知识- MySQL的架构介绍

    [TOC] 1.MySQL 简介 概述 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle公司. MySQL是一种关联数据库管理系统,将数据保存在不同的表中,而 ...

  3. 学点HTTP知识

    不学无术 又一次感觉到不学无术,被人一问Http知识尽然一点也没答上来,丢人丢到家了啊.平时也看许多的技术文章,为什么到了关键时刻就答不上来呢? 确实发现一个问题,光看是没有用的,需要实践.看别人说的 ...

  4. java中的字符串相关知识整理

    字符串为什么这么重要 写了多年java的开发应该对String不陌生,但是我却越发觉得它陌生.每学一门编程语言就会与字符串这个关键词打不少交道.看来它真的很重要. 字符串就是一系列的字符组合的串,如果 ...

  5. [C#] C# 知识回顾 - 你真的懂异常(Exception)吗?

    你真的懂异常(Exception)吗? 目录 异常介绍 异常的特点 怎样使用异常 处理异常的 try-catch-finally 捕获异常的 Catch 块 释放资源的 Finally 块 一.异常介 ...

  6. [C#] C# 知识回顾 - 学会处理异常

    学会处理异常 你可以使用 try 块来对你觉得可能会出现异常的代码进行分区. 其中,与之关联的 catch 块可用于处理任何异常情况. 一个包含代码的 finally 块,无论 try 块中是否在运行 ...

  7. [C#] C# 知识回顾 - 学会使用异常

    学会使用异常 在 C# 中,程序中在运行时出现的错误,会不断在程序中进行传播,这种机制称为“异常”. 异常通常由错误的代码引发,并由能够更正错误的代码进行 catch. 异常可由 .NET 的 CLR ...

  8. [C#] C# 知识回顾 - 异常介绍

    异常介绍 我们平时在写程序时,无意中(或技术不够),而导致程序运行时出现意外(或异常),对于这个问题, C# 有专门的异常处理程序. 异常处理所涉及到的关键字有 try.catch 和 finally ...

  9. [.NET] C# 知识回顾 - Event 事件

    C# 知识回顾 - Event 事件 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/6060297.html 序 昨天,通过<C# 知识回顾 - ...

  10. [.NET] C# 知识回顾 - 事件入门

    C# 知识回顾 - 事件入门 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/6057301.html 序 之前通过<C# 知识回顾 - 委托 de ...

随机推荐

  1. Nodejs学习(二)-express生成器

    1.安装生成器 sudo npm install express-generator -g 2.做ln链接,这个我就不介绍了,可以参照上个随笔,指向/usr/local/bin就行. 3.生成项目文件 ...

  2. Loadrunner开发测试脚本

    Loadrunner开发测试脚本 开发测试脚本可以通过录制,也可以手动开发,建议能录制的尽量录制,省时省力,不能录制的只能费力自己开发了,具体看项目情况来决定. 使用Loadrunner开发脚本过程中 ...

  3. php 之跨域上传图片

    因为要将所有上传的图片上传到一台独立的图片服务器上面,js上传时存在跨域问题,网上找到这种,通过php curl方式,将图片重新发送到另外一台服务器上保存,并返回图片路径!这种方式存在一定问题:1,上 ...

  4. web初学之MVC

    之前对JavaEE的MVC模式有些许了解,但一直没有很好的掌握,在读代码时候也很模糊不清.因此对MVC又通过各种资料有了全面的理解. 一.首先,需要从了解JavaEE技术开始.JavaEE技术在设计程 ...

  5. 研究SVM时安装的一些工具的方法

    本文是个人存档,不介绍研究SVM相关内容. 1.bamboo在fedora19下 哪一行编译时报错,就注释掉 php插件不用装 提示ERROR: libcrfpp.so.0: cannot open ...

  6. kindeditor富文本框,上传文件后,显示文件名称

    kindeditor作为一个应用广泛富文本框,我们经常会利用到它,然而在使用的过程中,发现有的地方使用起来很不方便,例如本文要说的,用户上传文件之后,默认只有文件URL,没有文件说明,如图: 点击确定 ...

  7. WinForm程序中的类TextBox的自定义控件, 添加失去焦点的功能

    原理: 一.在控件的后台代码中, 添加布尔类型的属性CanFocus 二.在控件的构造函数中, 注册Enter事件的处理方法. 并在处理方法中,根据CanFocus属性的值来决定是否可以丢失焦点, 如 ...

  8. Git的基础

    http://backlogtool.com/git-guide/cn/intro/intro2_3.html

  9. excel 把字符和数字分开

    主要是 len,lenb,left,right 函数 http://jingyan.baidu.com/article/95c9d20dac8540ec4f75616d.html

  10. iOS支持Https

    http://oncenote.com/2014/10/21/Security-1-HTTPS/?hmsr=toutiao.io&utm_medium=toutiao.io&utm_s ...