1.阻塞IO
2.非阻塞IO
3.IO多路复用模型
将fd传递给select/poll调用,select顺序扫描socket fd是否就绪
4.信号驱动IO
linux内核通知我们可以开始进行一个IO操作
5.异步IO
linux内核通知我们IO操作已经完成
NIO:IO多路复用模型
1.将多个IO阻塞,复用到同一个select阻塞,由select轮询fd(文件描述符->网络事件)
2.select在使用上有限制,最大的权限是打开的socket fd是有限的1024
选择替换方案epoll, 1GB内存的机器可以存放10万个句柄左右 cat /proc/sys/fs/file-max 查看
3.select/poll另一个弱点,由于很多socket是空闲的,每次线性扫描,导致fd越多效率越差。
选择替换方案epoll, 活跃时才会调用callback,事件驱动
4.需要把fd消息通知给用户空间
epoll通过内核和用户空间mmap同一块内存实现的。
5.高负载,高并发的应用应该选择NIO模型。
缓冲区Buffer:在NIO的库中所有的数据都是通过Buffer进行处理的
通道Channel:通道不同于流,是因为通道是双向的。(SelectableChannel,FileChannel) 去类比 fd
多路复用器Selector:会不断的轮询注册的Channel。将就绪(发生读写)的轮询出来 去类比 select,epoll
因为jdk使用了epoll,所以一个线程就可以轮询成千上万的channel
BIO:
一个线程处理一个客户端连接,即一个线程占用了一个fd资源,既浪费了fd资源,也浪费了线程资源,可能会造成线程资源耗尽的问题。