IO概念和IO模型

1.前言

       IO的概念和模型很重要,不过每次看完资料过段时间又忘了,还得需要亲自写一下,加深下记忆和理解,本篇记录参考伟峰的总结和网上资料整理而来,目的是加深这块IO知识体系的记忆!在Unix的世界里,一切皆文件,比如socket,在socket处理过程中,我们对这些流进行的读写操作就是IO操作,操作系统会把socket流转换成一个文件描述符,也就是fd(整数),对这个整数的操作就是对socket操作.IO的分类可以分为网络IO和磁盘IO, I/O 模型就是操作系统执行 I/O 指令的方法。
主流的 I/O 模型通常有 5 种类型:IO模型可以分为阻塞IO、非阻塞IO、信号驱动IO、IO多路转接、异步IO这5种。每种 I/O 模型都有各自典型的使用场景,比如 Java 中 Socket 对象的阻塞模式和非阻塞模式就对应于前两种模型;而 Linux 中的系统调用 select 函数就属于 I/O 多路复用模型;大名鼎鼎的 epoll 系统调用则介于第三种和第四种模型之间;至于第五种模型,其实很少有 Linux 系统支持,反而是 Windows 系统提供了一个叫 IOCP 线程模型属于这一种,通常情况下我们认为后一种模型会比前一种模型要高级,比如 epoll 就比 select 要好,

2.IO类型

IO类型可以简单分为普通文件IO,FileChannel文件IO,零拷贝文件IO,普通网络IO,网络IO零拷贝具体参考下图

 

 2.1 普通文件IO

    从上图中可以看到一次读写文件的请求就有2次数据复制,分别是磁盘数据先到操作系统的内核,再从操作系统的内核到JVM里,还有2次操作系统上下文切换

 2.2 FileChannel文件IO

       FileChannel会产生缓冲区,比如读一个文件,就先将文件内容读到到缓冲区(内存),再进行操作,就不需要像InputStream每次读操作都要调用系统资源从文件处读取。这个和普通文件IO的读写请求交互方式差不多,数据先从磁盘映射到缓冲区,用户再从缓存区读取数据,同理用户写数据到内存缓冲区,操作系统内核再把缓冲区的数据写入磁盘,同样也是2次内存拷贝和数据切换,但是内核可以通过预加载缓存等手段使得IO读写性能提高(OS负责),也可引做共享内存,减少IO操作,提升并发性;应用crash,保证这部分内容还能写的进去文件。在我们调用channel.write(bytebuffer)之后,具体何时写入磁盘、bytebuffer中内容暂存于哪里(os cache)等相关一系列问题,就交由OS本身负责了,案例kafka
参考文档

https://zhuanlan.zhihu.com/p/27650977 
https://www.imooc.com/wenda/detail/575214 
https://blog.csdn.net/wohiusdashi/article/details/82837808

 2.3  零拷贝文件IO

     mmap 通过内存映射,将文件映射到内核缓冲区,同时,用户空间可以共享内核空间的数据。这样,在进行网络传输时,就可以减少内核空间到用户空间的拷贝次数。当用户修改“虚拟内存”数据,就相当于修改了文件。由内核完成刷盘持久化。将read/write这样的IO操作,变成了内存或虚拟内存的读写。工具类MappedByteBuffer,案例rocketMQ 

参考文档 
https://www.cnblogs.com/yuyutianxia/p/6253468.html
https://blog.csdn.net/qq_41969879/article/details/81629469
https://www.freesion.com/article/7040248729/

 2.4  普通网络IO

  一次网络请求,客户端先通过socket建立连接到目标服务器的内核,再到目标的java进程,通过java进程读取磁盘数据,从图中可以看到涉及1次操作系统用户态和内核态的切换,一次数据复制

 2.5  网络零拷贝IO

   大致流程和普通网络IO差不多,区别在于目标服务器java进程读取数据后不经过JVM内存,直接通过sendFile把数据发给socket,像kafka,rocketmq都采用这种技术,类似的使用堆外内存的框架还有elasticsearch

参考https://www.jianshu.com/p/028cf0008ca5

3. IO模型

   这5种IO模型就是JVM和内核的交互的过程,下面2篇文章比较好理解,就不在单独记录了
https://blog.csdn.net/ZWE7616175/article/details/80591587
https://blog.csdn.net/jiangzhexi/article/details/106416159
Epoll的本质(内部实现原理)https://www.cnblogs.com/looyee/articles/12964911.html
select、poll和epoll的总结对比 https://blog.csdn.net/qq_35976351/article/details/85228002

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章