根据冯.诺依曼结构,计算机结构分为 5 大部分:运算器、控制器、存储器、输入设备、输出设备。
用户空间 ---> 操作系统 ---> 内核空间
IO 模型一共有 5 种: 同步阻塞 I/O、同步非阻塞 I/O、I/O 多路复用、信号驱动 I/O 和异步 I/O。
java 中的 I/0 : BIO , NIO , AIO
同步阻塞IO模型:应用程序发起 read 调用后,会一直阻塞,直到在内核把数据拷贝到用户空间。(客户端连接数量不高的情况下使用)
同步非阻塞IO模型:应用程序会一直发起 read 调用,等待数据从内核空间拷贝到用户空间的这段时间里,线程依然是阻塞的,直到在内核把数据拷贝到用户空间。(轮询数据是否准备好十分消耗cpu资源)
AIO(也就是NIO 2) :异步IO模型,基于事件和回调机制实现的,也就是应用操作之后会直接返回,不会堵塞在那里,当后台处理完成,操作系统会通知相应的线程进行后续的操作。
IO多路复用模型:线程首先发起 select 调用,询问内核数据是否准备就绪,等内核把数据准备好了,用户线程再发起 read 调用。read 调用的过程(数据从内核空间->用户空间)还是阻塞的。