IO
IO是什么?

从计算机结构来讲,I就是Input,o就是output,那么IO描述的就是描述计算机系统与外部设备通信的过程

如输入设备(键盘),输出设备(显示屏)就是外部设备,网卡和硬盘也是外部设备

从应用程序角度来说,IO是指应用程序通过系统调用请求操作系统内核空间执行与“外部设备的交互”的过程
当应用程序发起IO调用后,会经历两个阶段
1.内核等待IO设备准备好数据
2.内核把数据从内核空间拷贝到用户空间
UNIX下的五种IO模型
UNIX 系统下, IO 模型一共有 5 种:同步阻塞 I/O、同步非阻塞 I/O、I/O 多路复用、信号驱动 I/O 和异步 I/O。
jtea/linux/五种IO模型.md at master · jmilktea/jtea
Java的三种IO模型
阻塞IO
应用程序发起IO调用后,会一直阻塞,直到成功拿到数据

连接一多起来,每来一次连接就得开一个线程,费内存。且线程阻塞住,不能去干其他事情
NIO 非阻塞IO
同步非阻塞

应用程序轮询 询问内核数据是否就绪,避免了一直阻塞。但不断轮询是很耗CPU资源的
IO多路复用

有个重要角色selector会去监听客户端的channel,然后数据准备好了就主动通知客户端可以来读数据了
实现了一个线程就可以监听多个Client的功能

目前支持IO多路复用的系统调用有三种:select(几乎所有的系统都支持),poll,epoll