BIO NIO AIO:
1: 传统的BIO(read + write):
总结:
2次系统调用 -》4次上下文切换 = 4次
2次DMA拷贝 + 2次CPU拷贝 = 4次
2: BIO基础上改进的NIO
第一种方案(mmap + write):通过mmap建立用户态和内核态的内存地址映射,这样就可以减少两次内核态和用户态之间的cpu拷贝了,但是会增加一次从pageCache到Socket缓冲区的cpu拷贝。总来来说,就减少了一次cpu拷贝
总结:
两次系统调用 -》4次上下文切换 = 4次
2次DMA拷贝 + 1次cpu拷贝 = 3次
第二种方案(sendFile):使用sendFile系统调用来代替 read + write 操作。
总结:
一次系统调用 -》2次上下文切换 = 2次
2次DMA拷贝 + 1次cpu拷贝 = 3次
第三种方案(在网卡升级了的环境下改进的 sendFile):使用sendFile系统调用来代替 read + write 操作,此时在内核中数据不需要从 pageCache 中通过cpu缓存到 Socket缓冲区中,直接通过SG-DMA拷贝技术从 pageCache 中拷贝到网卡。这就是常说中的 零拷贝 技术。(这个 零 指的是 0 cpu拷贝)
总结:
一次系统调用 -》2次上下文切换 = 2次
2次DMA拷贝 = 2次
3: AIO
bio 和 nio 都使用了 pageCache 技术,使用了pageCache的IO一般就叫缓存IO、没有使用的就叫直接IO。
pageCache 技术带来两个好处:缓存最近被访问的数据、预读功能;
pageCache 的缺点:空间小,对大文件缓存不下来(而且会把其它缓存挤下去),这时就用不上 DMA 技术了。
基于上面两个问题,于是就发明了:AIO(异步IO)