一、
Buffer Handling
缓存区及其处理时所有I/O的基础。所有的I/O都是将数据移入和移出缓冲区。
下图展示了在一个进程中,(如硬盘)是如何将外部数据源数据搬移到内存中。某进程发送请求,通过read()系统调用来将自己的缓冲区填满。这将导致内核命令磁盘控制器硬件从硬盘获取数据。硬盘控制器在没有任何CPU主存的帮助下通过DMA(Direct Memory Access)将数据直接写入内核内存缓冲区。一旦磁盘控制器完成缓冲写入,内核将自己空间下的暂时缓冲区数据,拷贝到发起read()操作的进程下的缓冲区。
上图是一个简单示意图。用户空间通常来说随着进程生而生,进程灭而灭。JVM通常就是一个JVM是一个常规过程,驻留在用户空间中。用户空间是一个非特权区域:在那里执行的代码无法直接访问硬件设备例。内核空间是操作系统所在的位置。内核代码有特殊之处特权:它可以与设备控制器通信,操纵进程状态在用户空间等。最重要的是,所有I / O都直接通过内核空间(如这里)或间接。
当进程请求I /
O操作时,它会执行系统调用,有时也称为陷阱,将控制权转移到内核中。低级open(),read(),write()和close()函数对C / C ++编程人员如此熟悉,除了设置和执行之外什么都不做适当的系统调用。以这种方式调用内核时,它会采取任何步骤必须找到进程请求的数据并将其传输到指定的数据用户空间中的缓冲区。内核尝试缓存和/或预取数据,因此在内核空间可能已经有缓冲。如果是这样,数据可以直接复制给用户空间。如果数据不可用,则内核则将数据从磁盘中拷贝进入内核空间,然后共享给用户空间。
上图所示可能会让大家觉得拷贝给内核空间是一件多余的事情。为什么不能直接从磁盘拷贝到用户空间呢?这样做有几个问题:
l
硬件是不能直接访问用户空间的。
l
基于块的硬件设备如硬盘控制器通常操作固定大小的数据块。用户进程可能访问奇怪大小的数据块,或没有对齐的数据块。所以需要内核起到中间者的作用,将用户空间和存储设备之间的数据进行再组织。
二、
虚拟内存
1.
介绍
概念上来说,虚拟内存是指存储在磁盘上N个连续的字节大小的单元组成的数组。每个字节都有虚拟地址作为数组的索引。磁盘上数组的内容被缓存在主存中。<