2022年3月10日
NIO和零拷贝
nio说是非阻塞的io模型,常见的我们直接使用netty来操作,而不会直接使用nio的基础api。
说一下大概的东西
1.传统IO是一次一个字节地处理数据,NIO是以块(缓冲区)的形式处理数据。最主要的是,NIO可以实现非阻塞,而传统IO只能是阻塞的。
2.在Java NIO有三个核心部分组成。分别是Buffer(缓冲区)、Channel(管道)以及Selector(选择器)
3.可以简单的理解为:Buffer是存储数据的地方,Channel是运输数据的载体,而Selector用于检查多个Channel的状态变更情况
4.IO复用模型,select/poll和epoll
linux下文件操作都适用fd,文件描述符来处理
select 模式下,文件描述符数量收到限制,并且需要轮训这个描述符的状态,才知道哪些数据就绪了,进而处理,epoll可以看作是有监听通知机制的模型,会维护一个就绪状态的的fd集合,直接从这个集合中获取即可。
5.零拷贝,主要使用dma,direct memory acess啥的。减少了数据从内核态到用户态的拷贝。比如说一个发送网络数据的操作,数据先从内核拷贝到用户态,用户态在拷贝到内核态给网卡,网卡在发出去,多了两次不必要的拷贝。
