一种操作系统的预取启动方法和装置转让专利

申请号 : CN201210149308.3

文献号 : CN103425502B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 边超朱文焕

申请人 : 腾讯科技(深圳)有限公司

摘要 :

本发明公开了一种操作系统的预取启动方法和装置,包括:预取数据加载模块在接收到启动操作系统的指令时,从磁盘中加载所述操作系统对应的预取数据到内存中,所述预取数据包括所述操作系统的历史启动过程中发生的页面错误对应读取的文件块;之后,代码加载模块加载所述操作系统的代码,以便启动所述操作系统。利用本发明,可以提高操作系统的启动速度。

权利要求 :

1.一种操作系统的预取启动方法,其特征在于,该方法包括:

在接收到启动操作系统的指令时,从磁盘中加载所述操作系统对应的预取数据到内存中,所述预取数据包括所述操作系统的历史启动过程中发生的页面错误对应读取的文件块;

加载所述操作系统的代码,以便启动所述操作系统。

2.根据权利要求1所述的方法,其特征在于,所述从磁盘中加载所述操作系统对应的预取数据到内存中具体为:按照所述操作系统的历史启动过程中发生的页面错误对应读取的文件块的位置顺序,依次从磁盘中加载所述文件块到内存中。

3.根据权利要求1所述的方法,其特征在于,该方法进一步包括:分析所述操作系统的历史启动过程,获取所述历史启动过程中发生的页面错误对应读取的文件块的读取位置;

所述从磁盘中加载所述操作系统对应的预取数据到内存中,具体为:根据所述获取的历史启动过程中发生的页面错误对应读取的文件块的读取位置,从磁盘的对应位置读取文件块加载到内存中。

4.根据权利要求3所述的方法,其特征在于,在获取所述历史启动过程中发生的页面错误对应读取的文件块的读取位置之后,进一步包括:对所获取的相邻文件块的读取位置进行合并,得到合并文件块的读取位置;

所述从磁盘中加载所述操作系统对应的预取数据到内存中,具体为:根据所述合并文件块的读取位置,从磁盘的对应位置读取合并文件块加载到内存中。

5.根据权利要求3所述的方法,其特征在于,所述分析所述操作系统的历史启动过程,获取所述历史启动过程中发生的页面错误对应读取的文件块的读取位置,具体包括:获取所述操作系统的历史启动过程中加载的映像文件列表和发生的页面错误信息;

从所述映像文件列表中提取出指定的映像文件的信息;

根据所述页面错误信息,确定所述指定映像文件对应的所有页面错误;

根据所述页面错误信息,确定所述指定映像文件对应的所有页面错误所引入的I/O在对应映像文件上读取的文件块的位置,作为所述历史启动过程中操作系统对应预取数据的读取位置。

6.根据权利要求5所述的方法,其特征在于,所述获取所述操作系统的历史启动过程中加载的映像文件列表和发生的页面错误信息,具体包括:获取所述操作系统的日志文件;

从所述日志文件中获取指定的两个事件的时间点,将该两个时间点之间的时间段确定为预设启动时间段;

从所述日志文件中获取所述预设启动时间段内进程加载的映像文件列表;

从所述日志文件中获取所述预设启动时间段内进程发生的页面错误信息。

7.根据权利要求5所述的方法,其特征在于,所述根据所述页面错误信息,确定所述指定映像文件对应的所有页面错误,其中针对每一指定的映像文件,具体包括:从所述页面错误信息中提取出页面错误的进程名称、发生时间、以及虚拟地址;

选择符合如下条件的页面错误为该指定映像文件对应的页面错误:该页面错误与该指定映像文件的进程名称相同、且该页面错误的发生时间处于该指定映像文件的存在时间范围内、且该页面错误的虚拟地址在该指定映像文件加载的地址范围内。

8.根据权利要求5所述的方法,其特征在于,所述根据所述页面错误信息,确定所述指定映像文件对应的所有页面错误所引入的I/O在对应映像文件上读取的文件块的位置,其中针对每一页面错误,具体包括:如果该页面错误为硬页面错误,则直接从所述页面错误信息中提取出该硬页面错误所引入的I/O在对应映像文件上的文件偏移量和大小,作为读取的文件块的位置;

如果该页面错误为软页面错误,则从所述页面错误信息中提取出该软页面错误的虚拟地址,从所述映像文件列表中提取出该软页面错误所对应的映像文件的加载基地址,之后用该软页面错误的虚拟地址和该加载基地址进行映射推算,得到该软页面错误所引入的I/O在对应映像文件上的文件偏移量,并给定预设的大小,作为读取的文件块的位置。

9.根据权利要求5、6、7、或8所述的方法,其特征在于,在所述确定所述指定映像文件对应的所有页面错误所引入的I/O在对应映像文件上读取的文件块的位置之后,进一步包括:对同一个映像文件中所对应的两个以上页面错误所引入的I/O对应读取的文件块位置,将其中相邻的文件块位置进行合并。

10.根据权利要求9所述的方法,其特征在于,所述根据映像文件所对应的两个以上页面错误所引入的I/O对应读取的文件块位置,对相邻的文件块位置进行合并的具体方法包括:根据所述映像文件所对应的两个以上页面错误所引入的I/O对应读取的文件块位置,将距离小于预设比特数的文件块位置进行合并。

11.根据权利要求1所述的方法,其特征在于,所述从磁盘中加载所述操作系统对应的预取数据到内存中,具体为:如果当前驱动程序已打开,则使用驱动方式的设备I/O控制从磁盘中加载所述操作系统对应的预取数据到内存中;

如果当前驱动程序未打开,则在应用层从磁盘中加载所述操作系统对应的预取数据到内存中。

12.一种操作系统的预取启动装置,其特征在于,该装置包括:预取数据加载模块,用于在接收到启动操作系统的指令时,从磁盘中加载所述操作系统对应的预取数据到内存中,所述预取数据包括所述操作系统的历史启动过程中发生的页面错误对应读取的文件块;

代码加载模块,用于加载所述操作系统的代码,以便启动所述操作系统。

13.根据权利要求12所述的装置,其特征在于,

所述装置进一步包括:预取数据获取模块,用于分析所述操作系统的历史启动过程,获取所述历史启动过程中发生的页面错误对应读取的文件块的读取位置;

所述预取数据加载模块具体用于根据所述获取的历史启动过程中发生的页面错误对应读取的文件块的读取位置,从磁盘的对应位置读取文件块加载到内存中。

14.根据权利要求13所述的装置,其特征在于,所述预取数据获取模块具体包括:获取单元,获取所述操作系统的历史启动过程中加载的映像文件列表和发生的页面错误信息;

映像文件信息提取单元,用于从所述映像文件列表中提取出指定的映像文件的信息;

页面错误确定单元,用于根据所述页面错误信息,确定所述指定映像文件对应的所有页面错误;

文件块位置确定单元,用于根据所述页面错误信息,确定所述指定映像文件对应的所有页面错误所引入的I/O在对应映像文件上读取的文件块的位置,作为所述历史启动过程中操作系统对应预取数据的读取位置。

15.根据权利要求14所述的装置,其特征在于,所述获取单元包括:日志获取子单元,用于获取所述操作系统的日志文件;

时间段确定子单元,用于从所述日志文件中获取指定的两个事件的时间点,将该两个时间点之间的时间段确定为预设启动时间段;

映像文件列表获取子单元,用于从所述日志文件中获取所述预设启动时间段内进程加载的映像文件列表;

页面错误信息获取子单元,用于从所述日志文件中获取所述预设启动时间段内进程发生的页面错误信息。

16.根据权利要求14或15所述的装置,其特征在于,所述预取数据获取模块进一步包括:文件块位置合并单元,用于对同一个映像文件中所对应的两个以上页面错误所引入的I/O对应读取的文件块位置,将其中相邻的文件块位置进行合并。

说明书 :

一种操作系统的预取启动方法和装置

技术领域

[0001] 本发明涉及计算机领域,尤其涉及一种操作系统的预取启动方法和装置。

背景技术

[0002] 启动时间是操作系统的一个重要的性能参数,很大程度上影响着用户的工作效率。操作系统启动过程中,当执行到某处而其对应的虚拟地址并不在进程的工作集(Working Set)中时,即当前进程访问的虚拟页面没有被映射到有效的物理页面时,就会发生页面错误(Page Fault)。在所发生的页面错误中,如果是由于虚拟页面被映射到内存中其他状态的物理页面,则发生的是软页面错误(Soft Fault),如果是由于虚拟页面被映射到磁盘上的映像文件中,即对应的内容不在物理内存里,需要从映像文件中读取,则发生的是硬页面错误(Hard Fault)。所述映像文件是指:将磁盘上的文件映射到虚拟地址空间,通过访问内存一样访问这些文件,这些被映射的文件称为映像文件,进程启动过程中使用映像文件载入EXE和DLL文件。
[0003] 对于硬页面错误,肯定会引起对磁盘的读写操作(即磁盘I/O操作,简称I/O),而对于软页面错误,则在内存不足时也会引起对磁盘的I/O操作。一般来讲,操作系统启动过程中的磁盘的读写操作(即磁盘I/O)基本上是由页面错误(Page Fault)引入的。
[0004] Page Fault的顺序一般是这样的:从一个文件的某部分中读入一些页面,然后可能从同一文件的相距较远的另一部分中读入一些页面,然后从另一个不同的文件中读入一些页面,可能又要从一个目录中读入页面,然后再从第一个文件中读入一些页面,读取文件不连续,且读取位置也有可能不连续,这种跳跃的读取大大减慢了每一次启动操作系统的速度,如果对应的内容不在物理内存里,就需要从文件中读取,触发Hard Fault,操作系统冷启动时间较长的一个主要原因就是Hard Fault过多。然而Hard Fault是按需进行I/O读取的(一次I/O的大小为16KB或者32KB),即发生一次硬页面错误就引入一次I/O,再考虑到系统其他的I/O,不但I/O次数较多,而且可能造成I/O偏移量在磁盘上的跳跃,从而大大减慢了每一次启动的速度,使得操作系统的启动效率降低,而启动速度是操作系统的最重要性能指标之一,直接影响着用户的工作效率。
[0005] 目前一些操作系统中采用了逻辑预取技术,可以在一定程度上提高操作系统的启动速度。例如,在Widows XP操作系统中,使用预取技术的具体方法是:在系统和应用程序启动时,监视内存页面与交换文件以及硬盘上其它文件的数据交换状况,当发生数据交换时,WINDOWS XP会记录下每一个程序运行时经常需要读取的硬盘文件,并将读取的情况记录在\WINDOWS\Prefetch目录中的pf后缀名文件中。
[0006] 操作系统中一旦建立了这些pf文件,在每次需要启动操作系统或相应程序的时候,WINDOWS会首先中断当前准备载入的程序,而转去查找\WINDOWS\Prefetch目录,看是否有当前载入程序的记录,如果有记录,则马上按照记录的情况载入程序运行过程中可能会用到的所需文件到物理内存中。这项任务完成之后,WINDOWS才继续载入被中断的程序。
[0007] 经过这样的处理之后,在程序运行过程中,需要读取那些文件时,由于文件已经被“预取”到内存中,此时就不用再到硬盘上进行读取,因此减轻了程序载入过程中频繁交换内存页面与交换文件的现象,改善了内存不足时程序运行的响应速度。
[0008] 但是,现有操作系统的预取技术方案所预取的粒度是文件,在启动操作系统时预取的文件过多过大,而实际发生页面错误进行磁盘I/O的数据是按需读取的,并不需要完整的文件数据,其中大量的文件数据为冗余数据,因此这种现有技术不仅浪费空间,而且影响到某些有用的页面被换出到磁盘上,因此其启动速度也比较低,启动时间较长。

发明内容

[0009] 有鉴于此,本发明的主要目的在于提供一种操作系统的预取启动方法和装置,以提高操作系统的启动速度。
[0010] 本发明的技术方案是这样实现的:
[0011] 一种操作系统的预取启动方法,该方法包括:
[0012] 在接收到启动操作系统的指令时,从磁盘中加载所述操作系统对应的预取数据到内存中,所述预取数据包括所述操作系统的历史启动过程中发生的页面错误对应读取的文件块;
[0013] 加载所述操作系统的代码,以便启动所述操作系统。
[0014] 一种操作系统的预取启动装置,该装置包括:
[0015] 预取数据加载模块,用于在接收到启动操作系统的指令时,从磁盘中加载所述操作系统对应的预取数据到内存中,所述预取数据包括所述操作系统的历史启动过程中发生的页面错误对应读取的文件块;
[0016] 代码加载模块,用于加载所述操作系统的代码,以便启动所述操作系统。
[0017] 与现有技术相比,本发明通过在操作系统启动时,预取所述操作系统的历史启动过程中发生的页面错误对应的文件块加载到内存中,再加载操作系统代码,由于预取的粒度是将要发生页面错误对应的文件块,而不是整个文件,因此其预取的粒度更细,预取数据量更小,减小了冗余数据,从而减少了操作系统启动过程中页面错误发生的次数,减轻了操作系统载入过程中频繁交换内存页面与交换文件的现象,提高了操作系统的启动速度和启动效率。

附图说明

[0018] 图1为本发明所述操作系统的预取启动方法的一种流程图;
[0019] 图2是本发明所述方法的一种具体实施例的流程图;
[0020] 图3为一种具体的页面错误信息和对应映像文件信息示意图;
[0021] 图4为用该软页面错误的虚拟地址和该加载基地址进行映射推算,得到该软页面错误所引入的I/O在对应映像文件上的文件偏移量的一种示意图;
[0022] 图5为所述智能I/O合并的一种示意图;
[0023] 图6为一种在启动时预取数据的流程图;
[0024] 图7是现有技术操作系统启动时间与采用本发明实施例的操作系统启动方法的启动时间的对比示意图;
[0025] 图8为本发明所述操作系统的预取启动装置的一种组成示意图;
[0026] 图9为本发明所述预取数据获取模块的一种组成示意图。

具体实施方式

[0027] 下面结合附图及具体实施例对本发明再作进一步详细的说明。
[0028] 图1为本发明所述操作系统的预取启动方法的一种流程图。参见图1,该方法主要包括:
[0029] 步骤101、在接收到启动操作系统的指令时,从磁盘中加载所述操作系统对应的预取数据到内存中,所述预取数据包括所述操作系统的历史启动过程中发生的页面错误对应读取的文件块;
[0030] 步骤102、加载所述操作系统的代码,以便启动所述操作系统。
[0031] 在一种场景中,由于现有技术中导致操作系统启动速度较低的另一个重要因素是页面错误按需进行I/O读取磁盘会引起I/O偏移量在磁盘上的跳跃,从而减慢了启动的速度,因此本发明在一种实施例中,步骤101所述从磁盘中加载所述操作系统对应的预取数据到内存中具体为:按照所述操作系统的历史启动过程中发生的页面错误对应读取的文件块的位置顺序,依次从磁盘中加载所述文件块到内存中。这样顺序加载,可以避免I/O偏移量在磁盘上的跳跃,可以提高操作系统的启动速度。
[0032] 在本发明的一种实施例中,在步骤101之前,还可以进一步包括:分析所述操作系统的历史启动过程,获取所述历史启动过程中发生的页面错误对应读取的文件块的读取位置;并且步骤101中所述从磁盘中加载所述操作系统对应的预取数据到内存中的具体方法为:根据所述获取的历史启动过程中发生的页面错误对应读取的文件块的读取位置,从磁盘的对应位置读取文件块加载到内存中。
[0033] 在另一种场景中,由于现有技术中导致操作系统启动速度较低的又一个重要因素是页面错误按需进行I/O读取磁盘会造成I/O次数过多,因此本发明在又一种实施例中,在所述获取所述历史启动过程中发生的页面错误对应读取的文件块的读取位置之后,进一步对所获取的相邻文件块的读取位置进行合并,得到合并文件块的读取位置;所述从磁盘中加载所述操作系统对应的预取数据到内存中,具体为:根据所述合并文件块的读取位置,从磁盘的对应位置读取合并文件块加载到内存中。这样就可以大大减少预取数据时的I/O次数,进而减少了磁盘的寻道时间,大大提升了操作系统的启动速度。
[0034] 在一种实施例中,所述分析所述操作系统的历史启动过程,获取所述历史启动过程中发生的页面错误对应读取的文件块的读取位置,具体包括如下A1~A4:
[0035] A1、获取所述操作系统的历史启动过程中加载的映像文件列表和发生的页面错误信息。
[0036] A2、从所述映像文件列表中提取出指定的映像文件的信息;所述指定信息可以设置在一个配置文件中,该配置文件可以指定具体的映像文件的名称或标识,通常这些指定的映像文件为经常被页面错误加载的文件。
[0037] A3、根据所述页面错误信息,确定所述指定映像文件对应的所有页面错误;所述某一映像文件对应的页面错误是指:该页面错误所引入的I/O对应加载的是该映像文件。
[0038] A4、根据所述页面错误信息,确定所述指定映像文件对应的所有页面错误所引入的I/O在对应映像文件上读取的文件块的位置,作为所述历史启动过程中操作系统对应预取数据的读取位置。
[0039] 步骤A1中,所述获取所述操作系统的历史启动过程中加载的映像文件列表和发生的页面错误信息,具体包括以下步骤A11至A14:
[0040] A11、获取所述操作系统的日志文件。
[0041] A12、从所述日志文件中获取指定的两个事件的时间点,将该两个时间点之间的时间段确定为预设启动时间段。例如,可以将所述日志文件中从用户界面进程开始时间到显示前景窗口时间之间的时间段确定为预设启动时间段。
[0042] A13、从所述日志文件中获取所述预设启动时间段内进程加载的映像文件列表。
[0043] A14、从所述日志文件中获取所述预设启动时间段内进程发生的页面错误信息。
[0044] 步骤A3中所述确定所述指定映像文件对应的所有页面错误,其中针对每一指定的映像文件,具体包括以下步骤A31和A32:
[0045] A31、从所述页面错误信息中提取出页面错误的进程名称、发生时间、以及虚拟地址。
[0046] A32、选择符合如下条件的页面错误为该指定映像文件对应的页面错误:该页面错误与该指定映像文件的进程名称相同、且该页面错误的发生时间处于该指定映像文件的存在时间范围内、且该页面错误的虚拟地址在该指定映像文件加载的地址范围内。
[0047] 步骤A4中,所述确定所述指定映像文件对应的所有页面错误所引入的I/O在对应映像文件上读取的文件块的位置,其中针对每一页面错误,具体包括以下两种情况:
[0048] (1)如果该页面错误为硬页面错误Hard Fault,则直接从所述页面错误信息中提取出该硬页面错误所引入的I/O在对应映像文件上的文件偏移量和大小,作为读取的文件块的位置;
[0049] (2)如果该页面错误为软页面错误Soft Fault,则从所述页面错误信息中提取出该软页面错误的虚拟地址,从所述映像文件列表中提取出该软页面错误所对应的映像文件的加载基地址,之后用该软页面错误的虚拟地址和该加载基地址进行映射推算,得到该软页面错误所引入的I/O在对应映像文件上的文件偏移量,并给定预设的大小,作为读取的文件块的位置。
[0050] 并在,在上述步骤A4之后,还可以进一步包括:
[0051] 对同一个映像文件中所对应的两个以上页面错误所引入的I/O对应读取的文件块位置,将其中相邻的文件块位置进行合并,作为所述历史启动过程中操作系统对应预取数据的读取位置。所述对相邻的文件块位置进行合并的具体方法包括:根据所述该映像文件所对应的两个以上页面错误所引入的I/O对应读取的文件块位置,将距离小于预设比特数的文件块位置进行合并。
[0052] 图2是本发明所述方法的一种具体实施例的流程图。该实施例的执行主体为终端,该终端可以为PC(Personal Computer,个人电脑)或移动终端,该移动终端可以为智能手机、平板电脑、MP3(Moving Picture Experts Group AudI/O Layer III,动态影像专家压缩标准音频层面3)、PDA(Personal Digital Assistant,个人数字助理)等。所述操作系统为安装在这些终端上的操作系统。参见图2,该实施例具体包括:
[0053] 201、获取操作系统的日志文件。
[0054] 其中,日志文件是包含关于系统消息的文件,不同的日志文件记载不同的信息,例如,有的用于加载默认的系统日志文件,有的仅用于记载安全消息,对于该步骤201来说,获取的该操作系统的日志文件用于记载该操作系统的启动和运行相关信息,该日志文件至少包括该操作系统的启动信息,该启动信息包括操作系统的历史启动过程中发生的Page Fault信息。
[0055] 在WINDOWS操作系统中,该步骤201中获取的日志文件可以基于ETW(Event Tracing for WINDOWS),该ETW是WINDOWS提供的统一的跟踪和记录事件的机制,用户模式操作系统和内核模式驱动程序都可以使用ETW来记录事件。WINDOWS内置了一个内核日志记录器作为ETW提供者,专门用于记录内核和核心驱动程序的事件。用户模式操作系统的如果作为ETW提供者,需要定义操作系统的一系列事件,并且在操作系统代码内加入产生这些自定义事件的代码。
[0056] 本实施例中,获取日志文件的工具采用Xperf。Xperf是一个ETW控制器,它可以启动记录会话,当会话结束时,它将缓冲区的日志数据转储到一个.etl文件。启动内核记录会话可以获取到发生的一系列内核事件,启动用户模式记录会话可以获取到发生的一系列自定义事件。Xperf在启动会话时可以指定要记录哪些内核事件,也可以指定缓冲区的数量范围,以及日志文件的最大限制等等。获取到的日志文件是二进制文件格式的,Xperf提供将文件转为文本文件的能力,Xperf支持符号的解析,Xperf还提供了强大的日志分析功能。
[0057] 在具体实施中,完成一次日志文件的获取步骤如下:
[0058] (1)启动获取会话,即调用Qbtracestart.bat。QbTraceStart.bat用于启动一个内核会话和一个名为qblogger的用户会话:xperf–on,例如具体的代码内容可以为:
[0059] DiagEasy+ALL_FAULTS-stackwalk(内核会话)
[0060] ImageLoad+ImageUnload+VirtualAlloc+VirtualFree+CSwitch+ReadyThrea d+0x0504+0x0503+Profile+DiskReadInit-start qblogger-on(用户会话)
[0061] 1B90E488-8277-45ef-842F-240947FAA6C4+DC55D4D9-138D-441a-80CB-77AEC617E2DB+5322d61a-9efa-4bc3-a3f9-14be95c144f8(会话中定义的GUID码,用于标识会话中的事件)
[0062] (2)启动操作系统,延迟一定的时间等待操作系统启动完成。
[0063] (3)停止会话并保存日志文件。
[0064] (4)关闭操作系统。
[0065] 当然,上述步骤(1)~(4)可以重复执行,以批量获取日志文件,形成更为全面的历史启动分析基础。
[0066] 为了不受系统预取影响,在获取日志文件时,需要关闭操作系统的已有的逻辑预取机制(Prefetch)。本过程获取到的批量日志文件将作为下一个阶段的输入,用于提取页面错误的相关信息。
[0067] 202、从所述日志文件中获取指定的两个事件的时间点,将该两个时间点之间的时间段确定为预设启动时间段。例如,可以将所述日志文件中从用户界面进程开始时间到显示前景窗口时间之间的时间段确定为预设启动时间段。其中,用户界面进程的开始时间可以理解为操作系统的启动时间,而显示前景窗口的时间可以理解为操作系统完成代码加载的时间。在本实施例中,仅以将从用户界面进程开始到显示前景窗口的时间段确定为预设启动时间段为例进行说明,该预设启动时间段还可以缩短到更小的范围内,具体可以由技术人员设置,本发明实施例不做具体限定。
[0068] 所述预设的启动时间段是本实施例要减少的时间,因此,只需要提取发生在这段时间内的Page Fault信息。由于Page Fault引入的I/O最终将对应到磁盘上的物理文件,因此,需要提取进程加载的映像文件列表,将Page Fault信息对应到相应的映射文件中。借助于Xperf工具可以从日志文件中转储出对应的两个事件的时间,具体的转储代码例如:
[0069] xperf-tle–i-o<文本文件>-a dumper–provider{dc55d4d9-138d-441a-80cb-77aec617e2db}。
[0070] 203、从日志文件中获取所述预设启动时间段内进程加载的映像文件列表。借助于Xperf工具的转储出所述预设启动时间段内进程加载的映像文件列表的转储代码例如:xperf-tle–i-o<文本文件>-a process-image-range time1 time2。
[0071] 其中,映像文件列表至少包括所加载文件的起始地址和路径,对于该操作系统来说,该映像文件列表即是由于操作系统启动过程中发生的Page Fault而加载的,因此,获取该映像文件列表,可以获知在操作系统启动过程中发生Page Fault时加载了哪些文件以及这些文件的路径。
[0072] 204、从所述日志文件中获取所述预设启动时间段内进程发生的页面错误信息。借助于Xperf工具的转储出所述预设启动时间段内进程发生的页面错误信息的具体转储代码例如:xperf-tle–i-o<文本文件>-adumper–provide r{3d6fa8d3-fe05-11do-9dda-00c04fd7ba7c}-range time1time2。
[0073] 205、从所述映像文件列表中提取出指定的映像文件的信息;所述指定信息可以设置在一个配置文件中,该配置文件可以指定具体的映像文件的名称或标识,通常这些指定的映像文件为经常被页面错误加载的文件;这些映像文件是系统启动过程中主要用到的文件,它们之中发生的I/O较多,应该对它们之中的I/O进行优化合并。对于一些次要的映像文件,启动过程中使用较少,发生在其中的I/O次数过少,因此采用本实施例的合并没有太大意义。
[0074] 下面两个步骤206和207是要确定所述指定映像文件对应的所有页面错误;所述某一映像文件对应的页面错误是指:该页面错误所引入的I/O对应加载的是该映像文件,即该页面错误发生在该映像文件。
[0075] 206、从所述页面错误信息中提取出页面错误的进程名称、发生时间、以及虚拟地址。该虚拟地址即是操作系统启动过程中进程所访问的虚拟页面的地址,获取预设启动时间段内进程发生的页面错误的虚拟地址可以获知在操作系统启动过程中哪些虚拟地址未被映射到有效的物理地址中。
[0076] 207、选择符合如下条件的页面错误为该指定映像文件对应的页面错误:如图3所示,该页面错误与该指定映像文件的进程名称ProcessName(PID)相同、且该页面错误的发生时间TimeStamp处于该指定映像文件的存在时间范围StartTime和EndTime内、且该页面错误的虚拟地址VirtualAddr在该指定映像文件加载的地址范围BaseAddr和EndAddr之内。
[0077] 需要说明的是,由于每次操作系统启动过程中发生的页面错误并不是完全相同的,因此,需要对多次操作系统的启动过程进行分析,以获取进程加载的映像文件列表和Page Fault信息。本实施例的步骤201-207仅以对单次启动的日志文件进行分析,并获取映像文件列表和Page Fault信息为例进行说明,在实际应用中,可以同时对多个日志文件进行分析,并获取映像文件列表和Page Fault信息,或,对多个日志文件顺序进行分析,并获取映像文件列表和Page Fault信息,对多个日志文件的分析顺序可以有多种,具体可以由技术人员设置,本实施例不做具体限定。
[0078] 208、根据所述页面错误信息,确定所述指定映像文件对应的所有页面错误所引入的I/O在对应映像文件上读取的文件块的位置,作为所述历史启动过程中操作系统对应预取数据的读取位置。其中针对每一页面错误,具体包括以下两种情况:
[0079] (1)如果该页面错误为硬页面错误Hard Fault,则直接从所述页面错误信息中提取出该硬页面错误所引入的I/O在对应映像文件上的文件偏移量和大小,作为读取的文件块的位置;
[0080] (2)如果该页面错误为软页面错误Soft Fault,则从所述页面错误信息中提取出该软页面错误的虚拟地址,从所述映像文件列表中提取出该软页面错误所对应的映像文件的加载基地址,之后用该软页面错误的虚拟地址和该加载基地址进行映射推算,得到该软页面错误所引入的I/O在对应映像文件上的文件偏移量,并给定预设的大小,例如给定的预设大小为一个页面的大小即4kb,作为读取的文件块的位置。如图4所示为用该软页面错误的虚拟地址和该加载基地址进行映射推算,得到该软页面错误所引入的I/O在对应映像文件上的文件偏移量的一种示意图。例如正如本领域技术人员所知的,所述映射推算可以是用该软页面错误的虚拟地址减去该加载基地址并进行一些必要的边缘计算。其中,该相对虚拟地址与文件偏移量是分段线性关系,该分段线性关系由映像文件(PE文件格式)进行设置,本实施例不做赘述。
[0081] 该实施例与现有技术的区别在于,并不直接加载映像文件列表中的整个映像文件,而是将加载的粒度更加细化,仅加载映像文件中的在操作系统启动过程中将会发生页面错误的文件块,以极少量的冗余数据换取I/O效率的大幅提升。
[0082] 209、对同一个映像文件中所对应的两个以上页面错误所引入的I/O对应读取的文件块位置,将其中相邻的文件块位置进行合并,此步骤操作也成为智能I/O合并。
[0083] 图5为所述智能I/O合并的一种示意图。参见图5,对相邻的文件块位置进行智能I/O合并的具体方法包括:根据所述该映像文件所对应的两个以上页面错误所引入的I/O对应读取的文件块位置,将距离小于预设比特数的文件块进行合并。优选地,该预设比特数可以为4KB,即一个页面的大小,也就是说相邻两个文件块的距离小于一个页面大小就可以将该两个文件块进行合并操作,通过对多个文件块的合并操作,得到该操作系统对应的预取数据。该预设比特数还可以有其他的数值,其具体数值可以由技术人员进行设置。例如图5所示将12个I/O块合并为3个I/O块,所述I/O块就是页面错误所引入I/O对应读取的文件块的位置,包括文件块的起始偏移量以及该文件块的大小。
[0084] 对于所有指定的映像文件,都可以按照步骤209的智能I/O合并操作,将其对应的页面错误所引入的I/O读取的文件块位置进行合并。
[0085] 本领域技术人员可以获知,一次磁盘I/O的大小在WINDOWS7上可达到2M,在XP上可达到1M,而一次Hard Fault引入的I/O大小只有16KB或者32KB,因此,在本实施例中,通过将相邻的文件块进行合并操作,一般不会超出操作系统对一次I/O的大小限制,同时还可以大幅度的提高磁盘I/O的效率。
[0086] 表1是操作系统启动过程中一个模块的文件块合并后的示例。
[0087]文件偏移范围 大小(KB) 页面数量 所属的段
[400,1183FF] 6964 1741 .text
[873400,8F03FF] 500 125 .text
[915400,92C3FF] 92 23 .text
[954400,9F73FF] 652 163 .text
[A8AC00,BF6BFF] 1456 364 .rdata
[0088] 表1
[0089] 表1中,文件偏移范围是指合并前文件块的文件偏移范围,大小是指合并后的文件块大小,页面数量是指合并的页面数量,所属的段是该文件所属的段,由表1可以看出,对于各个属于不同段的文件来说,合并后的文件块大小(即是一次磁盘I/O的大小)远大于合并前每次Page Fault时所发生的的磁盘I/O大小(16KB或32KB)。
[0090] 210、当接收到启动操作系统的指令时,从磁盘中加载所述操作系统对应的预取数据到内存中,所述预取数据包括所述操作系统的历史启动过程中发生的页面错误对应读取的文件块。
[0091] 当接收到启动操作系统的指令,在操作系统运行其他代码前加载该操作系统对应的预取数据,然后再执行步骤211,等到操作系统真正访问这些页面时,将不再发生页面错误,尤其是耗费时间的硬页面错误,从而加快了速度。
[0092] 优选地,预取数据可保存在一个DB文件中,其中包括各个指定映像文件的路径和每个映像文件对应的页面错误所引入的I/O读取的文件块位置的列表,即所述I/O块列表。当接收到启动操作系统的指令时,读取该DB文件,以加载该操作系统对应的预取数据。
[0093] 图6为一种在启动时预取数据的流程图。参见图6,对于DB文件的预取,包括:
[0094] 步骤601、从DB文件中取出一个映像文件的所述预取文件块位置的列表,即上一步骤得到的合并I/O块列表;
[0095] 步骤602、判断当前的驱动程序是否打开,如果是,则使用驱动方式的设备I/O控制(Device I/O Control),根据当前映像文件的路径和所述合并I/O块列表所标识的文件块位置,从磁盘读入文件块数据到内存,之后跳到步骤605;如果驱动没有打开,则需要在应用层读取文件数据,对应WINDOWS操作系统,由于操作系统本身的特性,在WINDOWS7及以后的版本上使用异步I/O模式读取数据到内存,在WINDOWS7之前的版本上使用LoadLirary的方式将模块加载至内存,因此需要执行步骤603。
[0096] 步骤603、判断当前操作系统(OS)的版本,如果小于WINDOWS7,则执行步骤604;否则使用异步I/O模式,根据当前映像文件的路径和所述合并I/O块列表所标识的文件块位置,从磁盘读入文件块数据到内存,之后执行步骤605。
[0097] 步骤604、使用LoadLirary模式,根据当前映像文件的路径和所述合并I/O块列表所标识的文件块位置,从磁盘读入文件块数据到内存,并使用VirtualLock锁住相应的虚拟页面。
[0098] 步骤605、判断所述DB文件中是否还有映射文件,如果是,则返回步骤601读取下一个映射文件的预取文件块位置列表并重复上述过程,否则结束本预取数据的过程。
[0099] 211、加载该操作系统的代码,以便启动该操作系统。之后,程序的运行将不再需要从硬盘读入上述预取的数据或页面。
[0100] 本领域技术人员可以获知,该步骤211与现有技术中的加载方法同理,在此不再赘述。
[0101] 优选地,当进行了步骤210-211后,操作系统已经启动,可以通过对本次操作系统启动过程的检测,由于操作系统启动过程中最耗费时间的为发生Hard Fault,则查看操作系统启动过程中发生的Hard Fault数量,如果Hard Fault数量与历史启动过程相比减少或者消失,则说明通过步骤201-210获取的预取数据包含了操作系统所要访问的大部分页面。下表2给出是操作系统启动过程中一个主要模块发生的Hard Fault数量对比。可以看出,采用本发明的技术方案后,发生Hard Fault次数大大减少或消失。
[0102]WINDOWS7上Hard Fault次数 XP上Hard Fault次数
未预取 423 330
预取后 35 0
[0103] 表2
[0104] 图7是现有技术操作系统启动时间与采用本发明实施例的操作系统启动方法的启动时间的对比示意图。由图7可以看出,现有技术操作系统启动时间T2中包括硬页面错误时间和加载操作系统代码时间,采用本发明实施例的操作系统启动方法的启动时间T1包括加载预取数据时间和加载操作系统代码时间,T1远远小于T2,采用本发明实施例的操作系统启动方法的启动时间中不包含硬页面错误时间,大大改善了启动的速度。
[0105] 本实施例提供的方法,通过在操作系统启动时,先加载所述操作系统的历史启动过程中发生的页面错误对应的文件块,再加载操作系统代码,大大减少了操作系统启动过程中页面错误发生的次数,减轻了操作系统载入过程中频繁交换内存页面与交换文件的现象,提高了操作系统的启动速度和启动效率。进一步地,通过将相邻的文件块进行合并操作,可以大幅度的提高磁盘I/O的效率。
[0106] 为了进一步说明本发明的有益效果,下面从现有技术操作系统启动过程和采用本发明实施例的操作系统启动方法的启动过程之间的对比为例进行说明:
[0107] 表3是现有技术操作系统启动过程与采用本发明实施例的操作系统启动方法的启动过程中一个主要模块的磁盘I/O参数的对比。
[0108]磁盘I/O大小(MB) 磁盘I/O次数 磁盘I/O时间(ms)
现有技术 8.46 387 2013
采用本发明方案 12.094 54 207
[0109] 表3
[0110] 通过表3中的参数比较可知,采用本发明方案后,该操作系统主要模块的磁盘I/O耗费时间从2s左右降低到0.2s左右,磁盘I/O的大小从8M增加到12M左右,次数从387降到54次,说明通过对文件块的合并和预取数据,虽然增加了磁盘I/O的大小,但是降低了磁盘I/O次数和时间,从而降低了操作系统启动过程中的总的I/O时间。
[0111] 表4是现有技术操作系统启动时间与采用本发明实施例的操作系统启动方法的启动时间的对比。
[0112]
[0113] 表4
[0114] 其中,为了能够减少干扰,本启动时间是指在不使用其他优化技术的情况下的启动时间。通过表4中的启动时间比较可知,采用本发明方案后,在不同的操作系统,如XP环境或WINDOWS7环境中,采用本发明方案后,操作系统启动所用时间比采用先用技术所用的启动时间减少了50~60%左右。
[0115] 本发明还公开了一种操作系统的预取启动装置,用于执行上述的方法。如图8为所述操作系统的预取启动装置的一种组成示意图。参见图8,该操作系统的预取启动装置800主要包括:
[0116] 预取数据加载模块801,用于在接收到启动操作系统的指令时,从磁盘中加载所述操作系统对应的预取数据到内存中,所述预取数据包括所述操作系统的历史启动过程中发生的页面错误对应读取的文件块;
[0117] 代码加载模块802,用于加载所述操作系统的代码,以便启动所述操作系统。
[0118] 如图8所示,在一种实施例中,该装置800还可以进一步包括预取数据获取模块803,用于分析所述操作系统的历史启动过程,获取所述历史启动过程中发生的页面错误对应读取的文件块的读取位置;所述预取数据加载模块801具体用于根据所述获取的历史启动过程中发生的页面错误对应读取的文件块的读取位置,从磁盘的对应位置读取文件块加载到内存中。
[0119] 图9为所述预取数据获取模块803的一种组成示意图。参见图9,该预取数据获取模块803具体包括:
[0120] 获取单元831,获取所述操作系统的历史启动过程中加载的映像文件列表和发生的页面错误信息;
[0121] 映像文件信息提取单元832,用于从所述映像文件列表中提取出指定的映像文件的信息;
[0122] 页面错误确定单元833,用于根据所述页面错误信息,确定所述指定映像文件对应的所有页面错误;
[0123] 文件块位置确定单元834,用于根据所述页面错误信息,确定所述指定映像文件对应的所有页面错误所引入的I/O在对应映像文件上读取的文件块的位置,作为所述历史启动过程中操作系统对应预取数据的读取位置。
[0124] 其中,所述获取单元831具体包括:
[0125] 日志获取子单元,用于获取所述操作系统的日志文件;
[0126] 时间段确定子单元,用于从所述日志文件中获取指定的两个事件的时间点,将该两个时间点之间的时间段确定为预设启动时间段;
[0127] 映像文件列表获取子单元,用于从所述日志文件中获取所述预设启动时间段内进程加载的映像文件列表;
[0128] 页面错误信息获取子单元,用于从所述日志文件中获取所述预设启动时间段内进程发生的页面错误信息。
[0129] 如图9所示,在有一种实施例中,所述预取数据获取模块803进一步包括:文件块位置合并单元835,用于对同一个映像文件中所对应的两个以上页面错误所引入的I/O对应读取的文件块位置,将其中相邻的文件块位置进行合并。
[0130] 以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明保护的范围之内。