CN109471671B - 一种程序冷启动方法和系统 - Google Patents

一种程序冷启动方法和系统 Download PDF

Info

Publication number
CN109471671B
CN109471671B CN201710796974.9A CN201710796974A CN109471671B CN 109471671 B CN109471671 B CN 109471671B CN 201710796974 A CN201710796974 A CN 201710796974A CN 109471671 B CN109471671 B CN 109471671B
Authority
CN
China
Prior art keywords
dll file
target program
size
dll
memory space
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
CN201710796974.9A
Other languages
English (en)
Other versions
CN109471671A (zh
Inventor
黄浩
张文明
陈少杰
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Wuhan Douyu Network Technology Co Ltd
Original Assignee
Wuhan Douyu Network Technology Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Wuhan Douyu Network Technology Co Ltd filed Critical Wuhan Douyu Network Technology Co Ltd
Priority to CN201710796974.9A priority Critical patent/CN109471671B/zh
Publication of CN109471671A publication Critical patent/CN109471671A/zh
Application granted granted Critical
Publication of CN109471671B publication Critical patent/CN109471671B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/44Arrangements for executing specific programs
    • G06F9/445Program loading or initiating
    • G06F9/44505Configuring for program initiating, e.g. using registry, configuration files
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/44Arrangements for executing specific programs
    • G06F9/445Program loading or initiating
    • G06F9/44521Dynamic linking or loading; Link editing at or after load time, e.g. Java class loading
    • YGENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
    • Y02TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
    • Y02DCLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
    • Y02D10/00Energy efficient computing, e.g. low power processors, power management or thermal management

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Abstract

本发明提供一种程序冷启动方法和系统,其中,所述方法包括:S1,为目标程序创建一个预设内存空间;S2,目标程序冷启动前,在目标程序中任一DLL文件中顺序读取预设内存空间大小的数据到预设内存空间中,并将读取到预设内存空间中的数据保存到物理内存中;S3,重复执行步骤S2,直至完成所述任一DLL文件的读取;S4,重复执行步骤S2和S3,直至完成目标程序中所有DLL文件的读取;S5,目标程序冷启动时,加载目标程序中的所有DLL文件。本发明应用顺序读取方式预读取完整的DLL文件,减少了I/O操作次数,提高了I/O操作的执行效率,避免了冷启动时大数据量I/O操作与耗时,提高了程序冷启动速度。

Description

一种程序冷启动方法和系统
技术领域
本发明涉及计算机技术领域,尤其涉及一种程序冷启动方法和系统。
背景技术
随着互联网和计算机技术的不断发展,用于各种用途的目标程序不断涌现。
冷启动是指操作系统启动后目标程序的首次启动,DLL(Dynamic Link Library)文件为动态链接库文件,又称“目标程序拓展”,是软件文件类型。在Windows中,许多目标程序并不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库,即DLL文件,放置于系统中。当某个目标程序执行时,相应的DLL文件就会被调用。
在程序冷启动时,程序所依赖的DLL文件还没有被加载到物理内存当中,所以在调用DLL中函数的时候,需要把DLL文件的硬盘数据加载到物理内存当中。目前,普通的解决方案是调用LoadLibrary函数加载所需的DLL文件,在调用DLL函数的时候,系统自动加载硬盘数据到内存当中。
然而上述解决方案会触发大数据量的I/O操作,I/O操作本身非常耗时;此外每次读取调用函数附近的硬盘数据,不会读取所有DLL的数据,需要经过多次分散读取硬盘数据。
发明内容
本发明为解决现有技术中存在的加载DLL文件时I/O操作耗时长、次数多的问题,提供了一种程序冷启动方法和系统。
一方面,本发明提出一种程序冷启动方法,包括:S1,为目标程序创建一个预设内存空间;S2,所述目标程序冷启动前,在所述目标程序中任一DLL文件中顺序读取预设内存空间大小的数据到所述预设内存空间中,并将所述任一DLL文件中读取到预设内存空间中的数据保存到物理内存中;S3,重复执行步骤S2,直至完成所述任一DLL文件的读取;S4,重复执行步骤S2和S3,直至完成所述目标程序中所有DLL文件的读取;S5,所述目标程序冷启动时,加载所述目标程序中的所有DLL文件。
优选地,所述步骤S1中,所述步骤S1进一步包括:设定所述预设内存空间的大小,为所述预设内存空间分配内存地址;所述预设内存空间大小为m×n,其中m和n为正整数。
优选地,所述步骤S1还包括:调用CreateFile函数打开所述目标程序中各DLL文件,获取所述各DLL文件的句柄。
优选地,所述步骤S5进一步包括:调用LoadLibrary函数从物理内存中加载所述目标程序中的所有DLL文件。
优选地,所述步骤S1进一步包括:通过调用Windows堆函数、CRT堆函数或VirtualAlloc函数为所述预设内存空间分配内存地址;当调用VirtualAlloc函数申请虚拟内存时,指定所述虚拟内存的大小参数dwSize为所述预设内存空间的大小,指定分配类型参数flAllocationType为MEM_COMMIT,指定所述虚拟内存的属性flProtect为PAGE_READWRITE。
优选地,所述步骤S1还包括:基于所述各DLL文件的句柄,调用GetFileSize函数获取所述目标程序中各DLL文件的大小;对应的,所述步骤S3进一步包括:累计已读所述任一DLL文件数据的大小,当所述已读任一DLL文件数据的大小大于等于所述任一DLL文件的大小时,所述任一DLL文件读取完毕;当所述已读任一DLL文件数据的大小小于所述任一DLL文件的大小时,重复执行步骤S2。
优选地,所述步骤S1进一步包括:当调用VirtualAlloc函数申请虚拟内存时,所述虚拟内存的指针保存为buffer变量,所述buffer变量用于将读取所述虚拟内存中的数据自动加载到所述物理内存中。
优选地,所述步骤S2进一步包括:调用ReadFile函数读取所述任一DLL文件数据,所述ReadFile函数中,指定用于接收从所述任一DLL文件中读出数据的缓冲区指针参数IpBuffer为所述buffer变量,指定读取的字节数参数nNumberOfBytesToRead为所述预设内存空间的大小,指向实际读取字节数的指针参数lpNumberOfBytesRead根据所述预设内存空间和所述步骤S2累计读取次数进行调整。
优选地,所述步骤S1还包括:调用CreateFile函数打开所述目标程序中各DLL文件,获取所述各DLL文件的句柄;基于所述各DLL文件的句柄,调用GetFileSize函数获取所述目标程序中各DLL文件的大小;对应的,所述步骤S3进一步包括:累计已读所述任一DLL文件数据的大小,当所述已读任一DLL文件数据的大小大于等于所述任一DLL文件的大小时,所述任一DLL文件读取完毕;当所述已读任一DLL文件数据的大小小于所述任一DLL文件的大小时,重复执行步骤S2;所述步骤S5进一步包括:调用LoadLibrary函数从物理内存中加载所述目标程序中的所有DLL文件。
另一方面,本发明提出一种程序冷启动系统,包括:设置模块,用于为目标程序创建一个预设内存空间;读取模块,用于在所述目标程序冷启动前,在所述目标程序中任一DLL文件中顺序读取预设内存空间大小的数据到所述预设内存空间中,并将所述任一DLL文件中读取到预设内存空间中的数据保存到物理内存中;第一判断模块,用于判断所述任一DLL文件的读取是否完成;第二判断模块,用于判断所述目标程序中所有DLL文件的读取是否完成;加载模块,用于在所述目标程序冷启动时,加载所述目标程序中的所有DLL文件;所述设置模块分别与所述读取模块、所述第一判断模块和所述第二判断模块连接,所述读取模块还分别与所述第一判断模块和所述第二判断模块连接,所述加载模块与所述第二判断模块连接。
本发明提供的一种程序冷启动方法和系统,应用顺序读取方式预读取完整的DLL文件,减少了I/O操作次数,提高了I/O操作的执行效率,避免了程序启动时大数据量I/O操作与耗时,提高了DLL的加载速度和程序冷启动速度。
附图说明
图1为本发明具体实施例的一种程序冷启动方法的流程示意图;
图2为本发明具体实施例的一种程序冷启动系统的结构示意图;
图3为本发明具体实施例的一种程序冷启动设备的结构框图。
具体实施方式
下面结合附图和实施例,对本发明的具体实施方式作进一步详细描述。以下实施例用于说明本发明,但不用来限制本发明的范围。
图1为本发明具体实施例的一种程序冷启动方法的流程示意图,如图1所示,一种程序冷启动方法,包括:S1,为目标程序创建一个预设内存空间;S2,所述目标程序冷启动前,在所述目标程序中任一DLL文件中顺序读取预设内存空间大小的数据到所述预设内存空间中,并将所述任一DLL文件中读取到预设内存空间中的数据保存到物理内存中;S3,重复执行步骤S2,直至完成所述任一DLL文件的读取;S4,重复执行步骤S2和S3,直至完成所述目标程序中所有DLL文件的读取;S5,所述目标程序冷启动时,加载所述目标程序中的所有DLL文件。
具体地,在程序冷启动时,程序所依赖的DLL文件还没有被加载到物理内存当中,所以在调用DLL中函数的时候,就会把DLL文件中被调用函数附件的硬盘数据加载到物理内存当中。然而,常规的冷启动方法会多次触发大数据量的I/O操作,十分耗时。为了解决加载DLL文件时I/O操作耗时长、次数多的问题,本发明具体实施例中,提出了一种程序冷启动方法,如下:
首先,为目标程序创建一个预设内存空间,用于在后续步骤中,执行所述目标程序中DLL文件的预读取操作。
其次,在目标程序冷启动前,对所述目标程序对应的任一DLL文件数据执行预读取操作,在所任一DLL文件中顺序读取预设内存空间大小的数据到所述预设内存空间中,并将所述任一DLL文件中读取到预设内存空间中的数据保存到物理内存中;其中,每次预读取操作读取的DLL文件数据的大小为上述步骤中创建的预设内存空间的大小。该步骤中应用的读取方式为顺序读取,相比常规采用的每次读取调用函数附近的硬盘数据的分散多次读取方式,顺序读取效率更高,且无需硬盘寻道时间。
接着,对读取到内存中的所述任一DLL文件数据进行判断,如果所述任一DLL文件没有完成读取,则返回上一步骤继续顺序读取所述任一DLL文件中的数据,直到完成所述任一DLL文件的读取。
然后,对读取到内存中的所述目标程序中的所有DLL文件进行判断,如果所述目标程序中的所有DLL文件没有全部完成读取,重复执行步骤S2、S3继续顺序读取所述目标程序中尚未被读取的DLL文件,直到完成所述目标程序中所有DLL文件的读取。
最后,当所述目标程序中所有的DLL文件都被完整读取到内存后,在目标程序冷启动时,加载前述步骤中已经保存到物理内存当中的所述目标程序中的所有DLL文件。相比常规技术方案,上述操作无需在程序启动时从硬盘中多次加载DLL文件,避免了大数据量的I/O操作和耗时。
本发明具体实施例中提供的一种程序冷启动方法,应用顺序读取方式预读取完整的DLL文件,减少了I/O操作次数,提高了I/O操作的执行效率,避免了程序冷启动时大数据量I/O操作与耗时,提高了DLL的加载速度和程序冷启动速度。
基于上述具体实施例,一种程序冷启动方法,所述步骤S1进一步包括:设定所述预设内存空间的大小,为所述预设内存空间分配内存地址;所述预设内存空间大小为m×n,其中m和n为正整数。
具体地,步骤S1中提出为目标程序创建预设内存空间,包括设定所述预设内存空间的大小,为所述预设内存空间分配内存地址。其中所述预设内存空间的大小也是系统设置的后续执行预读取操作时,顺序读取过程中每次读取的DLL文件的数据大小。
所述预设内存空间的大小为m×n,其中m和n为正整数,例如在程序中,用step_size表示所述预设内存空间的大小,定义step_size为1024*1024,即所述预设内存空间的大小为1MB。
基于上述任一具体实施例,一种程序冷启动方法,所述步骤S1还包括:调用CreateFile函数打开所述目标程序中各DLL文件,获取所述各DLL文件的句柄。
具体地,所述CreateFile函数是一个多功能的函数,可打开或创建以下对象,并返回可访问的句柄。所述对象包括控制台、通信资源、目录(只读打开)、磁盘驱动器、文件、邮槽和管道。此处,CreateFile函数用于打开所述目标程序中各DLL文件,打开操作执行成功后,CreateFile函数返回所述各DLL文件对应的文件句柄,随后系统对所述各DLL文件的句柄进行保存。
进一步地,CreateFile函数返回的文件句柄是一个整数值,该值唯一标识所述DLL文件。在针对所述DLL文件执行判断长度或者读取操作的过程中,例如GetFileSize函数、ReadFile函数均需使用文件句柄。
本发明具体实施例中调用CreateFile函数打开所述DLL文件,为后续操作的执行提供了文件句柄。
基于上述任一具体实施例,一种程序冷启动方法,所述步骤S4中,调用LoadLibrary函数从物理内存中加载所述目标程序中的所有DLL文件。
具体地,LoadLibrary能够载入指定的DLL,并将它映射到当前进程使用的地址空间。一旦载入,即可访问库内保存的资源。目标程序在执行冷启动操作时,常规的做法是调用LoadLibrary从硬盘中加载DLL文件到内存中,导致在冷启动过程中触发大数据量且非常耗时的I/O操作,影响目标程序冷启动的效率。而本发明具体实施例中,DLL文件已经从硬盘读取并保存到了物理内存中,调用LoadLibrary从物理内存中加载所述目标程序中的所有DLL文件,避免了大数据量的I/O操作和耗时,提高了目标程序的冷启动速度。
基于上述任一具体实施例,一种程序冷启动方法,所述步骤S1进一步包括:通过调用Windows堆函数、CRT堆函数或VirtualAlloc函数为所述预设内存空间分配内存地址;当调用VirtualAlloc函数申请虚拟内存时,指定所述虚拟内存的大小参数dwSize为所述预设内存空间的大小,指定分配类型参数flAllocationType为MEM_COMMIT,指定所述虚拟内存的属性flProtect为PAGE_READWRITE。
具体地,所述步骤S1进一步包括,可以通过调用Windows堆函数、CRT堆函数或VirtualAlloc函数实现为所述预设内存空间分配内存地址。例如,在Visual C++中,可以通过使用new进行一般内存的分配。
VirtualAlloc函数是一个Windows API函数,该函数的功能是在调用进程的虚地址空间,预定或者提交一部分页,可用于预定指定地址和大小的虚拟内存空间。所述VirtualAlloc函数声明如下:
LPVOID VirtualAlloc{
LPVOID lpAddress,//要分配的内存区域的地址
DWORD dwSize,//分配的大小
DWORD flAllocationType,//分配的类型
DWORD flProtect//该内存的初始保护属性
};
指定所述虚拟内存的大小参数dwSize为所述预设内存空间的大小,例如用step_size表示所述预设内存空间的大小,定义step_size为1024*1024,并指定参数dwSize为step_size,则VirtualAlloc函数申请的虚拟内存大小为step_size。
指定分配类型参数flAllocationType为MEM_COMMIT,即设置分配类型为占用。
指定所述虚拟内存的属性flProtect为PAGE_READWRITE,即设置VirtualAlloc函数申请的虚拟内存可执行读写操作。
进一步地,调用VirtualAlloc函数申请虚拟内存后,返回所述虚拟内存的指针,并保存为buffer变量,读取到所述buffer变量指向的所述虚拟内存中的数据自动加载到物理内存中。
本发明具体实施例中提供了内存申请函数,尤其是VirtualAlloc函数的应用方法,为内存的申请提供了技术方案。
基于上述任一具体实施例,一种程序冷启动方法,所述步骤S1还包括:基于所述各DLL文件的句柄,调用GetFileSize函数获取所述目标程序中各DLL文件的大小;对应的,所述步骤S3进一步包括:累计已读所述任一DLL文件数据的大小,当所述已读任一DLL文件数据的大小大于等于所述任一DLL文件的大小时,所述任一DLL文件读取完毕;当所述已读任一DLL文件数据的大小小于所述任一DLL文件的大小时,重复执行步骤S2。
具体地,获取所述目标程序中各DLL文件的大小,是在预读取操作中判断任一DLL文件是否读取完毕的依据。而GetFileSize函数通常用于判断文件的长度,函数调用成功则返回文件大小。基于所述各DLL文件的句柄,通过调用GetFileSize函数可以获悉DLL文件的大小,为后续预读取完整的DLL文件作参考。
进一步地,获取所述目标程序中各DLL文件的大小后,在步骤S2执行预读取操作后,对已读数据进行累加,获取已读所述任一DLL文件数据的大小,并与所述任一DLL文件的大小进行比较:
如果所述已读任一DLL文件数据的大小大于等于所述任一DLL文件的大小时,说明完整的所述任一DLL文件已经读取到内存中,预读取操作完成,在目标程序冷启动过程中,系统仅需从内存中加载所述任一DLL文件。
如果所述已读任一DLL文件数据小于所述任一DLL文件的大小时,说明所述任一DLL文件尚未完全读取到内存中,仍需重复步骤S2继续执行预读取操作。
本发明具体实施例中,提出了DLL文件大小的获取方案和判断方法,为后续判断已读取DLL文件的完整性提供了技术方案。
基于上述任一具体实施例,一种程序冷启动方法,所述步骤S2进一步包括:调用ReadFile函数读取所述任一DLL文件数据,所述ReadFile函数中,指定用于接收从所述任一DLL文件中读出数据的缓冲区指针参数IpBuffer为所述buffer变量,指定读取的字节数参数nNumberOfBytesToRead为所述预设内存空间的大小,指向实际读取字节数的指针参数lpNumberOfBytesRead根据所述预设内存空间的大小和所述步骤S2累计读取次数进行调整。
具体地,所述步骤S2中,调用ReadFile函数顺序读取所述任一DLL文件中的数据,其中,ReadFile函数从文件指针指定的位置读取数据。读操作完成后,文件指针将根据实际读出的数据自动进行调整,其函数声明如下:
BOOL ReadFile(
HANDLE hFile,//文件句柄
LPVOID lpBuffer,//用来接收从文件中读出的数据的缓冲区指针
DWORD nNumberOfBytesToRead,//要读入的字节数
LPDWORD lpNumberOfBytesRead,//指向实际读取字节数的指针
LPOVERLAPPED lpOverlapped);
指定用于接收从所述DLL文件中读出数据的缓冲区指针参数IpBuffer为所述buffer变量,本发明具体实施例中,所述buffer变量为系统调用VirtualAlloc函数申请虚拟内存并返回的指针。
指定读取的字节数参数nNumberOfBytesToRead为所述预设内存空间的大小,例如用step_size表示所述预设内存空间的大小,定义step_size为1024*1024,并指定参数nNumberOfBytesToRead为step_size,则ReadFile函数单次执行读取的字节数为step_size。
参数lpNumberOfBytesRead是一个变量指针,用来存储数据传输的字节总数,所述字节总数根据所述预设内存空间的大小和所述步骤S2累计读取次数进行调整。
本发明具体实施例中提出了基于预设内存空间顺序预读取DLL文件数据的技术方案,顺序读取的方式,提高了读取效率,避免了硬盘寻道时间,提高了I/O操作的执行效率。
基于上述任一具体实施例,一种程序冷启动方法,所述步骤S1中,所述步骤S1还包括:调用CreateFile函数打开所述目标程序中各DLL文件,获取所述各DLL文件的句柄;基于所述各DLL文件的句柄,调用GetFileSize函数获取所述目标程序中各DLL文件的大小;对应的,所述步骤S3进一步包括:累计已读所述任一DLL文件数据的大小,当所述已读任一DLL文件数据的大小大于等于所述任一DLL文件的大小时,所述任一DLL文件读取完毕;当所述已读任一DLL文件数据的大小小于所述任一DLL文件的大小时,重复执行步骤S2;所述步骤S5进一步包括:调用LoadLibrary函数从物理内存中加载所述目标程序中的所有DLL文件。
具体地,首先调用CreateFile函数打开所述目标程序中的各DLL文件,打开操作执行成功后,CreateFile函数返回所述目标程序中的各DLL文件对应的文件句柄,系统对所述各DLL文件的句柄进行保存。
其次,为目标程序创建预设内存空间,包括设定所述预设内存空间的大小,为所述预设内存空间分配内存地址。其中所述预设内存空间的大小也是系统设置的后续执行预读取操作时,顺序读取过程中每次读取的DLL文件的数据大小;通过调用Windows堆函数、CRT堆函数或VirtualAlloc函数实现为所述预设内存空间分配内存地址。
进一步地,调用VirtualAlloc函数申请虚拟内存后,返回所述虚拟内存的指针,并保存为buffer变量,读取到所述buffer变量指向的所述虚拟内存中的数据自动加载到物理内存中。
与此同时,基于所述目标程序中各DLL文件的句柄,通过调用GetFileSize函数可以获取各DLL文件的大小,为后续预读取完整的DLL文件作参考。
然后,调用ReadFile函数在所述任一DLL文件中顺序读取数据到所述预设内存空间中,并指定读取的字节数参数nNumberOfBytesToRead为所述预设内存空间的大小,并将读取的数据保存到物理内存中。
在上述执行预读取操作后,对已读数据进行累加,获取已读所述任一DLL文件数据的大小,并与所述任一DLL文件的大小进行比较:如果所述已读任一DLL文件数据的大小大于等于所述任一DLL文件的大小时,说明完整的所述任一DLL文件已经读取到内存中,预读取操作完成,在目标程序冷启动过程中,系统仅需从内存中加载所述任一DLL文件。如果所述已读任一DLL文件数据小于所述任一DLL文件的大小时,说明所述任一DLL文件尚未完全读取到内存中,仍需重复上一步骤继续执行预读取操作。
随后,对已经完整加载到物理内存的所述目标程序中的DLL文件进行判断,如果所述目标程序中的所有DLL文件没有全部完成读取,继续顺序读取所述目标程序中尚未被读取的DLL文件,直到完成所述目标程序中所有DLL文件的读取。
最后,当所述目标程序中所有的DLL文件都被完整读取到内存后,在目标程序冷启动时,加载前述步骤中已经保存到物理内存当中的所述目标程序中的所有DLL文件。
本发明具体实施例中提供的一种程序冷启动方法,应用顺序读取方式预读取完整的DLL文件,减少了I/O操作次数,提高了I/O操作的执行效率,避免了程序冷启动时大数据量I/O操作与耗时,提高了DLL的加载速度和程序冷启动速度。
为了更好地理解与应用本发明提出的一种程序冷启动,本发明进行以下示例,且本发明不仅局限于以下示例。
首先,调用CreateFile打开DLL文件,保存文件句柄handle。
其次,定义step_size为1024*1024,用来指定每次读取DLL文件的内存空间大小;
接着,调用VirtualAlloc申请step_size大小的内存,返回的内存指针用buffer变量保存,该接口主要的两个作用是:在调用进程的内存地址空间中申请一块内存;为该内存地址空间提交物理内存页,即读取到该buffer内存中的数据会自动加载到物理内存页当中。
然后,调用GetFileSize获取DLL文件的大小,保存在total_read;
接着,准备读取上文中打开的DLL文件,分为3个循环步骤:
1)调用ReadFile读取step_size大小的文件内容到buffer内存地址空间中;
2)累计每次已经读取的数据大小,保存在current_size变量中;
3)判断是否读取完毕(current_size>=total_read),如果没有则返回第一步继续读取,直到读取完所有DLL文件数据。
采用这种方式的优点是:由于硬盘顺序读取的效率很高,不需要硬盘寻道时间,能够提高I/O操作的执行效率;此外,预读取DLL文件到内存当中,根据时间局部性原理,硬盘数据到物理内存的映射会保留一段时间。因此在程序真正启动过程中,就不会再读取DLL文件的硬盘数据,从而避免了大数据量的I/O操作;
最后,调用LoadLibrary加载DLL文件,因为此时DLL文件已经从硬盘映射到了物理内存当中,所以操作系统不再从硬盘加载DLL文件。从而避免了大数据量的I/O操作与耗时,达到提高程序冷启动速度。
基于上述任一具体实施例,图2为本发明具体实施例的一种程序冷启动系统的结构示意图,如图2所示,一种程序冷启动系统包括:设置模块201、读取模块202、第一判断模块203、第二判断模块204和加载模块205。其中,所述设置模块201,用于为目标程序创建一个预设内存空间;所述读取模块202,用于在所述目标程序冷启动前,在所述目标程序中任一DLL文件中顺序读取预设内存空间大小的数据到所述预设内存空间中,并将所述任一DLL文件中读取到预设内存空间中的数据保存到物理内存中;所述第一判断模块203,用于判断所述任一DLL文件的读取是否完成;所述第二判断模块204,用于判断所述目标程序中所有DLL文件的读取是否完成;所述加载模块205,用于在所述目标程序冷启动时,加载所述目标程序中的所有DLL文件;所述设置模块201分别与所述读取模块202、所述第一判断模块203和所述第二判断模块204连接,所述读取模块202还分别与所述第一判断模块203和所述第二判断模块204连接,所述加载模块205与所述第二判断模块204连接。
具体地,首先,所述设置模块201为目标程序创建一个预设内存空间。
其次,所述读取模块202在所述目标程序冷启动前,在所述目标程序中任一DLL文件中顺序读取数据到所述设置模块201创建的预设内存空间中,并将所述任一DLL文件中读取到预设内存空间中的数据保存到物理内存中。所述读取模块202每次顺序读取所述预设内存空间大小的所述任一DLL文件数据。
接着,所述读取模块202执行顺序读取后,第一判断模块203对所述任一DLL文件是否读取完毕进行判断,如果所述任一DLL文件没有完成读取,则第一判断模块203向读取模块202发送再次读取的命令。如果所述任一DLL文件读取完成,则第一判断模块203向第二判断模块204发送所述任一DLL文件读取完成的信息。
然后,第二判断模块204接收到所述任一DLL文件读取完成的信息后,对所述目标程序中所有DLL文件的读取是否完成进行判断,如果所述目标程序中的所有DLL文件没有全部完成读取,则第二判断模块204向读取模块202发送指令,继续读取所述目标程序中尚未被读取的DLL文件。如果所述目标程序中的所有DLL文件已经全部完成读取,则所述第二判断模块204向所述加载模块205发送信息。
加载模块205接收到第二判断模块204发送的全部DLL文件读取完成的信息后,在目标程序冷启动时,加载已经映射到物理内存当中的所述目标程序中的全部DLL文件。
本发明具体实施例中提供的一种程序冷启动装置,应用顺序读取方式预读取完整的DLL文件,减少了I/O操作次数,提高了I/O操作的执行效率,避免了程序冷启动时大数据量I/O操作与耗时,提高了DLL的加载速度和程序冷启动速度。
图3示出本发明具体实施例的一种程序冷启动设备的结构框图。参照图3,所述一种程序冷启动设备,包括:处理器(processor)301、存储器(memory)302和总线303;
其中,所述处理器301和存储器302通过所述总线303完成相互间的通信;
所述处理器301用于调用所述存储器302中的程序指令,以执行上述各方法实施例所提供的方法,例如包括:为目标程序创建一个预设内存空间;所述目标程序冷启动前,在所述目标程序中任一DLL文件中顺序读取预设内存空间大小的数据到所述预设内存空间中,并将所述任一DLL文件中读取到预设内存空间中的数据保存到物理内存中;重复执行顺序读取,直至完成所述任一DLL文件的读取;重复执行顺序读取,直至完成所述目标程序中所有DLL文件的读取;所述目标程序冷启动时,加载所述目标程序中的所有DLL文件。
本发明具体实施例公开一种计算机程序产品,所述计算机程序产品包括存储在非暂态计算机可读存储介质上的计算机程序,所述计算机程序包括程序指令,当所述程序指令被计算机执行时,计算机能够执行上述各方法实施例所提供的方法,例如包括:为目标程序创建一个预设内存空间;所述目标程序冷启动前,在所述目标程序中任一DLL文件中顺序读取预设内存空间大小的数据到所述预设内存空间中,并将所述任一DLL文件中读取到预设内存空间中的数据保存到物理内存中;重复执行顺序读取,直至完成所述任一DLL文件的读取;重复执行顺序读取,直至完成所述目标程序中所有DLL文件的读取;所述目标程序冷启动时,加载所述目标程序中的所有DLL文件。
本实施例提供一种非暂态计算机可读存储介质,所述非暂态计算机可读存储介质存储计算机指令,所述计算机指令使所述计算机执行上述各方法实施例所提供的方法,例如包括:为目标程序创建一个预设内存空间;所述目标程序冷启动前,在所述目标程序中任一DLL文件中顺序读取预设内存空间大小的数据到所述预设内存空间中,并将所述任一DLL文件中读取到预设内存空间中的数据保存到物理内存中;重复执行顺序读取,直至完成所述任一DLL文件的读取;重复执行顺序读取,直至完成所述目标程序中所有DLL文件的读取;所述目标程序冷启动时,加载所述目标程序中的所有DLL文件。
本领域普通技术人员可以理解:实现上述方法实施例的全部或部分步骤可以通过程序指令相关的硬件来完成,前述的程序可以存储于一计算机可读取存储介质中,该程序在执行时,执行包括上述方法实施例的步骤;而前述的存储介质包括:ROM、RAM、磁碟或者光盘等各种可以存储程序代码的介质。
以上所描述的大批量业务数据导出方法的设备等实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。本领域普通技术人员在不付出创造性的劳动的情况下,即可以理解并实施。
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到各实施方式可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件。基于这样的理解,上述技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在计算机可读存储介质中,如ROM/RAM、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行各个实施例或者实施例的某些部分所述的方法。
最后,本申请的方法仅为较佳的实施方案,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

Claims (10)

1.一种程序冷启动方法,其特征在于,包括:
S1,为目标程序创建一个预设内存空间;所述预设内存空间为虚拟内存空间;
S2,所述目标程序冷启动前,在所述目标程序中任一DLL文件中顺序读取预设内存空间大小的数据到所述预设内存空间中,并将所述任一DLL文件中读取到预设内存空间中的数据保存到物理内存中;
S3,重复执行步骤S2,直至完成所述任一DLL文件的读取;
S4,重复执行步骤S2和S3,直至以顺序读取的方式完成所述目标程序中所有DLL文件的读取;
S5,所述目标程序冷启动时,加载所述目标程序中的所有DLL文件。
2.根据权利要求1所述的方法,其特征在于,所述步骤S1进一步包括:设定所述预设内存空间的大小,为所述预设内存空间分配内存地址;所述预设内存空间大小为m×n,其中m和n为正整数。
3.根据权利要求1所述的方法,其特征在于,所述步骤S1还包括:调用CreateFile函数打开所述目标程序中各DLL文件,获取所述各DLL文件的句柄。
4.根据权利要求1所述的方法,其特征在于,所述步骤S5进一步包括:调用LoadLibrary函数从物理内存中加载所述目标程序中的所有DLL文件。
5.根据权利要求2所述的方法,其特征在于,所述步骤S1进一步包括:通过调用Windows堆函数、CRT堆函数或VirtualAlloc函数为所述预设内存空间分配内存地址;
当调用VirtualAlloc函数申请虚拟内存时,指定所述虚拟内存的大小参数dwSize为所述预设内存空间的大小,指定分配类型参数flAllocationType为MEM_COMMIT,指定所述虚拟内存的属性flProtect为PAGE_READWRITE。
6.根据权利要求3所述的方法,其特征在于,所述步骤S1还包括:基于所述各DLL文件的句柄,调用GetFileSize函数获取所述目标程序中各DLL文件的大小;
对应的,所述步骤S3进一步包括:累计已读所述任一DLL文件数据的大小,当所述已读任一DLL文件数据的大小大于等于所述任一DLL文件的大小时,所述任一DLL文件读取完毕;当所述已读任一DLL文件数据的大小小于所述任一DLL文件的大小时,重复执行步骤S2。
7.根据权利要求5所述的方法,其特征在于,所述步骤S1进一步包括:当调用VirtualAlloc函数申请虚拟内存时,所述虚拟内存的指针保存为buffer变量,所述buffer变量用于将读取所述虚拟内存中的数据自动加载到所述物理内存中。
8.根据权利要求7所述的方法,其特征在于,所述步骤S2进一步包括:调用ReadFile函数读取所述任一DLL文件数据,所述ReadFile函数中,指定用于接收从所述任一DLL文件中读出数据的缓冲区指针参数IpBuffer为所述buffer变量,指定读取的字节数参数nNumberOfBytesToRead为所述预设内存空间的大小,指向实际读取字节数的指针参数lpNumberOfBytesRead根据所述预设内存空间的大小和所述步骤S2累计读取次数进行调整。
9.根据权利要求8所述的方法,其特征在于,
所述步骤S1还包括:调用CreateFile函数打开所述目标程序中各DLL文件,获取所述各DLL文件的句柄;基于所述各DLL文件的句柄,调用GetFileSize函数获取所述目标程序中各DLL文件的大小;
对应的,所述步骤S3进一步包括:累计已读所述任一DLL文件数据的大小,当所述已读DLL文件数据的大小大于等于所述任一DLL文件的大小时,所述DLL文件读取完毕;当所述已读DLL文件数据的大小小于所述任一DLL文件的大小时,重复执行步骤S2;
所述步骤S5进一步包括:调用LoadLibrary函数从物理内存中加载所述目标程序中的所有DLL文件。
10.一种程序冷启动系统,其特征在于,包括:
设置模块,用于为目标程序创建一个预设内存空间;所述预设内存空间为虚拟内存空间;
读取模块,用于在所述目标程序冷启动前,在所述目标程序中任一DLL文件中顺序读取预设内存空间大小的数据到所述预设内存空间中,并将所述任一DLL文件中读取到预设内存空间中的数据保存到物理内存中;
第一判断模块,用于判断所述任一DLL文件的读取是否完成;
第二判断模块,用于判断所述目标程序中所有DLL文件的读取是否完成;
加载模块,用于在所述目标程序冷启动时,以顺序读取的方式加载所述目标程序中的所有DLL文件;
所述设置模块分别与所述读取模块、所述第一判断模块和所述第二判断模块连接,所述读取模块还分别与所述第一判断模块和所述第二判断模块连接,所述加载模块与所述第二判断模块连接。
CN201710796974.9A 2017-09-06 2017-09-06 一种程序冷启动方法和系统 Active CN109471671B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201710796974.9A CN109471671B (zh) 2017-09-06 2017-09-06 一种程序冷启动方法和系统

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201710796974.9A CN109471671B (zh) 2017-09-06 2017-09-06 一种程序冷启动方法和系统

Publications (2)

Publication Number Publication Date
CN109471671A CN109471671A (zh) 2019-03-15
CN109471671B true CN109471671B (zh) 2023-03-24

Family

ID=65658262

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201710796974.9A Active CN109471671B (zh) 2017-09-06 2017-09-06 一种程序冷启动方法和系统

Country Status (1)

Country Link
CN (1) CN109471671B (zh)

Families Citing this family (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN111078642B (zh) * 2019-12-16 2022-08-26 瑞芯微电子股份有限公司 一种分布式快速加载文件的方法和装置
CN113791988B (zh) * 2021-11-17 2022-02-18 畅捷通信息技术股份有限公司 一种降低小程序包体积的渲染方法、装置及存储介质
CN114237903B (zh) * 2021-12-22 2024-03-22 上海壁仞智能科技有限公司 内存分配优化方法、装置、电子设备、介质及程序产品
CN115858047A (zh) * 2023-02-28 2023-03-28 荣耀终端有限公司 一种预加载文件页的方法、电子设备及芯片系统

Citations (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
EP1508855A2 (en) * 2003-08-20 2005-02-23 Katana Technology, Inc. Method and apparatus for providing virtual computing services
US7441254B1 (en) * 1997-07-09 2008-10-21 International Business Machines Corporation Simulation of memory-mapped I/O
CN103631648A (zh) * 2012-08-20 2014-03-12 华为技术有限公司 一种任务处理方法及系统
CN103914318A (zh) * 2013-01-04 2014-07-09 腾讯科技(深圳)有限公司 程序启动的方法和装置
US8806096B1 (en) * 2007-04-20 2014-08-12 Netapp, Inc. Increased concurrency of an initialization process of multiple data storage units of a volume
CN104111897A (zh) * 2013-04-16 2014-10-22 华为技术有限公司 一种数据处理方法、装置及计算机系统
CN104636077A (zh) * 2013-11-15 2015-05-20 中国电信股份有限公司 用于虚拟机的网络块设备存储系统与方法

Family Cites Families (30)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7120753B2 (en) * 2004-04-20 2006-10-10 International Business Machines Corporation System and method for dynamically adjusting read ahead values based upon memory usage
CN100428209C (zh) * 2006-12-22 2008-10-22 清华大学 一种自适应的外部存储设备io性能优化方法
US8555081B2 (en) * 2007-10-30 2013-10-08 Vmware, Inc. Cryptographic multi-shadowing with integrity verification
CN101382948A (zh) * 2008-10-14 2009-03-11 成都市华为赛门铁克科技有限公司 一种文件存储方法、装置和系统
CN101393591B (zh) * 2008-10-27 2010-10-27 中国科学院计算技术研究所 一种发现未知usb病毒的方法及系统
CN101814038B (zh) * 2010-03-23 2012-10-03 杭州顺网科技股份有限公司 一种加快计算机启动速度的方法
CN101908119B (zh) * 2010-08-12 2012-10-03 浙江中控软件技术有限公司 一种动态链接库dll文件的处理方法和装置
CN102004773A (zh) * 2010-11-15 2011-04-06 青岛普加智能信息有限公司 数据读写处理方法及web应用服务器
CN102841865B (zh) * 2011-06-24 2016-02-10 上海芯豪微电子有限公司 高性能缓存系统和方法
CN102508638B (zh) * 2011-09-27 2014-09-17 华为技术有限公司 用于非一致性内存访问的数据预取方法和装置
CN102385622B (zh) * 2011-10-25 2013-03-13 曙光信息产业(北京)有限公司 一种文件系统stride访问模式的预读方法
US9104606B2 (en) * 2011-11-22 2015-08-11 Landy Wang Temporal standby list
US8959494B2 (en) * 2012-03-20 2015-02-17 Massively Parallel Technologies Inc. Parallelism from functional decomposition
US8762946B2 (en) * 2012-03-20 2014-06-24 Massively Parallel Technologies, Inc. Method for automatic extraction of designs from standard source code
CN103425502B (zh) * 2012-05-15 2015-09-16 腾讯科技(深圳)有限公司 一种操作系统的预取启动方法和装置
CN103577158B (zh) * 2012-07-18 2017-03-01 阿里巴巴集团控股有限公司 数据处理方法与装置
US20140122796A1 (en) * 2012-10-31 2014-05-01 Netapp, Inc. Systems and methods for tracking a sequential data stream stored in non-sequential storage blocks
EP2843570B1 (en) * 2013-06-21 2018-11-28 Huawei Technologies Co., Ltd. File reading method, storage device and reading system
CN103593147B (zh) * 2013-11-07 2016-08-17 华为技术有限公司 一种数据读取的方法及装置
CN103677922B (zh) * 2013-12-13 2018-01-09 北京奇虎科技有限公司 对应用软件进行启动的方法和装置
CN103885776A (zh) * 2014-03-24 2014-06-25 广州华多网络科技有限公司 程序加速方法及其装置
US9772959B2 (en) * 2014-05-30 2017-09-26 Apple Inc. I/O scheduling
CN104199684B (zh) * 2014-08-13 2018-01-12 百度在线网络技术(北京)有限公司 浏览器冷启动的实现方法及装置
CN104598166B (zh) * 2014-12-31 2018-01-30 曙光信息产业股份有限公司 系统管理方法和装置
US9535843B2 (en) * 2015-02-17 2017-01-03 Linkedin Corporation Managed memory cache with application-layer prefetching
CN105426127A (zh) * 2015-11-13 2016-03-23 浪潮(北京)电子信息产业有限公司 一种分布式集群系统的文件存储方法及装置
CN106991058B (zh) * 2016-01-21 2020-06-26 腾讯科技(深圳)有限公司 预取文件处理方法及装置
CN105955762A (zh) * 2016-04-19 2016-09-21 北京金山安全软件有限公司 一种注入动态链接库文件的方法、装置及电子设备
CN106648749B (zh) * 2016-11-11 2019-12-31 广州华多网络科技有限公司 一种可执行程序动态调用方法及系统
CN106776375A (zh) * 2016-12-27 2017-05-31 东方网力科技股份有限公司 一种磁盘内部的数据缓存方法及装置

Patent Citations (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7441254B1 (en) * 1997-07-09 2008-10-21 International Business Machines Corporation Simulation of memory-mapped I/O
EP1508855A2 (en) * 2003-08-20 2005-02-23 Katana Technology, Inc. Method and apparatus for providing virtual computing services
US8806096B1 (en) * 2007-04-20 2014-08-12 Netapp, Inc. Increased concurrency of an initialization process of multiple data storage units of a volume
CN103631648A (zh) * 2012-08-20 2014-03-12 华为技术有限公司 一种任务处理方法及系统
CN103914318A (zh) * 2013-01-04 2014-07-09 腾讯科技(深圳)有限公司 程序启动的方法和装置
CN104111897A (zh) * 2013-04-16 2014-10-22 华为技术有限公司 一种数据处理方法、装置及计算机系统
CN104636077A (zh) * 2013-11-15 2015-05-20 中国电信股份有限公司 用于虚拟机的网络块设备存储系统与方法

Also Published As

Publication number Publication date
CN109471671A (zh) 2019-03-15

Similar Documents

Publication Publication Date Title
CN109471671B (zh) 一种程序冷启动方法和系统
US20140129814A1 (en) Method and device, terminal and computer readable medium for accelerating startup of operating system
CN110196681B (zh) 业务写操作的磁盘数据写入控制方法及装置、电子设备
CN111078408B (zh) 内存分配方法、装置、存储介质及电子设备
CN111857855B (zh) 一种网页加载方法及其装置、智能设备
US20190227995A1 (en) Layer-Based File Access Method and Apparatus of Virtualization Instance
WO2020220971A1 (zh) 一种文件加载方法、装置、电子设备及存储介质
CN104199684B (zh) 浏览器冷启动的实现方法及装置
CN108196937B (zh) 字符串对象的处理方法、装置、计算机设备和存储介质
JP2007535241A (ja) 条件付で実行可能モジュールを縮小するシステムおよび方法
CN111796941A (zh) 内存管理方法、装置、计算机设备和存储介质
CN112783761A (zh) 一种应用程序的冷启动时长测试方法、装置及系统
CN111104178A (zh) 一种动态库加载方法、终端装置及存储介质
CN113703893A (zh) 一种页面渲染方法、装置、终端及存储介质
CN115269025A (zh) 一种内核快速启动方法、装置、电子设备及存储介质
CN109271164B (zh) 用于存储数据的方法和系统、以及存储介质
CN116340198B (zh) 固态硬盘的数据写入方法、其装置及固态硬盘
CN112650449A (zh) 缓存空间的释放方法、释放系统、电子设备及存储介质
CN108446144B (zh) 一种应用程序启动方法、装置、终端及存储介质
CN115495020A (zh) 文件处理方法、装置、电子设备和可读存储介质
CN113448897B (zh) 适用于纯用户态远端直接内存访问的优化方法
CN106991058B (zh) 预取文件处理方法及装置
CN103246611A (zh) 一种文件处理方法及系统
CN111625302A (zh) 函数耗时跟踪方法、设备和存储介质
RU2294010C1 (ru) Способ обработки цифровых данных

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant