NIO、BIO、AIO

同步阻塞IO(BIO)

我们熟知的socket编程就是BIO,一个socket连接一个处理线程。但是因为操作系统允许得线程数量有限,那么多个socket申请与服务器建立连接的时候,服务端不能提供相应的数量的处理线程,没有分配到处理线程的连接就会阻塞。

同步非阻塞IO(NIO)

一个socket连接只有在少数的情况下才会发生数据传输,大部分的时间这个’数据通道’是空闲的,但还是占有着线程。NIO做出的改进就是”一个请求一个线程“,在连接到服务器的众多的socket中,只有需要进行IO操作的才能够获取服务端的处理线程进行IO。客户端的socket连接到服务器的时候,会在事件分离器注册一个IO请求事件和IO事件处理器。再该连接发生IO事件时,IO事件处理器就会启动一个线程来处理这个IO请求。

异步阻塞IO(AIO)

NIO是同步的IO,是因为程序需要IO操作时,必须获得了IO权限后亲自进行IO操作才能进行下一步操作。AIO是对NIO的改进(所以AIO又叫NIO.2),它是基于Proactor模型的。每个socket连接在事件分离器注册 IO完成事件 和 IO完成事件处理器。程序需要进行IO时,向分离器发出IO请求并把所用的Buffer区域告知分离器,分离器通知操作系统进行IO操作,操作系统自己不断尝试获取IO权限并进行IO操作(数据保存在Buffer区),操作完成后通知分离器;分离器检测到 IO完成事件,则激活 IO完成事件处理器,处理器会通知程序说“IO已完成”,程序知道后就直接从Buffer区进行数据的读写。

也就是说:AIO是发出IO请求后,由操作系统自己去获取IO权限并进行IO操作;NIO则是发出IO请求后,由线程不断尝试获取IO权限,获取到后通知应用程序自己进行IO操作。

NIO是new I/O的简称,与旧时的I/O方法相对。具备以下的特性

  • NIO基于块的,以块作为基本的处理数据。
  • NIO都会为所有得原始类型提供buffer缓存支持。
  • 增加通道channal对象,作为新得原始I/O对象。
  • 支持锁和内存映射文件得文件访问接口。

NIO提供了两个重要得特性:

1、buffer

buffer有三个参数:position、capacity、limit。Position就是当前缓存区得位置。Capacity就是缓存区得总容量上限。Limit就是实际容量,通常和容量一致。

buffer有两个重要的方法:flip、clear。flip实际作用就是将position进行重置,将limit得位置重置到了原来position的位置。clear的作用就是将position置为零,将limit设为capacity的大小。

2、channel

Java NIO的通道类似流,但又有些不同:既可以从通道中读取数据,又可以写数据到通道。但流的读写通常是单向的。通道可以异步地读写。通道中的数据总是要先读到一个Buffer,或者总是要从一个Buffer中写入。

你可能感兴趣的:(NIO,BIO,AIO,NIO,BIO,AIO)