Java NIO 第一章 介绍(5)

1.4.2 虚拟内存

 

       所有的现代操作系统都使用虚拟内存。虚拟内存意味着系统将使用人为假设(虚拟)的内存而不是物理内存。虚拟内存能提供两大基本好处:

       1.多个虚拟地址可以对应一个物理内存位置。

       2.虚拟内存空间可以大于实际的物理内存空间。

 

       前面的小节中提到硬盘控制器不能将数据直接利用DMA传送到用户空间,虚拟内存的第一个好处将显现出来。通过将内核空间和用户空间的虚拟地址映射到同样的物理地址空间,只能访问物理内存的DMA就能够将缓冲区填入到内核空间和用户空间都可见的虚拟地址空间,如图1.3所示。

                                          1.3 被多次映射的内存空间

       这样做的好处就是消除了将数据从内核空间到用户空间的代价,但是这需要内核和用户缓冲区共享同样页。缓冲区必须是块大小的整数倍才能被硬盘控制器使用。操作系统将内存地址空间分成很多固定大小的页。内存页通常是磁盘块大小的整数倍,而且是更容易被定位的2的幂级数。内存页的大小通常是1024,20484096字节大小。虚拟内存页和物理内存页的大小通常是一样的。图1.4展示了多个虚拟内存空间是怎么被映射到物理内存空间的。

                                                 1.4 内存页

 

 

       1.4.3 内存分页

 

       为了使虚拟内存大小大于物理内存,就必须使用内存分页,通常内存分页被解释为交换,但是交换是发生在进程级别的,而不是内存页面级别考虑的。有了内存分页,物理内存中的页就可以保存在外部硬盘中,这样就能为其他的虚拟内存页面提供物理内存空间。从本质上讲,物理内存就像一个高速缓存来缓存那些交换出物理内存而存储在硬盘的内存页面。

 

       1.5展示了属于四个进程的多个虚拟内存页面,每个进程都有各自的内存空间。进程A的两个内存页面被加载进物理内存;其他的被保存在硬盘上。

                                          1.5 作为页缓冲的物理内存

 

       将内存页大小设定为硬盘数据块大小的整数倍,将使内核很容易的通过简单的命令就可以将数据从内存写入到硬盘中,或者当需要的时候将数据从硬盘中加载进来。这样所有的IO操作都是在页层面上处理的。所有的现代、基于页的操作系统都是这样来移动数据的。

 

       现在的CPU都包括一个内存管理单元(MMU)的子系统。这个设备逻辑上存在于物理内存和CPU之间。它存储了将虚拟内存映射为物理内存所需要的信息。当CPU定位一个内存地址时,MMU通过内存地址的掩码来决定内存地址所驻留的页面,然后将虚拟内存页面转换为物理内存页面,这个过程是硬件处理的,因此相当的快。如果虚拟内存页面和物理内存页面实际上没有映射关系,那么MMU将给CPU抛出页错误。

 

       页错误将导致一个“陷入”,就像调用系统调用一样进入中断向量,内核通过跟页错误一起传入的信息来确定那个内存地址导致了这个错误。然后内核将对该页进行验证。同时内核将进行调页操作将缺少的页调度到物理内存中。这个操作通常导致另一个页面被调出物理内存,来为调入的页面腾出空间。在这种情况下,如果被调走的页面被修改或最后一次调入所“弄脏”,调出该页面的操作必须首先执行。

 

       如果所请求的虚拟内存地址不存在,即它不属于任何进程的内存片段,那么那个页面将不能被验证,这时段错误将会产生。这会导致中断向量将调用另外一些内核操作,通常是进程被杀死。

 

       只要标记错误的页被验证存在,MMU将被更新虚拟物理页面映射,如果有必要将断开被映射的调走的页面。这时用户进程将被恢复。产生页错误的进程将不会意识到这些情况;但是它的确发生了。

 

       内存页面的动态转移是基于请求页面调度机制的。在内核中有很多复杂的算法来优化这个过程,同时来减少系统颠簸,系统颠簸将导致页调度变得如此频繁以至于任何其他事情都无法进行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值