用户态和内核态
先不管态这个字,其实就是两个进程,
1.用户程序进程 2.操作系统内核进程数据复制
按位置划分
1.磁盘——操作系统(内存) 2.操作系统——用户程序进程(内存)磁盘io
磁盘速度慢,尽量把更多的数据弄到内存去。
内存
内存速度快。不过,内存分两块:
1.操作系统内存 2.用户程序内存缓冲区
也分两块:
1.操作系统缓冲区内存 2.用户程序进程缓冲区内存首先,缓冲区都是内存,操作系统缓冲区就是与磁盘通信,所以也叫操作系统io缓冲区。目的是把更多的数据放到内存,减少磁盘io次数。
用户进程缓冲区,是因为用户程序调用操作系统API属于系统调用,比较耗费资源,所以为了减少系统调用次数,用户进程也有缓冲区。目的其实和操作系统的缓冲区的作用一样,都是为了减少慢操作的次数,把更多的数据放到内存,从而提高速度。架构图
内存映射文件技术
顾名思义,就是把磁盘文件和用户进程缓冲器内存直接建立联系,不经过内核的缓冲区。
就是忽略操作系统内核的缓冲区,经过内核的时候,数据直接到用户进程缓冲区。流程和之前是一样的,只是内核直接把数据放到了用户进程的缓冲区,没有经过自己的缓冲区。所以流程是如下:
磁盘文件——内核:系统调用——用户进程缓冲器内存总而言之,其他都一样,就是少了内核的缓冲区。
内存映射文件技术在消息中间件RocketMQ的应用
消息数据读写的时候,采用了内存映射文件技术。
为什么不取消内核缓冲区,全部采用内存映射文件技术?
1.内存映射文件技术里的内存是不同用户进程共享,数据不安全
2.内存大小有限参考
JAVA NIO之浅谈内存映射文件原理与DirectMemory