在jdk1.4种,sun引入了一种新I/O,目的是提升速度。实现的机制更接近操作系统操作i/o的机制:缓冲器和通道。旧的I/O 已经之用新的nio包重新实现了。速度的提高在文件I/O和网络I/O都发生。在nio这个包中,我最高兴得是看到的存储器映射文件MappedByteBuffer. 他允许我们创建和修改那些太大而不能读入内存的文件。有了存储器映射文件,我就便可以假设整个文件都放在内存中。 映射文件中所有的输入都必须使用RandomAcessFile。
例如 MappedByteBuffer mbb=new RandomAcessFile("test.dat","rw").getChannel().map(FileChannel.MapMode.READ_WRITE,o,length);
map方法中的length参数指定读取文件的长度。编程思想上说文件可达2G。。(进程的虚拟地址空间最大2G,和这个由关系?希望牛人解答)
其原理,我猜应该是win32的内存映射文件原理相同。
接下来,我们来看看win32系统中内存映射文件(参考了“内存映射文件之剖析”)。
首先,我们先了解wind32种内存空间及映射。WIN32引入了面向进程的独立虚拟地址,这个地址的寻址空间达到了4GB(2^32),当然这个地址是虚拟的。同时,两个进程可以拥有相同地址而不相互冲突。这里先让我们来看看Windows的内存空间(win9X为例)
0x00000000----0x0000FFFF 16K 指针NULL
0x00010000----0x003FFFFF 4M 属于系统保留区域
0x00400000----0x7FFFFFFF 2G-4M 面向进程独立的地址空间
0x80000000----0xBFFFFFFF 1G Win32共享的空间,用来存放存映射文件等
0xC0000000----0xFFFFFFFF 1G 用来存放Vxd等
有上面的列表可知,用户的程序运行在第二个地址范围中,而我们用来讨论的映射文件则放在了第三个地址范围中.而我们调试程序的时候经常有看到某个指针变量的值为多少,这个值就指的是虚拟地址空间中的地址.么Windows是如何将这个虚拟地址空间转化为实际的PC上的RAM的地址呢?这就牵涉到映射的问题,win32实现的是分页存储管理方式,也就是以页(page)为基本单位实现两个地址的对应,分页的大小也由不同的操作系统而不同。windows是4096B,即4KB。
接着,我们来了解虚拟内存。
早在1968年P.Denning就指出,程序在执行时将出现局部性规律。后来在一些高级语言中(例如fortran,pascal,c)的规律中证实。基于这个规律,一个作业在运行之前,没有必要全部装入内存,而仅将当前要运行的那部分页面,先装入内存即可运行。其余部分暂时留在硬盘上。程序在运行时,如果他所要访问的页已调入内存,便可继续执行下去,如果没有,程序利用os提供的请求调页功能,将所需的页装入内存。如果内存已满,无法装在新的页,那么,还需在利用os提供的页置换功能,将内存中暂时不用的页调出到磁盘上,腾出足够的空间后,再将所需的页调入内存。这样,从用户角度来看,系统所具有的内存容量,比实际要大得多,这就是虚拟存储器。Win32提供了硬盘上的页面文件来支持虚拟内存。
Windows提供给我们的对虚拟内存的操作界面是VirtualAlloc和VirtualFree这一组API,这样我们就可以利用虚拟内存的庞大的特性来处理一般程序难以解决的问题.可是虚拟内存也会带来不方便的地方,其页面文件来作为虚拟内存,这样系统必然是先在进程的地址空间保留程序的地址空间,然后提交物理内存,接下来把数据和代码从硬盘上的程序文件拷贝到系统的页面文件,最后加载运行.这样的结果必然是使得加载一个应用程序的时间变的很长。所以系统真正的做法是把程序文件(.exe)直接当作是内存文件而使用,这样就不再从页面文件中分配空间,从而使加载的时间大大减少。这个特性无疑是非常诱人的,居然可以直接拿文件当内存,那不是很方便吗?是的.在系统加载exe文件和dll文件的时候,系统是自动这么处理的。那么如果是一般的数据文件要使用这种特性可以吗?答案是肯定的。这就是内存映射文件。
开始步入正题。在Win32中,内存映射文件函数可以看作是虚拟内存管理函数的姐妹组函数。它与虚存内存管理函数一样,都将直接影响到进程的地址空间和物理内存页面。内存映射文件把文件直接当作内存来使用,它主要的用途是什么呢?主要有以下两点:
1.直接用内存映射文件来访问磁盘上的数据文件,无需再进行文件的I/0操作.
2.用来在多个进程之间共享数据.进程间共享数据有很多种方法。
win32种内存映射文件函数包括:CreateFileMapping,OpenFileMapping,MapViewOfFile,MapViewOfFileEx,UnmapViewOfFile,FlushViewOfFile,CloseHandle。
内存映射文件为Win32的应用编程接口提供了一套独特的管理内存的方法。内存映射文件在操作大文件时也是非常有用的。因为创建内存映射文件消耗很少的物理资源,所以那种巨大的文件可以由进程通过这种方式打开,使得一个应用程序能够将其虚拟地址空间直接映射到磁盘的文件上,而且一旦文件被内存映射后,访问它的内容就只是读取指针的值。
例如 MappedByteBuffer mbb=new RandomAcessFile("test.dat","rw").getChannel().map(FileChannel.MapMode.READ_WRITE,o,length);
map方法中的length参数指定读取文件的长度。编程思想上说文件可达2G。。(进程的虚拟地址空间最大2G,和这个由关系?希望牛人解答)
其原理,我猜应该是win32的内存映射文件原理相同。
接下来,我们来看看win32系统中内存映射文件(参考了“内存映射文件之剖析”)。
首先,我们先了解wind32种内存空间及映射。WIN32引入了面向进程的独立虚拟地址,这个地址的寻址空间达到了4GB(2^32),当然这个地址是虚拟的。同时,两个进程可以拥有相同地址而不相互冲突。这里先让我们来看看Windows的内存空间(win9X为例)
0x00000000----0x0000FFFF 16K 指针NULL
0x00010000----0x003FFFFF 4M 属于系统保留区域
0x00400000----0x7FFFFFFF 2G-4M 面向进程独立的地址空间
0x80000000----0xBFFFFFFF 1G Win32共享的空间,用来存放存映射文件等
0xC0000000----0xFFFFFFFF 1G 用来存放Vxd等
有上面的列表可知,用户的程序运行在第二个地址范围中,而我们用来讨论的映射文件则放在了第三个地址范围中.而我们调试程序的时候经常有看到某个指针变量的值为多少,这个值就指的是虚拟地址空间中的地址.么Windows是如何将这个虚拟地址空间转化为实际的PC上的RAM的地址呢?这就牵涉到映射的问题,win32实现的是分页存储管理方式,也就是以页(page)为基本单位实现两个地址的对应,分页的大小也由不同的操作系统而不同。windows是4096B,即4KB。
接着,我们来了解虚拟内存。
早在1968年P.Denning就指出,程序在执行时将出现局部性规律。后来在一些高级语言中(例如fortran,pascal,c)的规律中证实。基于这个规律,一个作业在运行之前,没有必要全部装入内存,而仅将当前要运行的那部分页面,先装入内存即可运行。其余部分暂时留在硬盘上。程序在运行时,如果他所要访问的页已调入内存,便可继续执行下去,如果没有,程序利用os提供的请求调页功能,将所需的页装入内存。如果内存已满,无法装在新的页,那么,还需在利用os提供的页置换功能,将内存中暂时不用的页调出到磁盘上,腾出足够的空间后,再将所需的页调入内存。这样,从用户角度来看,系统所具有的内存容量,比实际要大得多,这就是虚拟存储器。Win32提供了硬盘上的页面文件来支持虚拟内存。
Windows提供给我们的对虚拟内存的操作界面是VirtualAlloc和VirtualFree这一组API,这样我们就可以利用虚拟内存的庞大的特性来处理一般程序难以解决的问题.可是虚拟内存也会带来不方便的地方,其页面文件来作为虚拟内存,这样系统必然是先在进程的地址空间保留程序的地址空间,然后提交物理内存,接下来把数据和代码从硬盘上的程序文件拷贝到系统的页面文件,最后加载运行.这样的结果必然是使得加载一个应用程序的时间变的很长。所以系统真正的做法是把程序文件(.exe)直接当作是内存文件而使用,这样就不再从页面文件中分配空间,从而使加载的时间大大减少。这个特性无疑是非常诱人的,居然可以直接拿文件当内存,那不是很方便吗?是的.在系统加载exe文件和dll文件的时候,系统是自动这么处理的。那么如果是一般的数据文件要使用这种特性可以吗?答案是肯定的。这就是内存映射文件。
开始步入正题。在Win32中,内存映射文件函数可以看作是虚拟内存管理函数的姐妹组函数。它与虚存内存管理函数一样,都将直接影响到进程的地址空间和物理内存页面。内存映射文件把文件直接当作内存来使用,它主要的用途是什么呢?主要有以下两点:
1.直接用内存映射文件来访问磁盘上的数据文件,无需再进行文件的I/0操作.
2.用来在多个进程之间共享数据.进程间共享数据有很多种方法。
win32种内存映射文件函数包括:CreateFileMapping,OpenFileMapping,MapViewOfFile,MapViewOfFileEx,UnmapViewOfFile,FlushViewOfFile,CloseHandle。
内存映射文件为Win32的应用编程接口提供了一套独特的管理内存的方法。内存映射文件在操作大文件时也是非常有用的。因为创建内存映射文件消耗很少的物理资源,所以那种巨大的文件可以由进程通过这种方式打开,使得一个应用程序能够将其虚拟地址空间直接映射到磁盘的文件上,而且一旦文件被内存映射后,访问它的内容就只是读取指针的值。