目录
一、介绍I/O
二、Java中常见的I/O
1.BIO,同步阻塞IO
2.NIO,同步非阻塞IO
3.AIO,异步I/O
三、三种IO的区别
一、介绍I/O
1.I/O(Input/Output)的即为输入输出。
2.从计算机的角度来看:在冯诺伊曼体系中,计算机结构分为:运算器,控制器,存储器,输入设备,输出设备。I/O描述了外部设备和内部设备的通信。从应用程序的角度来看,一个进程为了保证稳定性和安全性,将地址空间划分为用户空间和内核空间,我们平常运行的应用程序都是在用户空间上,内核空间处理系统态级别的资源操作,入文件操作、进程通信、内存管理等等。所以说想要进行I/O需要依赖内核空间的能力。
3.我们平常进行开发的过程中,最常接触的就是磁盘I/O和网络I/O。在应用程序的视角看,应用程序对操作系统内核发起I/O调用,操作系统负责执行具体的I/O操作。
二、Java中常见的I/O
1.BIO,同步阻塞IO
这种I/O操作的缺陷很明显,只能处理客户端连接量不多的情况,当客户端连接量达到万级别的时候,传统BIO模型是无能为力的。
2.NIO,同步非阻塞IO
1.这种I/O方式执行过程中,应用程序会不断给操作系统内核发送I/O调用(read),这段时间内线程依然是阻塞的,等内核空间将将数据返回到用户空间。同时缺陷也很明显,应用程序不断调用IO询问数据返回的过程是非常耗费CPU资源的。
2.这个时候I/O多路复用就发挥了作用,线程首先发起select调用询问内核是否准备好数据。等内核将数据准备就绪时,用户线程在发起read调用,read调用过程的过程(数据从内核空间->用户空间)还是阻塞的。
I/O多路复用,通过减少对内核的无效调用,减少了对CPU的占用。
3.在NIO当中,有一个非常重要的概念,就是选择期(selector),也称为多路复用器。通过他只需一个线程就能连接管理多个客户端。
3.AIO,异步I/O
1.异步IO是基于事件的回调机制实现的,也就是应用程序操作完成之后,不会阻塞在原地,而是当后台处理完成后,操作系统会通知相应的线程进行后续操作。
三、三种IO的区别