一种基于JVM的磁盘直接I/O访问的方法与流程

文档序号:12786173阅读:144来源:国知局
一种基于JVM的磁盘直接I/O访问的方法与流程

本发明隶属于系统文件输入输出的技术领域,具体涉及一种基于JVM的磁盘直接I/O访问的方法。



背景技术:

一般的文件读写操作,都不可避免得使用到操作系统的文件系统的页面高速缓存(Page Cache)。Page Cache具有几个特点:首先,它是操作系统级别的全局内存空间,在所有应用程序间进行空间共享。由于物理内存有限,因此会出现资源争用情况。其次,页面高速缓存由操作系统统一管理,应用程序不能直接控制和干涉Page Cache。这在实际工作中,会带来如下问题:

第一、操作大文件时带来的系统整体性能下降。当读写大文件时,譬如当执行读、写、复制、移动、压缩大文件的操作时,系统会消耗大量的Page Cache,由于物理内存空间有限,导致系统中运行中的其它应用程序锁使用的Page Cache空间被交换出去(swapped out),以释放出足够的Cache空间供其使用。这样一来,其它程序I/O的响应性能急剧下降,甚至会出现长时间无响应的症状,直到文件操作完毕后,才会恢复正常响应。这对于响应性能要求高的服务器程序来说,是不可接受的。譬如在互联网网站的服务端,由于大文件操作过程中该服务器无法在一定时间范围内完成响应,这意味着用户浏览网站的响应时间变长,甚至超时。

第二、数据一致性问题。Cache的维护成本高,应用程序每次写完文件后,实际上是更新了位于Cache中的文件,磁盘上的文件需要等到flush操作后才会刷到磁盘上。若flush之前系统宕机,则会丢失这部分的数据更新。

第三、对底层硬件的控制力弱。传统的基于JVM的应用程序,都无法直接操纵硬件磁盘。虽然Page Cache能够帮助程序提高I/O效率,但这对自缓存(Self-Caching)程序来说却是个障碍。自缓存程序自身维护一套数据从硬件磁盘到内存间的映射关系,它的缓存一致性维护机制往往是跟自身数据的逻辑结构密切相关,与传统的操作系统Page Cache机制存在着较大差异。但是由于操作系统底层提供的Page Cache机制,横亘在自缓存程序与底层磁盘硬件之间,造成昂贵的内存资源的巨大浪费。

JVM是Java Virtual Machine(Java虚拟机)的缩写,是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。JVM为了保证程序的可移植性,对程序员屏蔽了底层硬件访问细节。程序员只需要编写Java语法的代码,无须关心运行平台的处理器类型和操作系统。由JVM负责解释Java程序,并转换为能够在特定处理器和操作系统上运行的二进制指令。所有的底层硬件访问能力是由JVM提供的,并且JVM封装了一部分接口,通过JDK暴露出API给Java程序员。对于上述磁盘直接IO访问技术,JDK并未提供支持。JDK是Java语言的软件开发工具包,用于移动设备、嵌入式设备上的java应用程序。JDK是整个java开发的核心,它包含了JAVA的运行环境,JAVA工具和JAVA基础的类库。



技术实现要素:

为解决现有技术存在的局限性和不足,本发明的目的是通过利用JVM功能特性,通过配置提供文件操作函数的API层、屏蔽操作系统文件系统访问差异的适配层、支持多种类编程语言转换的语言转换层、执行访问磁盘操作的直接调用I/O层,实现支持任何一种操作语言能跨越操作系统的页面高速缓存,获得直接操纵磁盘文件的能力,从根本上解决因系统宕机而导致的数据丢失问题,也有助于减少对系统全局资源的消耗,利于解决因操作大文件而引发其他程序I/O性能降低的难题。

技术方案如下:一种基于JVM的磁盘直接I/O访问方法,通过利用JVM功能特性,配置提供文件操作函数的API层、屏蔽操作系统文件系统访问差异的适配层、支持多种类编程语言转换的语言转换层、执行访问磁盘操作的直接调用I/O层,实现支持任何一种操作语言能跨越操作系统的页面高速缓存,获得直接操纵磁盘文件的能力;

在物理磁盘之上,基于系统架构层原始的结构,包括API层、适配层、语言转换层和直接调用I/O层,在相应的层结构上构建文件操作接口函数、文件操作指令语言转换接口函数、及直接访问磁盘接口函数;

层结构部署完毕后,写入数据请求,并根据请求内容直接访问磁盘,步骤包括:

步骤1:调用API层的文件打开函数,传入文件操作指令中的文件路径名等参数,返回文件句柄fd;所述文件句柄是指操作系统为每一个文件分配的唯一标识,文件操作指令能通过文件句柄操作文件;在创建文件操作时,通过设置操作系统使用文件直接I/O访问的属性,使操作系统具备文件直接I/O访问能力;

步骤2:调用API层的文件读取函数或文件写入函数,提供传入文件句柄fd、文件偏移量offset、长度len、内存缓冲区buffer的参数;

所述文件偏移量offset是指操作文件中数据的起始位置;

所述长度len是指操作文件中数据的字节数;

所述内存缓冲区buffer:文件读取时,是指用来存放读取数据的内存区域;文件写入时,是指用来存放待写入数据的内存区域;

步骤3:适配层读取当前运行的操作系统的配置信息,并根据配置信息判断该操作系统的类型,进而通过利用JVM的功能特性,调用预存在语言转换层中与操作系统对应的语言转换函数,将文件操作函数转换为当前操作系统能识别的语言,使文件操作指令能在当前操作系统内执行;

特别地,若不能根据当前运行的操作系统,找到相匹配的语言转换函数,则提示“不支持本操作系统”的错误标识;

步骤4:经语言转换层后的文件操作指令直接对磁盘进行操作:通过提前在磁盘区内设置文件操作指令对应的文件指针,并根据文件偏移量offset,将文件指针移动至距离文件开始位置为文件偏移量offset的地方;同时,提前在内存缓冲区中设置文件指针,并根据文件偏移量offset,将文件指针移动至距离文件开始位置为文件偏移量offset的地方;

步骤5:根据文件操作指令的内容,判定文件是读操作还是写操作,并按照文件内容所占字节数读取或写入相应数据量的数据;

若文件操作是读操作,则从磁盘区内文件指针当前位置开始,读取字节数为len的磁盘数据,传至内存缓存区中;

若文件操作是写操作,则从内存缓冲区内文件指针当前位置开始,读取字节数为len的缓冲数据,传至硬盘区中;

步骤6:文件读操作或写操作结束后,调用API层的关闭文件接口函数,传入文件句柄fd,关闭文件。

进一步的,所述API层中构建文件操作指令应用于磁盘直接访问的打开文件接口函数、关闭文件接口函数、读取文件接口函数、写入文件接口函数,提供负责文件的打开、文件的关闭、文件的读和写;接口函数基于JVM语言编写;

所述适配层根据当前运行的操作系统,利用JVM的功能特性,选择适合当前操作系统的语言转换接口函数,使文件操作指令适应于当前操作系统,屏蔽因不同操作系统需要不同操作语言的差异性;

所述语言转换层按照转换后的文件操作语言,提供实现适应于当前操作系统的文件操作函数,用于之后执行具体的磁盘文件直接读写操作;

所述直接调用I/O层按照当前运行的操作系统,提供该操作系统的系统调用,直接访问磁盘。

进一步的,所述API层、适配层、语言转换层及直接调用I/O层,每一个层结构也能是具有相似功能的功能模块。

进一步的,步骤2中所述文件偏移量offset是指文件操作指令操作文件中数据的起始位置;所述长度len是指文件操作指令的操作文件中数据的字节数;所述内存缓冲区buffer:文件读取时,是指用来存放读取数据的内存区域;文件写入时,是指用来存放待写入数据的内存区域。

进一步的,在步骤3中,若不能根据所述当前运行的操作系统,找到相匹配的语言转换函数,则提示“不支持本操作系统”的错误标识。

进一步的,步骤5中,针对所述内存缓冲区的内存地址,应按照操作系统内存分页大小,调整为内存分页大小的整数倍,以保持内存缓冲区与内存分页的对齐。

在步骤5中,针对所述磁盘区读写的字节数,应按照磁盘扇区大小,调整为磁盘扇区大小的整数倍,以保持内存缓冲区与扇区的对齐。

与现有技术相比,有益效果:

(1)本发明利用JVM功能特性,通过配置提供文件操作函数的API层、屏蔽操作系统文件系统访问差异的适配层、支持多种类编程语言转换的语言转换层、执行访问磁盘操作的直接调用I/O层,支持任何一种操作语言能跨越操作系统的页面高速缓存,获得直接操纵磁盘文件的能力,减少对系统全局资源的消耗,有利于解决因操作大文件而引发其他程序I/O性能降低的难题;

(2)本发明中通过直接对磁盘执行写操作,使数据更新不再借助操作系统的页面高速缓存,而是直接持久化入磁盘,从根本上解决因系统宕机而导致的数据丢失问题;

(3)本发明通过配置好的适配层和语言转换层,使包含java在内的基于JVM的编程语言经转换后,均能适用于支持访问操作系统的系统调用,解决因不同操作系统需要不同编程语言而导致重复编程工作;

(4)本发明通过基于系统架构层的原始结构,综合利用JVM功能特性,使构建的文件操作函数能以统一形式的API接口暴露给操作系统,并适应于在不同操作系统内执行磁盘直接I/O访问,实现在各操作系统间的可移植,减少因操作系统差异而导致的人工修改;

附图说明

图1为本发明实施例中基于JVM的磁盘直接I/O访问方法实施结构图

图2为本发明实施例中基于JVM的磁盘直接I/O访问方法实现流程图

图3为本发明实施例中对磁盘直接读写的流程示意图

具体实施方式

为使本发明的目的、技术方案和优点更加清楚明白,下面对本发明实施例中一种基于JVM的磁盘直接I/O访问方法中所涉及的一些术语做简单解释:

所述文件句柄fd是指操作系统为每一个文件分配的唯一标识,文件操作指令能通过文件句柄操作文件;

所述文件偏移量offset是指操作文件中数据的起始位置;

所述长度len是指操作文件中数据的字节数;

所述内存缓冲区buffer:文件读取时,是指用来存放读取数据的内存区域;文件写入时,是指用来存放待写入数据的内存区域。

为了使本发明的目的、技术方案和优点更加清楚,下面结合附图和具体实施例对本发明进行详细描述。

基于系统架构层原始的结构,包括API层、适配层、语言转换层和直接调用I/O层,配置本发明需要的层结构,包括:

(1)API层中构建应用于磁盘直接访问的打开文件接口函数、关闭文件接口函数、读取文件接口函数、写入文件接口函数,提供负责文件的打开、文件的关闭、文件的读和写;接口函数基于JVM语言编写;

(2)适配层负责根据当前运行的操作系统,利用JVM的功能特性,选择适合当前操作系统的语言转换接口函数,使文件操作指令适应于当前操作系统,屏蔽因不同操作系统需要不同操作语言的差异性;

(3)语言转换层按照转换后的文件操作语言,提供实现适应于当前操作系统的文件操作函数,用于之后执行具体的磁盘文件直接读写操作;

(4)直接调用I/O层按照当前运行的操作系统,提供该操作系统的系统调用,直接访问磁盘;

图1为本发明实施例中基于JVM的磁盘直接I/O访问方法实施结构图中,

在物理磁盘之上,基于系统架构层原始的结构,包括API层101、适配层102、语言转换层103和直接调用I/O层104,配置本发明需要的层结构,包括:

所述API层101中以基于JVM的编程语言构建打开文件接口函数open、关闭文件接口函数close、读取文件接口函数read、写入文件接口函数write,提供负责文件的打开、文件的关闭、文件的读和写;

其中,所述基于JVM的编程语言包括Java、Scala、Groovy、Clojure等;

API层101内所有文件操作功能函数接口按照如下全限定名方式定义:

(1)Java_java_dio_DFile_open函数:文件打开接口;

(2)Java_java_dio_DFile_close函数:文件关闭接口;

(3)Java_java_dio_DFile_read函数:文件读接口;

(4)Java_java_dio_DFile_write函数:文件写接口;

所述适配层102负责根据当前运行的操作系统,选取适合当前操作系统的语言转换层函数,使文件操作指令能适应于当前操作系统,屏蔽因不同操作系统需要不同操作语言的差异性;

所述语言转换层103提供基于JVM编程语言的适应于不同操作系统的语言转换接口函数;当文件操作指令转换成能适应于操作系统内执行的语言时,语言转换层按照转换后的文件操作语言,提供文件操作的接口函数,实现具体的文件操作;

如下是经转换后适应于Linux系统的文件操作函数:

(1)Java_java_dio_DFile_imp_{Linux}_open函数:文件打开函数;

(2)Java_java_dio_DFile_imp_{Linux}_close函数:文件关闭函数;

(3)Java_java_dio_DFile_imp_{Linux}_read函数:文件读函数;

(4)Java_java_dio_DFile_imp_{Linux}_write函数:文件写函数;

所述直接调用I/O层104按照当前运行的操作系统,提供该操作系统的系统调用功能,直接访问磁盘;

本发明实施例中的操作系统是Linux系统,经层结构部署完毕后,写入数据请求,并根据请求内容直接访问磁盘,图2为本发明实施例中基于JVM的磁盘直接I/O访问方法实现流程图,具体包括:

步骤201:调用API层101的文件打开函数,传入文件路径名等参数,返回文件句柄fd,获取操作文件的标识;

步骤202:设置Linux系统的文件直接I/O访问属性,启动Linux文件直接I/O访问能力;

步骤203:根据读取文件或写入文件的需要,调用API层101中文件读取函数或文件写入函数,提供传入文件句柄fd、文件偏移量offset、长度len、内存缓冲区buffer的参数;

步骤204:适配层102读取当前运行的操作系统的配置信息,并根据配置信息判断该操作系统的类型,进而利用JNI调用预存在语言转换层中与操作系统对应的语言转换函数,将基于JVM语言编写的文件操作函数转换为当前操作系统能识别的语言,使文件操作指令能在当前操作系统内执行;

步骤205:开辟内存缓冲区,语言转换层103利用经语言转换后的文件操作指令直接对磁盘执行读操作或写操作,如图3所示,具体包括:

步骤205-1:获取操作系统的内存分页大小,并调整开辟的内存缓存区的内存地址为内存分页大小的整数倍,保证内存缓冲区与系统内存的对齐;

步骤205-2:获取物理磁盘扇叶大小,调整每次读、写的字节数为物理磁盘扇叶大小的整数倍,保证读取文件数量与物理磁盘扇区的对齐;

步骤205-3:在物理磁盘区和内存缓存区分别设置文件指针,根据文件偏移量offset,在磁盘区中将文件指针移动至距离文件开始位置为文件偏移量offset的地方,在内存缓存区中将文件指针移动至距离文件开始位置为文件偏移量offset的地方;

步骤205-4:若文件操作是读操作,则从磁盘区内文件指针当前位置开始,读取字节数为len的磁盘数据,传至内存缓存区中;

步骤205-5:若文件操作是写操作,则从内存缓冲区内文件指针当前位置开始,读取字节数为len的缓冲数据,传至硬盘区中;

步骤206:文件读操作或写操作结束后,调用API层的关闭文件接口函数,传入文件句柄fd,关闭文件;

所属领域的普通技术人员应当理解:以上所述仅为本发明的具体实施例而已,并不用于限制本发明,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1