一.NIO背景知识

一.虚拟内存

  • MMU:它是中央处理器(CPU)中用来管理虚拟存储器、物理存储器的控制线路,同时也负责虚拟地址映射为物理地址,以及提供硬件机制的内存访问授权,多用户多进程操作系统。
一.NIO背景知识_第1张图片
image.png
  • 操作系统为每个进程都分配了一个页表,CPU有一个专门的页表基地址寄存器(PTBR)指向当前页表的基地址,快速定位到该进程的页表。


    一.NIO背景知识_第2张图片
    image.png
  • 因为有页表的存在,所以没有必要把虚拟存储器(存在在磁盘上的)的所以页都缓存在内存当中,即便CPU访问该虚拟存储器的页不存在在内存当中,那么系统会通过查表,把需要的页从磁盘当中拷贝到内存当中,

  • 页命中的情况:如果虚拟页已经缓存到了物理存储器,直接从物理存储器中直接读取数据就好了。
    缺页的情况:MMU发现某个CPU需要的虚拟页没有缓存到内存中,会选择已缓存到内存的一个牺牲页,把它拷贝会虚拟存储器的某个位置,再将命中的虚拟页缓存到内存当中。

  • 虚拟内存:虚拟内存是一种逻辑上扩充物理内存的技术。基本思想是用软、硬件技术把内存与外存这两级存储器当做一级存储器来用。简单的说就是将硬盘的一部分作为内存来使用。

  • 总结: CPU在寻址的时候,是按照虚拟地址来寻址,然后通过MMU(内存管理单元)将虚拟地址转换为物理地址。因为只有程序的一部分加入到内存中,所以会出现所寻找的地址不在内存中的情况(CPU产生缺页异常),如果在内存不足的情况下,就会通过页面调度算法来将内存中的页面置换出来,然后将在外存中的页面加入到内存中,使程序继续正常运行。


    一.NIO背景知识_第3张图片
    image.png

参考:
虚拟地址与虚拟内存
妙趣横生的虚拟存储器

二.NIO内存映射文件

  • 虚拟内存和内存映射文件都是加载一部分内容,另一部分放在磁盘上的一种机制;
    虚拟内存使用硬盘只能是页面文件,而内存映射使用的磁盘部分可以是任何磁盘文件
  • 内存映射原理:简单来说:将要映射的文件生成虚拟地址,若虚拟地址通过页表查询,若成功则直接读取,若缺页,则直接从硬盘中加载数据到内存。
一.NIO背景知识_第4张图片
image.png
  • 内存映射为什么会比普通IO速度快
    内存映射文件和之前说的 标准IO操作最大的不同之处就在于它虽然最终也是要从磁盘读取数据,但是它并不需要将数据读取到OS内核缓冲区,而是直接将进程的用户私有地址空间中的一 部分区域与文件对象建立起映射关系,就好像直接从内存中读、写文件一样,速度当然快了。

参考:java 深入理解内存映射文件原理

三.直接缓存区域非直接缓存区

  • NIO是通过缓存区读取数据的,那什么是缓存区呢?
    • 直接缓存区:系统与应用程序均在系统物理内存中保存读取数据。不过对于直接字节缓存区可以通过FileChannel 的 map() 方法将物理内存数据映射到各自的缓存中并返回MappedByteBuffer进行读写操作


      一.NIO背景知识_第5张图片
      image.png
    • 非直接缓存区:以读取系统数据为例,数据首先将数据存储于系统缓存(butter)中,而后将数据复制于JVM中,java应用程序读取数据JVM中保存的数据
一.NIO背景知识_第6张图片
image.png

你可能感兴趣的:(一.NIO背景知识)