IO模型,可以理解成是有一种通信模型
BIO是一种阻塞通信模型,每建立一个链接,就会产生一个线程,当链接建立,但是没有信息传递时,这个线程会一直阻塞在这里。这时就会很消耗资源。
NIO是一种非阻塞IO模型,他使用一个线程来管理多个链接。依靠buffer,channel,selector三个组件来完成单线程的多路复用。通过selector来监听多个channel注册的事件,如果有事件发生,就会对这个事件进行处理(比如建立链接,接受信息等)。
零拷贝
比如我们要从磁盘读取一个文件,将文件内容对外做一次发送,这个简单的操作就涉及到几次拷贝。
如图:
1.从磁盘读取到内核的缓存区,进行一次拷贝,同时这是从用户态切换到内核态
2.从应用读取内核缓冲区数据,进行第二次拷贝,同时内核态切换成用户态,cpu参与拷贝
3.从应用缓存区拷贝到socket缓存区,进行第三次拷贝,socket缓存区属于内核态,这里又会发生一次状态切换
4从socket缓存区拷贝到网卡,进行第四次拷贝
总结:一共有4个拷贝,3次状态切换
mmap映射技术
在内核缓存区拷贝到应用时,使用映射技术,对物理磁盘和虚拟地址进行映射,减少一次拷贝
sendfile技术
内核缓存区和socket缓冲区都是内核态,那么他们能不能直接拷贝呢?使用它们内核态的地址,也就是文件符号引用,可以理解成他们在内核态的地址,这样直接使用文件符号引用符来做拷贝
这样只需要三次拷贝,两次状态切换