CN101652747B - 并行dll树初始化 - Google Patents
并行dll树初始化 Download PDFInfo
- Publication number
- CN101652747B CN101652747B CN200880010758.6A CN200880010758A CN101652747B CN 101652747 B CN101652747 B CN 101652747B CN 200880010758 A CN200880010758 A CN 200880010758A CN 101652747 B CN101652747 B CN 101652747B
- Authority
- CN
- China
- Prior art keywords
- storehouse
- queue
- function
- application program
- load
- 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.)
- Expired - Fee Related
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements 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/44—Arrangements for executing specific programs
- G06F9/445—Program loading or initiating
Abstract
公开了一种用于初始化库的并行处理的方法和装置。标识用于应用程序库,确定这些库的初始化顺序并且在异步阶段中初始化这些库。初始化顺序通过形成库的引用的库树并根据这些引用在库树中的层级来确定引用的加载顺序来确定。异步阶段包括包含加载队列的加载阶段、包含咬合队列的咬合阶段以及包含初始化队列的初始化阶段。
Description
背景
计算设备通过执行计算指令来执行任务。用于执行特定任务的一组计算指令形成函数。在执行相关任务时交互的一组函数形成应用程序。两个或更多不同的应用程序可能需要使用相同的函数来执行相同的任务。虽然可能在每一个应用程序中包括相同的函数的计算指令,但是每一个应用程序共享公共计算指令集更高效。通过共享公共计算指令集,使用较少的存储器来存储指令并且仅需要在一个位置作出对计算指令的修改。
为了允许不止一个应用程序使用相同的函数,形成的函数库,即库。通常,每一个函数的计算指令和对计算指令的引用都被放置在库中。为了使用库中的函数,应用程序调用加载库的操作系统模块并且该应用程序使用对函数的引用来调用所需函数。通常,在可以访问已加载的库之前,必须初始化该库。初始化包括执行例如构建和准备由库使用的数据结构的计算指令。
函数可以调用同一库中的其它函数。函数也可以调用另一库中的函数。因此,库可能依赖于另一库。例如,应用程序可依赖于库A,库A依赖于库B,而库B依赖于库C。为了加载并初始化应用程序,必须以适当的顺序来加载并初始化库A、B和C。应用程序及其库通常以发现应用程序和库的顺序(即,自顶向下的顺序)来加载。
传统上,上述加载并初始化库的过程是串行过程。即,每一个库都必须以适当的顺序一个接一个地加载并初始化。加载和初始化可通过利用诸如多线程处理等并行处理技术和诸如多处理器计算设备和多核微处理器等并行处理硬件来加速。
概述
提供本概述是为了以简化的形式介绍将在以下详细描述中进一步描述的一些概念。本概述并不旨在标识所要求保护的主题的关键特征,也不旨在用于帮助确定所要求保护的主题的范围。
公开了用于初始化支持应用程序的库的并行处理方法和装置。标识支持应用程序的库。确定用于支持库的初始化顺序。在异步阶段中初始化库。
在一个示例性形式中,确定用于支持库的初始化顺序包括:形成用于支持库的引用的库树;以及根据引用集在库树中的层级来确定引用集的加载顺序。
在一个示例性形式中,异步阶段包括:使用加载队列的异步加载阶段;使用咬合队列的异步咬合阶段;以及使用初始化队列的异步初始化阶段。优选地,使用加载队列的异步加载阶段:根据加载顺序来将库树的引用集加载到加载队列中;使用加载队列中的库引用来将库加载到应用程序的进程存储空间中;以及将对所加载的库的库引用从加载队列移至咬合队列。优选地,使用咬合队列的异步咬合阶段:使用咬合队列中的库引用来咬合库;以及将对所咬合的库的库引用从咬合队列移至初始化队列。优选地,使用初始化队列的异步初始化阶段执行用于初始化队列中的库引用所引用的库的初始化计算指令。
附图描述
当结合附图参考以下详细描述时,可以更容易领会并更好地理解本发明的上述方面和许多附加的优点,附图中:
图1是适用于执行并行库树初始化的示例性计算设备的框图;
图2是由示例性库支持的示例性应用程序的框图;
图3是示出图2所示的元素的依赖关系的示例性依赖树的框图;
图4是示出由本身由其他示例性库支持的示例性库支持的示例性应用程序的框图;
图5是示出图4所示的元素的依赖关系的示例性依赖树的框图;
图6是包含四个引用的示例性加载队列以及两者皆为空的示例性咬合队列和示例性初始化队列的示意图;
图7是示例性加载队列包含一个引用,示例性咬合队列包含四个引用而示例性初始化队列不包含引用的图6所示的各示例性队列的示意图;
图8是示例性加载队列不包含引用,示例性咬合队列包含一个引用而示例性初始化队列包含四个引用的图6所示的各示例性队列的示意图;
图9是示例性加载队列和咬合队列为空而示例性初始化队列包含五个引用的图6所示的各示例性队列的示意图;
图10是示出用于加载示例性应用程序和应用程序的示例性支持库的示例性异步过程的功能流程图;
图11是示出用于用引用来填充示例性加载队列并适于在图10所示的异步过程中使用的示例性子例程的功能流程图;
图12是示出用于使用存储在示例性加载队列中的引用来加载库的示例性子例程的功能流程图;
图13是示出用于使用存储在示例性咬合队列中的引用来咬合库的示例性子例程的功能流程图;
图14是示出用于使用存储在示例性初始化队列中的引用来初始化库的示例性子例程的功能流程图。
详细描述
库是允许不止一个软件程序使用函数的计算机软件函数的有序集合。通过使得相同的函数对多个软件程序可用,使用较少的存储器来存储函数计算指令。至少重要的是,如果需要修改函数,则修改能够在一个软件模块(即,库)而非许多软件模块(即,程序)中完成。库中的函数被称为“库函数”。通常,每一个库函数的计算指令和对每一个函数的计算指令的引用都可以被放置在库中。在库函数的计算指令可以由例如应用程序来执行之前,必须定位、加载并初始化包含库函数的库。初始化通常涉及执行准备例如由库函数使用的数据结构的指令。通常,操作系统中被称为“加载器”的软件模块提供库定位、加载和初始化。
通常,第一库中的第一库函数调用第二库中的第二库函数。在这些情况下,第一库依赖于第二库。即,第二库是第一库的依赖库。反之,第二库支持第一库。即,第二库是第一库的支持库。例如,应用程序可以依赖于库A,库A依赖于库B,库B依赖于库C。在该示例中,库C支持库B,库B支持库A,并且所有这三个库都直接或间接支持调用第一库的应用程序。
上述依赖关系可以用树结构,即库依赖树和库树来表示。在库树中,插入对应于每一个库的节点。每一个依赖关系都由依赖库和支持库之间的链接来表示。
为了加载并初始化应用程序,必须以适当的顺序加载和初始化库A、B和C。应用程序及其库通常以发现该应用程序和库的顺序,即自顶向下的顺序来加载。例如,首先加载应用程序,然后加载库A、然后加载库B等。应用程序及其库通常以自底向上的顺序来初始化。
在加载期间,解析库。如果在解析库期间没有发现支持库,即该库不依赖于其它库,则对库的加载继续直至完成对该库的加载。如果在解析库期间发现一个或多个依赖,则暂停对该库的加载并加载支持库。在加载支持库之后,对库的加载继续直至完成对该库的加载。
在加载阶段期间,当解析了每一个库时,组装依赖树。对于每一个支持库,在依赖树中插入链接在该支持库所支持的库之下的节点。
一旦加载库的支持库,就可咬合该库。加载器使用依赖树来确定从处于依赖树的底部的节点开始的咬合顺序。因此,咬合阶段自底向上,即从依赖树的底部到依赖树的顶部地进行。
一旦咬合库并初始化库的支持库,就可以初始化该库。加载器使用依赖树来确定从处于依赖树的底部的节点开始的初始化顺序。因此,初始化阶段自底向上地进行。
在过去,上述加载和初始化进程以线性或串行方式完成。即,每一个库都具有极少或没有时间重叠地、一个接一个地加载和初始化。通过使用上述示例,对库C的加载在初始化库C之前完成。对库B的加载直到完全加载并初始化库C后才开始。对库A的加载直到完全加载并初始化库B后才开始,等等。虽然有效,但对库的串行加载和初始化并非如其所能的那样时间高效。可以通过减少加载和初始化期间的等待时间来减少加载和初始化库的总时间。
可以通过利用诸如多线程处理、微处理器计算设备和多核处理器等并行处理技术开发库树的固有并行性来减少加载和初始化期间的等待时间。利用并行处理技术的过程时并行处理过程。“并行库树初始化”是示例性并行处理过程。图1是示出适用于执行并行库树初始化的示例性计算设备100的框图。诸如示例性计算设备100的计算设备包括但不限于,台式计算机、服务器、膝上型计算机、手持式计算设备、嵌入式计算设备等。
图1所示的计算设备100包括基本计算设备106和基本计算设备106与之交互的各种类型的外围设备。基本计算设备106包括用于处理计算指令和控制计算设备100的操作的处理单元102以及用于存储等待立即执行的计算指令的存储器单元104。存储器单元104可以包括系统存储器、易失性存储器和非易失性存储器。处理单元102可以被实现为一个微处理器、多个微处理器、多核微处理器、多个多核微处理器或者能够提供类似计算资源的其它电子电路。存储器单元104可以由存储器设备来实现,诸如但不限于,只读存储器(ROM)、可编程只读存储器(PROM)、电可编程只读存储器(EPROM)、电可擦除可编程只读存储器(EEPROM)、随机存取存储器(RAM)、静态随机存取存储器(SRAM)、动态静态随机存取存储器(DRAM)、闪存或上述存储器设备的组合。
图1中所示的基本计算设备106可以与一个或多个外围设备交互,包括但不限于,可移动存储108、不可移动存储110、输出设备116、输入设备112和通信链接114的。可移动存储108设备允许对计算机指令和数据进行长期的便携式存储,并且包括但不限于,可移动磁盘驱动器以及诸如紧致盘(CD)驱动器和数字视频驱动器(DVD)等可移动光盘驱动器。不可移动存储器110设备允许对计算机指令和数据进行长期存储,并且包括但不限于,磁盘驱动器、光盘驱动器、全息存储单元等。输出设备116允许计算设备100提供视觉、听觉和其它输出,并且包括但不限于,液晶显示器(LCD)、等离子显示器、阴极射线管(CRT)显示器、音频扬声器、触觉手套、触觉座位、数字投影仪等等。输入设备112允许计算设备100接受并处理视觉、听觉和其它输入并且包括但不限于,鼠标、键盘、电子笔、话筒、数字照相机、数字摄像机等等。通信链接114包括但不限于,以太网、令牌环、光纤分布式数据接口(FDDI)、异步传输模式(ATM)、火线连接等。
诸如图1所示且以上所描述的示例性计算设备100等计算设备通常由操作系统来控制。操作系统控制的计算设备提供用于并行库树初始化的环境。库树包含表示包括动态链接的库在内的库的节点。动态链接的库的示例性类型是动态链接库(DLL)。动态链接的库(例如,DLL)是能够在使用该DLL的应用程序正在运行时加载并初始化的库,从而允许仅在需要时加载DLL。因此,DLL直到被使用时才消耗存储器。因为DLL是单独的文件,所以同一DLL可以由不止一个应用程序共享,并且可以仅对DLL作出纠正和改进而不影响调用程序或其它库的操作。包含表示DLL的节点的库树是DLL树。因此,并行库树初始化的实现是并行DLL树初始化。除了注明的地方,否则下文中的术语“库”和“DLL”可以互换并且短语“并行库树初始化”和“并行DLL树初始化”也可以互换,可以理解,所公开的主题不限于DLL,而是包括其它类型的链接库,包括静态加载的库。
为了帮助理解并行库树初始化的过程,以下使用图2到5来提供对库树的解释。图2是由示例性库208和212支持的示例性应用程序200的框图。图3是表示图2所示的元素(即,示例性应用程序200和示例性库208和212)的依赖关系的示例性依赖树(即,库树)的框图。在图2中,示例性应用程序200包含函数列表202。函数列表202包括两个函数指针,即库_A:函数_01指针204和库_B:函数_01指针206。两个函数指针204和206中的每一个都是指的是,即指向特定库中的特定函数。库_A:函数_01指针204指向库_A 208中的函数,即函数_01 210。库_B:函数_01指针206指向库_B 212中的函数,即函数_01 214。
图3所示的示例性库树的根节点,即顶部节点是应用程序300并且是对应于图2所示的应用程序200的节点。如图3中所示,由指向下的箭头表示的有向链接将应用程序300与库_A 302相连接以示出应用程序200依赖于图2所示的库_A208。类似地,有向链接将应用程序300与库_B 304相连接以示出应用程序200依赖于库_B 212。
由于图3示出了图2中的元素的依赖关系的库树,因此图5示出了图4中的元素的依赖关系的虽然更复杂但相似的库树。图4所示的应用程序400包含函数列表402,其包含三个函数指针,即指针库_A1:函数_01 404、库_B1:函数_01 406和库_C1:函数_01 408。指针库_A1:函数_01 404指向库_A1 410中的函数_01 412。指针库_B1:函数_01 406指向库_B1 420中的函数_01 422。指针库_C1:函数_01 408指向库_C1 424中的函数_01 426。因此,应用程序400依赖于库_A1 410、库_B1 420和库_C1 424,即由这些库来支持。依赖关系在图5中由链接到库_A1 502、库_B1 504和库_C1 506的应用程序500来示出。
图4所示的库_A1 410还包含函数列表414,其包含两个指针:库_D1:函数_01416和库_E1:函数_01 418。指针库_D1:函数_01 416指向库_D1 428中的函数_01 430。指针库_E1:函数_01 418指向库_E1 432中的函数_01 434。因此,库_A1 410直接依赖于库_D1 428和库_E1 432,而应用程序400也间接依赖于这两个库。直接依赖关系在图5中由库_A1 502与库_D1 508和库_E1 510之间的链接来示出。
在实践中,诸如以上描述的和图3和5所示的依赖关系等应用程序和库之间的依赖关系受到应用程序和库如何链接的影响。例如,库可以支持应用程序并且该应用程序和支持库之间的依赖关系受到该应用程序和支持库如何链接的影响。库也可以支持其它库。因此,应用程序和支持库之间的关系可以被解释为示例性而非限制性。
静态链接的支持库在编译和链接应用程序时链接到应用程序。在一种类型的静态链接中,静态库的整个可执行映像在构建,即编译并链接应用程序时链接到该应用程序的可执行映像。在一种替换类型的静态链接中,应用程序的可执行映像显式地枚举用于支持库的“导入库”的依赖关系和链接。导入库是帮助自动化加载共享库的过程的库。共享库被设计成由不止一个应用程序共享,即支持不止一个库。当创建共享库时,编译器也按相同的名称创建引入库。
通过将导入库编译到应用程序中,将该应用程序绑定到共享,即支持库,该应用程序在运行时由操作系统的加载器加载。当加载了应用程序时,导入表在应用程序的可执行映像中可用,加载器处理该导入表以定位将要加载到应用程序的进程中的支持库的可执行映像的当前可用版本。
动态链接的库,即动态库在执行应用程序期间链接到应用程序。DLL是示例性动态库。当应用程序正在运行时,该应用程序向操作系统作出将动态库加载到进程的地址空间中的请求。正在运行的应用程序还可在执行应用程序期间作出卸载并重新加载动态库的请求所需的那样多的次数。
为了使应用程序能够在动态库中定位函数,应用程序存储函数列表或表,诸如图2所示的应用程序200的函数列表202。当加载应用程序时应用程序中的函数列表包含库中的所期望的函数的地址。该期望列表是使用导入库来生成。当加载器加载实际库时,函数的地址很可能不同于函数列表中的函数地址。因此,加载器更新,即重新映射函数里表中的函数地址。重新映射函数地址的过程被称为“咬合”,因为新地址被“咬合”到位置。通常,在加载库之后,需要初始化该库。初始化使得库准备好供外部调用者(例如,应用程序)使用。在初始化期间,执行例如在存储器中构建由库使用的数据结构并且或许在数据结构中插入默认值的计算指令。经初始化的库中的计算指令可自己调用需要加载并初始化的其它库中的函数。可以在基于一个库调用另一个库中函数的顺序来形成指示库之间的依赖关系的库树时考虑需要加载并初始化的库的完整集合。可从该树结构中确定加载顺序,即加载库树中的库的顺序,以及初始化顺序,即初始化库树中的库的顺序。
可在图5所示的库树中看到加载顺序的示例。该库树示出库_D1 508和库_E1510在相同的层,即相同的依赖等级上,即在库_A1 502的层的下面的层。因此,可以确定库_D1 508和库_E1 510应该在库_A1 502之前加载。也应注意,因为库_D1 508和库_E1 510在同一层中,所以在这两个库之间不存在依赖并且因此库库_D1 508可以在库_E1 510之前加载,反之亦然。类似地,库_A1 502、库_B1 504和库_C1 506可以按相对于彼此的任何顺序加载,只要库_A1 502在库_D1 508和库_E1 510之后加载。也可能按任何顺序加载库_B1 504、库_C1 506、库_D1 508和库_E1 510,只要这些库在库_A1 502之前加载。即,库_B1 504、库_C1 506、库_D1 508和库_E1 510形成“引用集”。引用集是不互相依赖的并由此可以按任何顺序一起加载的库的引用的集合。
传统上,如上所述,包括咬合的加载和初始化库是以没有时间重叠的线性方式完成。即,每一个库都在开始加载和初始化下一个库之前完全加载和初始化。将该传统扩展到上述示例,首先加载并初始化库_E1 510;接着加载并初始化库_D1508;然后是库_C1 506、库_B1 504和库_A1 502;并且最后,加载并初始化应用程序500。对一个库的初始化通常耗费几千到几十万个时钟周期。因此,虽然该线性逐步方法实现了库加载和初始化,但是该过程是费时的,通常达到造成人类可察觉到的延迟的程度。这些延迟在首先加载库的情况下在应用程序启动期间变得明显,而在动态卸载并重新加载库的情况下也在应用程序执行期间变得明显。
可通过将加载和初始化的过程分成较小的独立任务并且尽可能多地并行地执行这些任务来加速。即使一个执行线程对任务进行操作,也可节省合理的时间量。如果使用多个线程和/或多个处理单元,则可节省大量时间。因为该技术可用于在运行时间使用导入表来加载库,所以可以改进应用程序的启动时间。因为该技术可以在动态加载期间使用,所以可以提高应用程序的整体速度。即,因为可加速当应用程序正在运行时发生的动态加载,所以应用程序的执行速度更快并且应用程序变得更加迅速地作出响应。并行库树初始化时这一过程的示例,其并行DLL树初始化是一实现。该过程和在该过程中所使用的特定数据结构在图6-14中示出并在下文中描述。
并行库树初始化遵循库树的每一个“层”中的库的库加载和初始化顺序。库树中的层包括具有相同依赖等级的库。例如,在图5所示的库树中,库_D1 508和库_E1 510具有相同的依赖等级并因此可以按相对于彼此的任何顺序加载。优选地,这两个库在上层上的库,即库_A1 502、库_B1 504和库_C1 506之前加载。也可能认为库_B1 504和库_C1 506在与库_D1 508和库_E1 510相同的层上,因为库_B1504和库_C1 506不支持库_A1 502。在确定库加载和初始化顺序之后,可以并行地初始化库树的每一层中的库树中的库。一旦加载并初始化该层中的库,就可以加载并初始化上一层中的库。
并行库树初始化的过程包括三个阶段:加载、咬合和初始化。为了支持每一个阶段,存在相应的队列:加载队列、咬合队列以及初始化队列。图6是示出这些队列的示例的示意图。图6-9示出如何使用这些示例性队列来加载图5所示的示例性库树的示例性库。当并行库树初始化过程开始时,加载队列600包含对库树中第一可加载层中的库的引用,例如,指针。例如,加载队列600包含对图5所示的库_B1 504的引用。库_B1 504在图6中在位置库_B1 610a处示出。类似地,示出了分别对应于库_C1 506、库_D1 508和库_E1 510引用的位置库_C1 612a、库_D1 614a和库_E1 616a。示例性咬合队列602和示例性初始化队列604是空的。在加载每一个库时,将对所加载的库的引用从加载队列600移至咬合队列602。
图7示出了在已加载库_B1 504、库_C1 506、库_D1 508和库_E1 510并将其引用移至咬合队列602中后的咬合队列602。具体地,将这些引用移至位置库_B1610b、库_C1 612b、库_D1 614b和库_E1 616b处。因为已经加载在库_A1 502下面的层上的库,所以对库_A1 502的引用被示为移至加载队列600中的位置库_A1618a中。在图7中,初始化队列604是空的。当加载了咬合队列602中的每一个库时,将对每一个库的引用从咬合队列602移至初始化队列604中。
图8示出了已加载库_B1 504、库_C1 506、库_D1 508和库_E1 510并将其引用移至初始化队列604中后的初始化队列604。具体地,将引用移至位置库_B1610c、库_C1 612c、库_D1 614c和库_E1 616c中。因为已咬合在库_A1下面的层上的库,所以将对库_A1的引用移至咬合队列602中的位置库_A1 618b中,从而将图8所示的加载队列600留空。
图9示出在已咬合库_A1 502并将对库_A1 502的引用移至初始化队列604中,从而将加载队列600和咬合队列602留空后的初始化队列604。如图9所示,引用在位置库_A1 618c、库_B1 610c、库_C1 612c、库_D1 614c和库_E1 616c中。每一个库引用都可在初始化每一个库后从初始化队列604中移除。由图6-9提供的“快照”图示地示出如何加载、咬合和初始化一个示例性库树中的库。图10-14的功能流程图更详细地示出了并行库树初始化过程。
图10是示出用于初始化支持应用程序的库的示例性并行库树初始化过程的功能流程图。该过程从标识支持应用程序的库进展到确定支持库的初始化顺序并最终至在异步阶段中初始化库。该过程从框1000开始,在那里示例性加载器将应用程序映像映射到存储器。可使用除了加载器之外的软件模块来将应用程序映像映射到存储器并且执行该过程中的其他动作。因此,使用加载器来执行该过程中的动作应该被解释为示例性而非限制性。在框1002,加载器读取应用程序的首部。首部通常包含关于库的大小、库的内容等使得加载器能够加载库的信息。在判定框1004,测试以确定应用程序是否具有支持库。如果应用程序不具有支持库,则该过程结束。如果应用程序的确具有支持库,则控制行进至框1006,在那里加载器创建依赖树,例如,库树。库树从对支持库的引用中形成。然后可以形成引用集并且可以根据库树中剩余的引用集的层级来确定该库树中的引用集的加载顺序。
继续图10,在框1008,加载器用对应用程序的支持库的引用集来调用示例性填充加载队列子例程。示例性填充加载队列子例程在图11中示出并且在下文中描述。在执行了框1008中所调用的填充加载队列子例程后,控制流被分成表示三个异步阶段的三个示例性异步分支。优选利用各阶段的异步特性并且允许并行地执行各阶段。控制流分叉到框1010、1012和1014。在框1010,加载器启动用加载队列(例如,图6所示的加载队列600)中的引用来加载库的线程。在框1012,加载器启动用咬合队列(例如,图6所示的咬合队列602)中的引用来咬合库的线程。在框1014,加载器启动用初始化队列(例如,图6所示的初始化队列604)中的引用来初始化库的线程。
如图6-9所示且如上所述,将每一个库引用(即,引用)放置在加载队列600中。加载每一个库并且将对该库的引用从加载队列600中移除并将其放置在咬合队列602中。一旦加载库,就必须在可将该库的引用放置在咬合队列602上之前加载所有其支持库。确定是否已加载所有支持库的方式是使用对支持库的计数。当加载一支持库时,递减该计数。当计数被递减到零时,将库的引用放置在咬合队列602上。咬合每一个库咬合并将对库的引用从咬合队列602中移除并将其放置在初始化队列604中。在初始化对应于引用的库后,将该引用从初始化队列604中移除。一旦咬合库,就必须在可将库的引用放置在初始化队列604上之前咬合所有其支持库。确定是否已咬合所有支持库的方式是使用对支持库的计数。当咬合一支持库时,递减计数。当计数被递减到零时,将库的引用放置在初始化队列604上。当完成框1010、1012和1014中的动作后,该过程结束。用于执行框1010、1012和1014的功能的示例性子例程分别在图12、13和14中示出并且在下文中描述。
图10所示的框1010、1012和1014中的动作的并行执行可以按许多方式实现。例如,一个线程,而非框1010、1012和1014中所陈述的三个示例性线程,可以执行这三个动作。两个、四个或更多适当地协调的线程执行这些动作也是可能的。因此,使用三个线程(框1010、1012和1014各自对应一个线程)应被解释为示例性而非限制性。同样,图10所示且上述的示例性过程的一个或多个线程可以在一个或多个处理器上运行。
如上所述,在图10的框1008,加载器用对应用程序的支持库的引用集来调用示例性填充加载队列子例程。示例性填充加载队列子例程在图11中示出。图11是示出用于用库引用(即,引用)来填充示例性加载队列(例如,图6所示的加载队列600)并且适于在图10所示的示例性并行库树初始化过程中使用的的示例性子例程的功能流程图。注意,图11所示的子例程被表示为递归函数,即,调用其本身的函数。虽然使用递归通常使得设计和解释函数更容易,但递归函数有时难以安全且高效地实现。由此,虽然图11所示的子例程为了解释容易起见被表示为递归,但可以理解,该子例程也能够以非递归方式实现。
示例性填充加载队列子例程从框1100开始,在那里确定所提交的库引用集中的库引用的数量。在框1102,为库引用分配存储块。在框1104,将下一个库引用,即要处理的下一个库引用设为第一库引用。在框1106,创建对应于下一个库引用的节点并将该对应于下一个库引用的节点插入依赖树,即库树中。在框1108,将下一个库引用放置到加载队列(例如,图6所示的加载队列600)中。在判定框1110,测试以确定下一库,即要处理的库是否具有支持库。如果该下一个库不具有支持库,则控制行进至判定框1114。如果该下一个库确实具有支持库,则控制行进至框1112,在那里用对支持库(即,要处理的库的支持库)的引用集来对对应于填充加载队列子例程的子例程作出调用,即,递归调用。在判定框1114,测试以确定是否已处理所有库引用。如果尚未处理所有库引用,即要处理的引用集中的库引用,则控制行进至框1116,在那里获取下一个库引用,并且控制流然后继续块1106。如果已经处理了要处理的引用集中的所有库引用,则该过程结束。
在图10所示的框1010中,启动使用存储在加载队列(例如,图6所示的加载队列600)中的引用来加载库的线程。用于使用存储在示例性加载队列中的引用来加载库的示例性子例程由图12所示的功能流程图示出。该示例性子例程开始于框1200,在那里测试以确定加载队列(例如,图6所示的加载队列600)是否为空。如果加载队列为空,则该过程结束。如果加载队列不为空,则控制行进至框1202,在那里从加载队列中获取下一个库引用。使用库引用来读取库的映像,并且在框1204,将库的映像映射到存储器。在框1206,读取库的首部。在判定框1208,测试以确定是否已加载所有支持库,即支持要处理的库的库。通常,可以在加载完成后检查库以查看是否可以咬合该库。或者,当加载了每一个支持库时,可以咬合库的导入表中包含支持库的部分。如果已加载所有支持库,则控制行进至框1210。在框1210,将库引用放置到咬合队列中。如果尚未加载所有支持库,则控制返回到判定框1208。该过程继续直到在判定框1200中作出的测试确定加载队列为空。
在图10所示的框1012中,启动使用存储在咬合队列(例如,图6所示的咬合队列602)中的引用来咬合库的线程。用于使用存储在示例性咬合队列中的引用来咬合库的示例性子例程由图13所示的功能流程图示出。该示例性子例程开始于判定框1300,在那里测试以确定咬合队列(例如,图6所示的咬合队列602)是否为空。如果咬合队列为空,则该过程结束。如果咬合队列不为空,则控制行进至框1302。在框1302,从咬合队列中获取下一个库引用。使用库引用来定位库,并且在框1304,读取库的函数列表。在框1306,将下一个函数,即要处理的下一个函数设为第一函数。在框1308,找出下一个函数的位置。在框1310,咬合下一个函数的位置。在判定框1312,测试以确定是否已咬合函数列表中的所有函数。如果尚术咬合列表中的所有函数,则控制返回到框1308。如果已咬合函数列表中的所有函数,则控制行进至框1314,在那里将库引用放置到初始化队列(例如,图6所示的初始化队列604)中。通常,可以在咬合完成后检查库以查看是否可以初始化该库。或者,当咬合了每一个支持库时,可以初始化库的导入表中包含支持库的部分。该过程继续直到在判定框1300中作出的测试确定咬合队列为空。
在图10所示的框1014,启动使用存储在初始化队列(例如,图6所示的初始化队列604)中的引用来初始化库的线程。用于使用存储在示例性初始化队列中的引用来初始化库的示例性子例程由图14所示的功能流程图示出。该示例性子例程开始于判定框1400,在那里测试以确定初始化队列(例如,图6所示的初始化队列604)是否为空。如果初始化队列为空,则该过程结束。如果初始化队列不为空,则控制行进至框1402,在那里从初始化队列中获取下一个库引用。使用库引用来定位库,并且在框1404,初始化库。该程继续直到在判定框1400中作出的测试确定初始化队列为空。
虽然图10-14示出且上述的并行库树初始化过程当在具有多个处理器的计算设备或系统中使用时具有明显的节省时间的优点,但是单处理器计算机设备也可从使用该过程中获益。只要计算系统或设备使用不止一个线程来执行加载、咬合和初始化,就可以减少延迟。例如,如果执行咬合的线程被阻塞,则执行加载和初始化的线程可以继续。并行库树初始化过程的另一优点是操作系统能够在不显式地与应用程序合作的情况下安全地加载应用程序。类似地,在操作系统上运行的应用程序无需在知道操作系统如何加载应用程序的情况下编写。
尽管示出和描述了各说明性实施例,但是可以认识到,可在其中作出各种改变而不背离本发明的精神和范围。例如,使用类似于上述过程的过程来卸载库是可能的。
Claims (18)
1.一种用于并行处理多个库的方法,所述方法包括:
标识包括由应用程序使用的第一函数的第一库;
标识包括支持所述第一库的第二函数的第二库;
将所述第二库加载到第一存储器中;以及
咬合所述第二库以重新映射所述第二函数的地址同时并发地将所述第一库加载到第二存储器中。
2.如权利要求1所述的方法,其特征在于,包括:
初始化所述第二库同时并发地咬合所述第一库以重新映射所述第一函数的地址。
3.如权利要求1所述的方法,其特征在于,标识第二库包括:
在开始将所述第一库加载到所述第二存储器中之前标识所述第二库。
4.如权利要求1所述的方法,其特征在于,所述加载第二库包括:
在加载队列中标识与所述第二库相关联的引用。
5.如权利要求4所述的方法,其特征在于,包括:
在咬合队列中标识所述引用。
6.如权利要求5所述的方法,其特征在于,包括:
响应于将所述引用从所述咬合队列移动到初始化队列来初始化所述第二库。
7.一种用于并行处理多个库的系统,所述系统包括:
用于标识包括由应用程序使用的第一函数的第一库的装置;
用于标识包括支持所述第一库的第二函数的第二库的装置;
用于将所述第二库加载到第一存储器中的装置;以及
用于咬合所述第二库以重新映射所述第二函数的地址同时并发地将所述第一库加载到第二存储器中的装置。
8.如权利要求7所述的系统,其特征在于,包括:
用于初始化所述第二库同时并发地咬合所述第一库以重新映射所述第一函数的地址的装置。
9.如权利要求7所述的系统,其特征在于,用于标识第二库的装置包括:
用于在开始将所述第一库加载到所述第二存储器中之前标识所述第二库的装 置。
10.如权利要求7所述的系统,其特征在于,用于加载所述第二库的装置包括:
用于在加载队列中标识与所述第二库相关联的引用。
11.如权利要求10所述的系统,其特征在于,用于咬合的装置包括:
用于在咬合队列中标识所述引用的装置。
12.如权利要求11所述的系统,其特征在于,包括:
用于响应于将所述引用从所述咬合队列移动到初始化队列来初始化所述第二库的装置。
13.在一个包括处理器、存储器以及包含库调用的应用程序的计算设备中,一种改进该计算设备以用于并行处理多个库的方法,所述方法包括配置该计算装置以用于:
标识包括由应用程序使用的第一函数的第一库;
标识包括支持所述第一库的第二函数的第二库;
将所述第二库加载到第一存储器中;以及
咬合所述第二库以重新映射所述第二函数的地址同时并发地将所述第一库加载到第二存储器中。
14.如权利要求13所述的方法,其特征在于,包括配置所述计算装置以用于:
初始化所述第二库同时并发地咬合所述第一库以重新映射所述第一函数的地址。
15.如权利要求13所述的方法,其特征在于,配置所述计算装置以用于标识第二库包括:
配置所述计算设备以用于在开始将所述第一库加载到所述第二存储器中之前标识所述第二库。
16.如权利要求13所述的方法,其特征在于,配置所述计算设备以用于加载所述第二库包括:
配置所述计算设备以用于在加载队列中标识与所述第二库相关联的引用。
17.如权利要求16所述的方法,其特征在于,配置所述计算设备以用于咬合包括:
配置所述计算设备在咬合队列中标识所述引用。
18.如权利要求17所述的方法,其特征在于,包括:
配置所述计算设备以响应于将所述引用从所述咬合队列移动到初始化队列来初始化所述第二库。
Applications Claiming Priority (3)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US11/693,102 US8707283B2 (en) | 2007-03-29 | 2007-03-29 | Parallel DLL tree initialization |
US11/693,102 | 2007-03-29 | ||
PCT/US2008/054378 WO2008121456A1 (en) | 2007-03-29 | 2008-02-20 | Parallel dll tree initialization |
Publications (2)
Publication Number | Publication Date |
---|---|
CN101652747A CN101652747A (zh) | 2010-02-17 |
CN101652747B true CN101652747B (zh) | 2016-08-17 |
Family
ID=39796552
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN200880010758.6A Expired - Fee Related CN101652747B (zh) | 2007-03-29 | 2008-02-20 | 并行dll树初始化 |
Country Status (5)
Country | Link |
---|---|
US (1) | US8707283B2 (zh) |
EP (1) | EP2130118B1 (zh) |
CN (1) | CN101652747B (zh) |
TW (1) | TW200844864A (zh) |
WO (1) | WO2008121456A1 (zh) |
Families Citing this family (12)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101996087B (zh) * | 2010-12-02 | 2013-12-04 | 北京星河亮点技术股份有限公司 | 多核处理器阵列程序的动态加载方法 |
WO2012138376A1 (en) * | 2011-04-02 | 2012-10-11 | Intel Corporation | Method and devices for determining parallelism of tasks of a program |
US10073974B2 (en) * | 2016-07-21 | 2018-09-11 | International Business Machines Corporation | Generating containers for applications utilizing reduced sets of libraries based on risk analysis |
CN107748632B (zh) * | 2017-09-28 | 2021-11-02 | 努比亚技术有限公司 | 冻屏监测方法、移动终端及计算机可读存储介质 |
US10503518B2 (en) | 2017-10-11 | 2019-12-10 | Microsoft Technology Licensing, Llc | Initializing hardware components using parallel driver loading and serial access granting |
DE102018206092A1 (de) * | 2018-04-20 | 2019-10-24 | Robert Bosch Gmbh | Verfahren und Vorrichtung zum Ansteuern eines Analysegerätes zur Ausführung einer Analyse eines Probenmaterials |
US11200070B2 (en) | 2018-08-03 | 2021-12-14 | International Business Machines Corporation | Dynamic-link library usage based on memory size |
US11030168B2 (en) | 2018-12-11 | 2021-06-08 | Sap Se | Parallelization of order dependent procedures during software change processes |
US10846102B2 (en) * | 2019-03-05 | 2020-11-24 | International Business Machines Corporation | Loading dependency library files from a shared library repository in an application runtime environment |
TWI690815B (zh) * | 2019-03-26 | 2020-04-11 | 林威成 | 電子手冊編輯系統 |
US11422917B2 (en) * | 2019-07-26 | 2022-08-23 | Red Hat, Inc. | Deriving software application dependency trees for white-box testing |
CN110442396B (zh) * | 2019-07-31 | 2022-12-16 | 网易(杭州)网络有限公司 | 应用程序启动方法及装置、存储介质及电子设备 |
Family Cites Families (17)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CA2102883A1 (en) * | 1993-02-26 | 1994-08-27 | James W. Arendt | System and method for lazy loading of shared libraries |
US5835749A (en) * | 1995-05-05 | 1998-11-10 | Apple Computer, Inc. | Method and apparatus for providing dynamically linked libraries |
US5802367A (en) * | 1995-07-07 | 1998-09-01 | Microsoft Corporation | Method and system for transparently executing code using a surrogate process |
US6279124B1 (en) * | 1996-06-17 | 2001-08-21 | Qwest Communications International Inc. | Method and system for testing hardware and/or software applications |
US6769126B1 (en) * | 1996-12-10 | 2004-07-27 | International Business Machines Corporation | Apparatus and method for demand load analysis |
US5974470A (en) * | 1997-09-03 | 1999-10-26 | Chicago-Soft, Ltd. | System for reducing conflicts among dynamic link library modules by aliasing modules |
US6529934B1 (en) * | 1998-05-06 | 2003-03-04 | Kabushiki Kaisha Toshiba | Information processing system and method for same |
US6378127B1 (en) * | 1998-09-21 | 2002-04-23 | Microsoft Corporation | Software installation and validation using custom actions |
US6763519B1 (en) * | 1999-05-05 | 2004-07-13 | Sychron Inc. | Multiprogrammed multiprocessor system with lobally controlled communication and signature controlled scheduling |
GB2377283B (en) * | 2001-04-10 | 2004-12-01 | Discreet Logic Inc | Initialising modules |
US20040123308A1 (en) * | 2002-12-20 | 2004-06-24 | Siemens Information And Communication Networks, Inc. | Hybird of implicit and explicit linkage of windows dynamic link labraries |
US7503043B2 (en) * | 2003-09-05 | 2009-03-10 | International Business Machines Corporation | Method of building dynamic installation packages using a declarative authoring tool |
US7926051B2 (en) * | 2003-11-10 | 2011-04-12 | International Business Machines Corporation | Automatic parallel non-dependent component deployment |
JP2005196286A (ja) * | 2003-12-26 | 2005-07-21 | Okuma Corp | リアルタイムアプリケーションプログラムを動作可能なオペレーティングシステム及びその制御方法、共有ライブラリをロードする方法 |
US20060026584A1 (en) * | 2004-07-27 | 2006-02-02 | Muratori Richard D | Explicit linking of dynamic link libraries |
US7900217B2 (en) * | 2007-03-29 | 2011-03-01 | Microsoft Corporation | Dynamic DLL cycle resolution |
JP2008257783A (ja) * | 2007-04-03 | 2008-10-23 | Spansion Llc | 不揮発性記憶装置、不揮発性記憶システムおよび不揮発性記憶装置の制御方法 |
-
2007
- 2007-03-29 US US11/693,102 patent/US8707283B2/en not_active Expired - Fee Related
-
2008
- 2008-02-20 CN CN200880010758.6A patent/CN101652747B/zh not_active Expired - Fee Related
- 2008-02-20 EP EP08730224.6A patent/EP2130118B1/en not_active Not-in-force
- 2008-02-20 WO PCT/US2008/054378 patent/WO2008121456A1/en active Application Filing
- 2008-03-03 TW TW097107375A patent/TW200844864A/zh unknown
Also Published As
Publication number | Publication date |
---|---|
EP2130118A4 (en) | 2010-04-14 |
CN101652747A (zh) | 2010-02-17 |
EP2130118B1 (en) | 2018-07-18 |
US8707283B2 (en) | 2014-04-22 |
US20080244551A1 (en) | 2008-10-02 |
WO2008121456A1 (en) | 2008-10-09 |
TW200844864A (en) | 2008-11-16 |
EP2130118A1 (en) | 2009-12-09 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN101652747B (zh) | 并行dll树初始化 | |
US5734904A (en) | Method and system for calling one of a set of routines designed for direct invocation by programs of a second type when invoked by a program of the first type | |
CN100492301C (zh) | 避免软件冲突的方法和系统 | |
US7461241B2 (en) | Concurrent physical processor reassignment method | |
US20060095483A1 (en) | Modified computer architecture with finalization of objects | |
US9563446B2 (en) | Binary file generation | |
US20050262513A1 (en) | Modified computer architecture with initialization of objects | |
EP1763771A1 (en) | Modified computer architecture with finalization of objects | |
JP2015503161A (ja) | ヘテロジニアス並列処理プラットフォームのためのソフトウェアライブラリ | |
CN103999036A (zh) | 在支持事务的计算机体系结构中使用异常进行代码专业化的方法和系统 | |
KR101059633B1 (ko) | 멀티태스킹 가상 머신을 위한 힙 구성 | |
US7272712B1 (en) | Data structure and method for managing modules associated with a kernel | |
JP4763598B2 (ja) | プロセッサおよびデバイス | |
JP2009514043A5 (zh) | ||
US9141353B2 (en) | Dynamically building locale objects at run-time | |
US6757679B1 (en) | System for building electronic queue(s) utilizing self organizing units in parallel to permit concurrent queue add and remove operations | |
US7900217B2 (en) | Dynamic DLL cycle resolution | |
US20230315456A1 (en) | Processing apparatus | |
US20070220508A1 (en) | Mapping of Dynamic Link Libraries in a Computing Device | |
CN114911528A (zh) | 分支指令处理方法、处理器、芯片、板卡、设备及介质 | |
US9792093B2 (en) | Dynamically building subsections of locale objects at run-time | |
CN104536740A (zh) | 计算平台的异质处理器之间的共享虚拟存储器中的虚函数共享 | |
Halvorsen et al. | The I/O Kit Framework | |
GB2563841A (en) | Data processing | |
JPH0764773A (ja) | プログラムローディング方法及び情報処理装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
ASS | Succession or assignment of patent right |
Owner name: MICROSOFT TECHNOLOGY LICENSING LLC Free format text: FORMER OWNER: MICROSOFT CORP. Effective date: 20150728 |
|
C41 | Transfer of patent application or patent right or utility model | ||
TA01 | Transfer of patent application right |
Effective date of registration: 20150728 Address after: Washington State Applicant after: MICROSOFT TECHNOLOGY LICENSING, LLC Address before: Washington State Applicant before: Microsoft Corp. |
|
C14 | Grant of patent or utility model | ||
GR01 | Patent grant | ||
CF01 | Termination of patent right due to non-payment of annual fee | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20160817 |