简论BIO NIO AIO

来源:互联网 发布:网络教育要多少钱 编辑:程序博客网 时间:2024/05/16 14:13
IO的方式通常分为3种:同步阻塞的BIO、同步非阻塞的NIO、异步非阻塞的AIO
一.  我们先来认识几个名词:
      (1) 同步:指的是用户进程触发IO操作并等待或者轮询的去查看IO操作是否就绪。(只干这一件事)
      (2)异步:异步是指用户进程触发IO操作以后便可以开始做自己的事情,而当IO操作已经完成的时候会得到IO完成的通知(这就是异步的特点,就是通知,比如你告诉你的好朋友去买一些零食,并且告诉他你喜欢吃甜的,酸的,托他去买,然后自己去干其他事情)。使用异步IO时,java会将IO读写委托给OS处理,需要将数据缓冲区地址和大小传给OS。
       (3)阻塞:阻塞是指当试图对该文件描述符进行描述读写时,如果当时没有东西可读,或者暂时不可写,程序就进行等待状态,直到有东西可读或可写为止(比如你去商店买东西,售票员突然有事离开,这时我们就需要在这里等待,直到售票员回来)。
       (4)非阻塞:非阻塞状态下,如果没有东西可读,或者不可写,读写函数马上返回,而不会等待。(比如去银行取钱,你可以先领取一张小票,领取完后我们可以自己玩手机,聊天,当轮到我们时,银行会通知你,这个时候我们就可以去了)。
二.我们再理解一下组合方式的IO类型:
      (1)同步阻塞IO(java BIO):同步阻塞,服务器实现模式为一个接一个线程,即客户端有连接请求时服务器就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善。(只干这一件事,遇到阻塞一直等待)
       (2)同步非阻塞IO(java NIO):服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。用户进程也需要时不时的询问IO操作是否就绪,这就要求进程不停的去询问。(自己干,但是可以在等待时干其他事情)
       (3)异步阻塞IO(java NIO):此种方式下是指应用发起一个IO操作以后,不等待内核IO操作的完成,等内核完成IO操作以后会通知应用程序,这其实就是同步和异步最关键的区别,同步必须等待或者主动的去询问IO是否完成,那么为什么说是阻塞的呢?因此此时是通过select系统调用来完成的,而select函数本身的实现方法是阻塞的,而采用select函数有个好处就是它可以同时监听多个文件句柄(如果从UNP的角度看,select属于同步操作,因为select之后进程还需要读写数据),从而提高系统的并发性。(让别人干,同时等待的同时不能干其他事情)
      (4)异步非阻塞IO(java AIO):在此种模式下,用户进程只需要发起一个IO操作然后立刻返回,等IO操作真正的完成以后,应用程序会得到IO操作完成的通知,此时用户进程只需要对数据进行处理就好了,不需要进行实际的IO读写操作,因为真正的IO读写或者写入操作已经由内核完成了。(让别人干,等待的同时,可以干其他事情)。
     
   

  
原创粉丝点击