CN1672150A - 用于软件原子化的视图 - Google Patents
用于软件原子化的视图 Download PDFInfo
- Publication number
- CN1672150A CN1672150A CNA038173417A CN03817341A CN1672150A CN 1672150 A CN1672150 A CN 1672150A CN A038173417 A CNA038173417 A CN A038173417A CN 03817341 A CN03817341 A CN 03817341A CN 1672150 A CN1672150 A CN 1672150A
- Authority
- CN
- China
- Prior art keywords
- atom
- database
- merging
- code
- map function
- 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.)
- Pending
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/60—Software deployment
- G06F8/65—Updates
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/25—Integrating or interfacing systems involving database management systems
- G06F16/258—Data format conversion from or to a database
-
- Y—GENERAL 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
- Y10—TECHNICAL SUBJECTS COVERED BY FORMER USPC
- Y10S—TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y10S707/00—Data processing: database and file management or data structures
- Y10S707/99941—Database schema or data structure
- Y10S707/99942—Manipulating data structure, e.g. compression, compaction, compilation
-
- Y—GENERAL 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
- Y10—TECHNICAL SUBJECTS COVERED BY FORMER USPC
- Y10S—TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y10S707/00—Data processing: database and file management or data structures
- Y10S707/99941—Database schema or data structure
- Y10S707/99943—Generating database or data structure, e.g. via user interface
-
- Y—GENERAL 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
- Y10—TECHNICAL SUBJECTS COVERED BY FORMER USPC
- Y10S—TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y10S707/00—Data processing: database and file management or data structures
- Y10S707/99941—Database schema or data structure
- Y10S707/99944—Object-oriented database structure
Abstract
用于软件原子化的视图提供对原子数据库中的现有原子的运行时变换,以创建新的或虚拟原子数据库。视图提供对存储于原子数据库的代码和数据原子的共享,以及提供对载入存储器中的代码和数据原子的共享。一个视图是一组变换操作,包括插入一个新原子,修改一个现有原子,或者删除一个现有原子,可以将该组变换操作应用于原子数据库。可以真实地应用所述变换操作,以在磁盘上创建一个新的原子数据库,或者可以虚拟地应用所述变换操作,以在运行时创建一个虚拟原子数据库,而不必实际在磁盘上创建一个真实的原子数据库。可以用各种方法来完成对现有原子的修改,包括改变原子字节,或者原子引用,或者原子属性。
Description
相关申请
本申请是2002年6月21日申请的美国申请号10/178,898的继续申请,在此将其并入本项申请中作为参考。
背景技术
计算机软件通常是为解释语言系统或编译语言系统创建的。解释语言系统将高级程序语句翻译成可执行形式,并且每次执行一条语句,而不是在执行之前全部翻译(即编译)高级语句。通常运用Basic、LISP和APL作为解释语言。编译语言系统在执行之前将高级程序语句翻译成中间的目标代码格式。在编译语言系统中,程序语句用源代码程序设计语言(如C、C++)来编写。源代码包括用不能由计算机直接执行的高级或汇编语言编写的人可读程序语句。源代码是由编译器进行处理,编译器通过遵循一组句法和语义规则将源代码变换成目标代码(如OBJ文件)。然后,利用链接程序将目标代码连接起来,以生成可执行的计算机程序(如EXE文件)。
可执行计算机软件在存储到磁盘上和载入计算机存储器中时会很大。动态链接库(“DLL”)提供一种机制来存储与可执行的计算机主程序独立的可执行例程和数据。可执行例程在可执行计算机程序需要时才会被加载。当使用例程或数据时,DLL通过仅仅使用存储器来节省空间。DLL还规定与可执行的计算机主程序独立的、以及与其他DLL独立的计算机代码和数据的组织和管理。这允许程序员仅对DLL中的某些例程进行纠正或改进,而不影响对调用的计算机程序或任何其他DLL的操作,还不需要对调用程序或任何其他DLL重新编译。此外,DLL还可以在多个计算机程序之间进行共享。DLL本身会是很大又很多的可执行例程,由于其单片性,DLL在下载、更新和加载方面不是非常粒状(granular)的。
存在这样一些技术,用于最小化与更新大的DLL或其他代码/数据有关的传送时间。使用差分检测算法(如rsync)的文件传送协议,能够减少传送时间。这些算法可以将源文件和目标文件排列成数据块,对这些块进行分析,并仅仅传送在源文件和目标文件之间不同的块。
还可以使用压缩来减少通信介质上和从磁盘到存储器的代码和数据的传送时间。尤其对可执行代码尺寸敏感的嵌入式处理器系统已经实现,它对可执行代码实施压缩。可以使用代码的压缩的“线(wire)”表示,但是在执行之前必须对代码进行解压。其他技术规定直接执行压缩代码(如“字节编码的(byte-coded)RISC”或“BRISC”虚拟机(virtual machine))。
CurlTM语言将设计、脚本编写和程序设计能力合并在一个集成环境中。通过将该具有完全特征的语言与客户端的执行相组合,CurlTM技术在Web上传送快速、有效和功能强大的应用程序,并且能够实现使客户端和服务器互操作的交互式Web服务能力。利用增加了CurlrM插件和CurlTM运行时环境的Web浏览器来显示CurlTM内容。CurlTM运行时环境是非典型的运行时环境,因为它是从近似等量的代码和数据进行编译的。利用大量的DLL,CurlTM运行时环境才得以实现。
发明内容
包括一些大的可执行程序和/或大的共享库(DLL)的计算机系统在存储在磁盘上和载入存储器中时会出现容量问题。此外,在运载(shipped)时,对这些系统进行更新或修补需要扩展带宽,因此,常常造成在客户端存储关于代码和/或数据的多个、近乎一样的副本。这确实如此,因为计算机系统通过各种递增的版本发展,用户需要同时对多个版本进行支持。
原子数据库的视图通过提供对原子数据库中的现有原子的运行时变换来创建新的或虚拟原子数据库,使这些问题得到解决。视图提供了对原子数据库中所存储的代码或数据的共享,还提供对载入存储器的代码或数据的共享。原子是代码或数据的细粒的(fine-grained)可寻址单元,包括永久标识符、代码/数据字节和对其他原子的引用。这些原子存储在原子数据库中。本专利申请与由Mathew J.Hostetter和Benjamin R.Harrison于2002年6月3日申请的、名称为“软件原子化”的共同未决的美国专利申请No.10/161,964有关,在此合并其全部所教内容作为参考。
视图是一组变换操作,包括插入一个新原子,修改一个现有原子,或者删除一个现有原子,这些操作可以应用于原子数据库。对于未修改也未删除的原子,重用操作(reuse operation)是固有的。变换操作可以用于,要么真实地(literally)在磁盘上创建一个新原子数据库,要么虚拟地(virtually),在运行时创建一个虚拟原子数据库,而不必实际上在磁盘上创建一个真实的原子数据库。修改现有原子可以用各种方法,包括改变原子字节,或者原子引用,或者原子属性。如果需要,甚至可以将视图破坏性地应用于在适当位置对原子数据库进行修改。
不同类型的视图变换具有不同的优缺点。虚拟地将视图应用于创建虚拟原子数据库需要较少的磁盘空间来存储这些原子,但是在运行时较慢,因为每次加载一个原子都要进行变换操作。好处是保留了变换信息,并且可以使用变换信息以在各种视图之间共享原子。真实地将视图应用于创建虚拟原子数据库需要较多的磁盘空间来存储这些原子,但是在运行时较快,因为已经应用了这些变换。这允许直接加载变换过的原子,但是丧失了在各种视图之间共享原子的能力。即使不能共享原子数据库,每个可执行的原子数据库可以以原子数据库的不同副本来运行。真实地将视图应用于重写(overwrite)现有的原子数据库节省了磁盘空间,并且在运行时较快,但是一旦应用变换,变换信息就丢失,因此,在各种视图之间不再共享原子数据库。对于所有情况都为最佳的单一选择是没有的。每个计算机程序环境必须权衡各种视图选择的优缺点,以便选择整体上最佳的解决方案来满足特定的性能需求。
映射表是一种简单的视图形式,表中唯一的操作是修改操作,并且表中那些修改操作仅能用另一原子的原子字节和原子引用来替换现有原子的原子字节和原子引用(称作替换操作)。它可以用于(真实地或虚拟地)完全用另一原子来替换现有原子,然而却保留同样的原子标识符。这考虑到可能具有对老的原子的原子引用的任何其他原子“自动地”引用替换它的原子。因为映射表用另一原子来替换现有原子,它们能够随意完成有兴趣的修改操作,比如将一些原子字节从英语变换为日语,或者将一些原子引用从懒惰的(lazy)变到急切的(eager)。
创建原子数据库的视图的方法包括定义一组变换操作和将这组变换操作应用到原子数据库。当虚拟地应用这些变换操作时,在运行时就建立了一个虚拟原子数据库,而当真实地应用这些变换操作时,建立了一个新的原子数据库。原子数据库存储原子,原子包括永久分配的原子标识符、计算机代码和/或数据以及对其他原子的引用。可以将新的原子数据库存储在与原子数据库独立的文件中,或者可以替换原始原子数据库。变换操作包括插入一个新原子的插入操作、修改一个现有原子的修改操作、以及/或删除一个现有原子的删除操作。
视图可用于以多种方式来共享原子数据库中的原子。通过将该视图和原子数据库与第一可执行程序和第二可执行程序相关联,单个视图可用于共享存储于原子数据库中的原子。利用视图虚拟地在运行时变换原子数据库,以创建一个虚拟原子数据库。然后,由第一可执行程序和第二可执行程序将来自虚拟原子数据库的原子加载,因此,在第一可执行程序和第二可执行程序之间共享了该原子。当把原子载入第一可执行程序可访问的第一存储缓冲区以及把原子载入第二可执行程序可访问的第二存储缓冲区时,提供磁盘共享。当把原子载入第一可执行程序和第二可执行程序均可访问的存储缓冲区时,提供存储器共享。
通过将第一视图和原子数据库与第一可执行程序相关联,并将第二视图和原子数据库与第二可执行程序相关联,可以利用多个视图来共享原子数据库中的原子。在运行时,利用第一视图和第二视图虚拟地对原子数据库进行变换,以创建第一虚拟原子数据库和第二虚拟原子数据库。通过第一可执行程序利用第一视图和通过第二可执行程序利用第二视图对来自虚拟原子数据库的原子进行加载,因此,在第一可执行程序和第二可执行程序之间共享了该原子。当把原子载入利用第一视图第一可执行程序可访问的第一存储缓冲区,以及把原子载入利用第二视图可由第二可执行程序访问的第二存储缓冲区时,可提供利用多个视图的硬盘共享。对于不受任何视图影响的原子来说(即,没有对它们进行修改),当把原子载入利用第一视图第一可执行程序和利用第二视图第二可执行程序均可访问的存储缓冲区时,可提供利用多个视图的存储器共享。
视图可作多用。基于原子将在其上运行的计算机硬件和/或软件系统的优化特征,可以对变换操作进行定义,以便定制性能。定义变换操作以便限制对由这些原子所提供的某些特征的访问,以便提供具有所定制的特征集的版本。
原子还可以包括一个原子特征,因而原子变换操作能够改变原子特征。比如,代码原子可以通过修改其调试信息来变换。
可以将该组变换操作应用于虚拟原子数据库,以便在一个视图上应用一个视图。
映射表是一种简单的视图,其中该组变换操作仅包括以第二原子替换第一原子的修改操作。替换操作是一种虽简单但又高效的机制,用于有效地将所有引用从一个原子改变到另一原子。
包括一个视图的这组变换操作可以由程序员手动创建,或者由过程自动生成。用于创建将第一原子数据库变换为第二原子数据库的一组原子变换操作的方法包括,利用一个标准的原子共享算法规范化第一原子数据库和第二原子数据库,其中存储原子的第一原子数据库和第二原子数据库中的每一个都包括一个永久分配的原子标识符、计算机代码和/或数据和对其他原子的引用。确定(identify)在第一原子数据库的原子和第二原子数据库的原子之间的一组目标合并。*确定辅助目标合并的、在第一原子数据库的原子和第二原子数据库的原子之间的一组辅助合并。当这组目标合并不为空时,重复以下步骤:在这组辅助合并中选择最佳合并、提交(commit)所选择的最佳合并、更新这组目标合并以及更新这组辅助合并。
不为重用合并或者不是辅助所提交的重用合并的每一个所提交的合并并非都完成。如果创建唯一兼容的合并,就将这些唯一兼容的合并加到这些目标合并,将一个无限权重指定给其中一个唯一兼容的合并,以及转到确定一组辅助合并的步骤。应用使用了第一数据库和第二数据库的修改过的原子共享算法,以便确定剩余的同构(isomorphism)。如果创建了唯一兼容的合并,就将这些唯一兼容的合并加到这些目标合并,将一个无限权重指定给其中一个唯一兼容的合并,以及转到确定一组辅助合并的步骤。如果创建了任何兼容的合并,就提交具有最大权重的兼容合并,将一个无限权重指定给所提交的兼容合并,将所提交的兼容合并加到这组目标合并,以及转到确定一组辅助合并的步骤。这些所提交的合并可以包括一个修改/替换合并、一个插入合并和/或一个删除合并。这些合并是一个视图中的实际变换操作。
在各版本中共享代码和数据节省了磁盘存储和存储器使用。允许代码和数据在各版本中共享,还提供保持独立版本和避免手动创建在各版本之间的“包装程序(wrapper)”接口。包装程序的目的是创建新代码的向后兼容版本,这样,在客户端不再需要保留关于代码的老版本。包装程序是为了尽力避免程序的多个版本的系统开销,每个版本包含基本上相同的代码的庞大主体。用于软件原子化的视图,通过允许代码和数据在程序的各版本之间自动共享,消除了包装程序的必要,并在软件程序版本的设计中允许具有更大的体系结构自由。
附图说明
以下对如在附图中图示的本发明优选实施例进行更为详细的说明,从中将更易于理解有关本发明的前述和其他的对象、特征和优点,附图中相同附图标记指示在所有不同视图中的相同部分。这些图未必是按比例画出,重点是在于说明本发明的原则。
图1是关于其上实现本发明的一个实施例的一种计算机系统的图示。
图2是关于在图1的计算机系统中的一种计算机的内部结构的图示。
图3说明用于创建和加载计算机程序以在运行时显示输出的一种传统过程。
图4说明用于创建和加载原子化的计算机程序以在运行时显示输出的一种软件原子化过程。
图5说明一种原子提取过程。
图6a是关于原子、原子数据库、视图和虚拟原子数据库的图示。
图6b是关于原子、原子数据库、视图和独立的新原子数据库的图示。
图6c是关于原子、原子数据库、视图和重写的新原子数据库的图示。
图7a是关于利用单个视图并共享磁盘上的原子的多个可执行程序的图示。
图7b是关于利用单个视图并共享磁盘上和存储器中的原子的多个可执行程序的图示。
图7c是关于利用多个视图并共享磁盘上的原子的多个可执行程序的图示。
图7d是关于利用多个视图并共享磁盘上和存储器中的原子的多个可执行程序的图示。
图8说明一种原子管理过程。
图9是关于一种原子数据库数据结构的图示。
图10是关于一种原子映射表首部数据结构的图示。
图11是关于一种原子映射表数组数据结构的图示。
图12是关于一种原子偏移序列数据结构的图示。
图13是关于一种编码原子数据结构的图示。
图14是关于一种编码原子引用数据结构的图示。
图15是关于一种有6个代码过程和3个数据元素的实例系统的图示。
图16a是关于实例数据原子的图示。
图16b是关于实例代码原子的图示。
图16c是关于实例替换代码原子的图示。
图17a是关于一种原子数据库差分过程的图示。
图17b是关于表示老的原子数据库和新的原子数据库的图表的图示。
图17c是关于表示可选择的老的原子数据库和新的原子数据库的图表的图示。
具体实施方式
下面说明本发明的优选实施例。这些优选实施例适用于原子化执行CurlTM运行时环境的计算机程序,CurlTM运行时环境执行原子化CurlTM运行时的适当部分,以处理用CurlTM语言、脚本或非CurlTM程序编写的软件。
图1是关于其上实现本发明一个实施例的一种计算机系统的图示。客户端计算机50和服务器端计算机60提供用于原子化和执行原子化了的计算机程序的处理、存储和输入/输出装置。这些客户端计算机50还能通过通信网70链接到其他计算机装置,包括其他客户端50和服务器端计算机60。通信网70可以是因特网的一部分,为全球范围的大量计算机、网络和网关,通常使用TCP/IP协议组来进行彼此通信。因特网提供主要节点或主机之间的高速数据通信线路的主干,包括数千的商业、政府、教育和其他计算机网,对数据和消息进行路由。在本发明的另一实施例中,可以在独立的计算机上实施用于原子化和执行原子化了的计算机程序的处理、存储和输入/输出装置。
图2是关于在图1的计算机系统中的一种计算机(如50、60)的内部结构的图示。每台计算机包括一个系统总线200,总线是一组硬件线路,用于在计算机的各部分传送数据。总线200本质上是连接计算机系统的不同组件(如处理器、磁盘存储器、存储器、输入/输出端口、网络端口等)的共享管道,能使信息在这些组件之间传送。I/O装置接口202,连在系统总线200上,用于连接各种输入和输出装置(如显示器、打印机、扬声器等)。网络接口206允许计算机连接到各种连在网上(如网络70)的其他装置。存储器208为用于实现本发明实施例的计算机软件指令(如原子提取器程序150和原子管理程序160)和数据结构(如原子数据库120)提供可变存储。磁盘存储器210为用于完成本发明实施例的计算机软件指令(如原子提取器程序150和原子管理程序160)和数据结构(如原子数据库120)提供非可变存储。
中央处理器204也连在系统总线700上,为执行计算机指令(如原子提取器程序150和原子管理程序160)作准备,因此允许计算机原子化和执行原子化了的计算机程序。
图3说明用于创建和加载计算机程序以在运行时显示输出的一种传统过程。源节点102是由计算机程序员利用源节点程序设计语言(如C、C++)生成。编译器104处理源节点,并生成目标代码106文件。利用链接程序108来链接一个或多个目标代码106文件,以生成链接程序段(linker section)109。将链接程序段109合并以生成可执行代码110。可执行代码110可以作为独立的可执行程序(如EXE文件)或者作为共享的代码库(如DLL文件)进行链接。为了执行,加载程序112将可执行代码110载入存储器,以便生成运行时显示114。
图4说明用于创建和加载原子化的计算机程序以在运行时显示输出的一种软件原子化过程。如利用传统的处理,源节点102是由计算机程序员利用源节点程序设计语言(如C、C++)生成。编译器104处理源节点,并生成目标代码106文件。按通常方式将源代码102编译为目标代码106文件之后,原子提取器150对目标代码106文件进行处理,以识别原子130。将细粒的(fine-grained)、可独立编址的原子130放于原子数据库120中,每个原子130收到一个唯一的原子标识符132。细粒的原子130用于定义任意整数字节的代码和数据。将代码和数据的引用变换为原子标识符引用。比如,通过原子标识符132,将代码内的过程调用变换成调用其他原子130。通过原子标识符132,还将数据引用变换为数据原子引用。
原子提取器150浏览代码文件106,并从代码中创建原子130。需要从目标代码文件106中提取原子130的信息已在目标文件中得以实施,由于事实上传统加载程序需要同样的信息以便加载和调用过程并优化只读数据。需要从目标代码文件106中提取多个数据原子的信息需要分离各种原子数量。分离可以由一些传统编译器(如gcc)自动完成,或者明确通过程序员标记源代码中的数据数量(如编译器指示)来完成。在运行时,原子管理程序160从原子数据库120中访问原子130,并且为了执行,将其载入存储器。然后,在执行时,被加载的原子130可以生成运行时显示114,或程序将其设计的任何其他结果。原子管理程序160可以基于静态代码分析或动态配置(profiling)确定用于加载原子130的优化顺序。通过依靠编译器创建目标代码文件106的独立部分,可以使原子化处理自动完成,而不必手动分解和分析。编译器的使用提供了用于创建独立的代码和数据部分的一种选择,可选择的是可将其他程序用于处理源文件以生成原子130。
图5说明一种原子提取过程。在步骤302处,接收目标代码格式的计算机程序代码和/或数据。在步骤304处,从目标代码格式的计算机程序代码和/或数据中提取计算机程序代码和/或数据信息。在步骤306处,从目标代码格式的计算机程序代码和/或数据中提取计算机程序代码和/或数据引用信息。在步骤308处,修改计算机程序代码和/或数据引用信息,以使用原子标识符。最后,在步骤310处,将计算机程序代码和/或数据和计算机程序代码和/或数据引用信息存储在一个原子中,该原子包括:一个原子标识符;计算机程序代码和/或数据;以及计算机程序代码和/或数据引用信息。
图6a是关于原子、原子数据库、视图和虚拟原子数据库的图示。从概念上可以把原子数据库120视为原子130的定向(directed)图。原子字节134(节点)由原子标识132(节点标识)识别,并由原子引用136(边缘)链接。原子数据库120存储原子130。每个原子130都由唯一的原子标识132识别。对于每个原子,代码和/或数据都被表示为原子字节134。可以对原子130进行压缩,包括原子字节134和原子引用136内的代码和/或数据。在某些情况下,解压缩比读盘时间短,所以,压缩和解压缩过程提供了明显的性能改进以及减少的存储器和磁盘存储空间。通过使用变换操作,虚拟地将存储原子(如原子141、142、143、144)的原子数据库120变换为存储原子(如141、142、143、144、145、146)的虚拟原子数据库121。插入操作增加原子146,而替换操作将原子143替换为原子145(这样,原子144就调用原子145)。虽然通过视图122访问原子数据库120(即访问虚拟原子数据库121)的程序(如可执行程序158)将会访问调用原子145的原子144,但是直接访问原子数据库120的可执行程序156将会访问调用原子143的原子144。这样,可以维持多版本的原子软件,而不必存储关于相同原子的另外副本(如141、142)。
原子130是由永久原子标识符132(标识符)唯一识别的代码段或数据元素。代码原子130典型与源语言(如C/C++)过程类似。数据原子130是数据元素,并且可以为任意大小。原子130在需要时被拉入存储器(如只读代码缓冲区170、只读数据缓冲区180、读写数据缓冲区190),并且可以在不再需要时被换出。原子标识符132的永久性质提供这样一种能力,通过确定某些原子130已经存在并且由永久原子标识符132来识别,基于现有版本来设计新版本。这提供了基于来自现有版本的增量的递增版本。
可以对原子数据库120中的原子130进行修改,以影响所期望的程序设计变化(如更新代码、数据、引用和/或特性)。修改操作的一个重要子集是替换操作,其中利用视图122将一个原子130用另一原子130替换,用于在磁盘上和/或存储器中共享原子130。当用不同原子130替换或更新引用原子时,替换原子允许引用原子130的代码和/数据保持不变。视图122可以将引用从一个原子标识符132变换为另一原子标识符132。视图122还可以包括影响原子130的其他数据、引用和/或特性的变换操作。
可以在原子数据库120上定义多个视图122,从而允许可执行程序156以各种方式访问和共享原子130。这样,利用用于原子化的视图的可执行程序156可能不按原子数据库120的特定视图122执行。比如,视图122和原子数据库130可以通过执行命令行“MyApplication.exe-dATOM.DB-v1.1”与可执行程序156相关联。可执行程序156“MyApplication.exe”可以包括存根(stub)来调用原子加载程序(如原子管理程序160),以访问在利用在视图文件“1.1”中定义的视图122创建时,在视图版本“1.1”中定义的原子130。
创建视图122的变换操作包括生成一组从一个原子数据库120到另一原子数据库120的原子130的差分。因为原子130能够在各种视图122之间共享,利用单个原子数据库120,可以维持产品的多个版本。
可以将计算机软件的新版本编成包含变化操作的视图122。变换操作可以定义两个物理原子数据库120之间、或者虚拟数据库121和物理原子数据库120之间、或者一对虚拟原子数据库121之间的差别。这样,就可以基于先前的软件版本来构建软件版本。
图6b是关于原子、原子数据库、视图和独立的新原子数据库的图示。视图122可以将原子数据库120变换成新的原子数据库120。在图6a讨论中所描述的情况下,当访问原子并将其载入存储器时,通过变换原子引用、数据和/或特性,变换创建虚拟原子数据库121。可以用相同过程来创建新的物理原子数据库123。这样,变换操作仅需进行一次,而独立的新原子数据库123可用被变换的原子130的映像(image)来创建。独立的新原子数据库123存储被重用的(即未被修改也未被删除)、来自原子数据库120的所有原子130的副本,存储作为插入操作的结果而被插入的所有新原子130,以及存储作为修改操作的结果而被修改的原子130。独立的新原子数据库123提供更新原子数据库120的另一非破坏性方式。
图6c是关于原子、原子数据库、视图和重写的新原子数据库的图示。视图122可以将原子数据库120变换成新的原子数据库120。新原子数据库120可以是虚拟原子数据库121(如图6a所示)或者是独立的新原子数据库123(如图6b所示)。新原子数据库120还可意重写现有的原子数据库120,以创建被重写的新原子数据库123。当利用独立的新原子数据库123,变换操作仅需进行一次,而被重写的新原子数据库123可用被变换的原子130的映像来创建。被重写的新原子数据库123保留被重用的(即未被修改也未被删除)、来自原子数据库120的所有原子130的副本,存储作为插入操作的结果而被插入的所有新原子130,以及存储作为替换操作的结果而被替换的原子130。可以进行删除操作,以将未用的原子从被重写的新原子数据库123中除去。被重写的新原子数据库123提供更新原子数据库120的一种破坏性方式。
图7a是关于利用单个视图并共享磁盘上的一个原子的多个可执行程序的图示。在运行时,本发明的一个实施例避开用于加载共享库(即DLL)的传统机制,而采用更为有效的原子机制,以原子130的粒度(granularity)加载,而不用比如4K的存储器块。原子管理程序160在需要时将原子130从原子数据库120加载。原子管理程序160分配存储器,然后,管理缓冲区中的原子130(如原子141)。原子提取器150,对于原子管理程序160,先前已对非直接通过原子130的过程调用进行过修改,原子管理程序160定位在存储器中的现有原子130或者如果它们还未被加载,将它们从原子数据库120加载。
缓冲区管理提供几种好处,包括:有限的存储器使用、减少的交换和无休止互交换(thrashing)以及减少的启动次数。有限的存储器使用将存储器使用限制在任意特定的大小。比如,对于代码原子130,可能精确地定义8MB存储器,因而当需要更新的原子时,可能将较老的原子130换出。通过限定存储器使用,本发明的实施例减少了交换和无休止互换,因而程序不必利用其存储器管理机制来管理存储器的过多使用。程序的存储器管理固有较低效率,因为它是通用的而非调整为专用。通过准确加载所需代码,而不必仅因为其他代码在共享库的“附近(nearby)”而将其加载,将会减少存储器开销。原子管理程序160减少启动次数。当需要新原子130时,将原子加载并执行。因此,不必等整个代码集加载到存储器中,就立刻执行代码。本发明的实施例开始执行代码原子130,其在下载完成之前被下载(受到仍然还未被发送的原子130的可用性的限制)。
原子管理程序160管理三种缓冲区:只读代码缓冲区(如176、178)、可用于数据常量的只读数据缓冲区(如186、188)和可用于全局数据的读写数据缓冲区(如196、198)。因为读写数据可能为任意长度,并且不可以将其从原子数据库120重新加载,它的大小可以不受限定,因此,对于它的管理,可以利用程序的虚拟存储器系统。
如果能够确定原子是相关的,将原子130一次一个载入缓冲区不如同时将原子130的工作集(working set)加载有效。用工作集协调程序(working set tuner)来确定哪些原子130形成“工作组(workinggroup)”。对于原子化环境,使工作集协调程序适于收集信息。一旦收集到信息,就使用某种机制来利用信息,如原子数据库120内的指明原子130彼此关系的指示。本发明的实施例提供对磁盘上的原子130重新排序的能力,以匹配特定的加载序列,因而提供更快的加载。
通过原子管理程序对只读代码缓冲区176、178的管理,提供了某些加载优化。当一个原子130对另一原子130进行过程调用时,通常通过原子管理程序160利用存根间接进行调用。当修改调用程序(caller)的代码的存储器内映像以直接跳(“快速链接(linksnapping)”)至目标原子130时,过程调用会更快。然而,一旦快速链接起来,原子管理程序160不使链接无效就不能去除或换出目标原子130。对于被频繁调用的原子130,这是值得做的权衡。由原子管理程序160使用工具来确定哪些原子130有资格直接调用,以及有资格将原子130锁入存储器中。在运行时,通过将代码/数据锁在存储器中,或者在编译时,通过标记在运行时未使用存根的某些原子引用136,可以进行快速链接的分析。原子数据库视图122和存根/快速链接的组合提供一些选择来调谐系统特性以满足所需性能要求。
许多可执行程序156、158可以访问相同的虚拟原子数据库121(或新的原子数据库123),以共享代码和/或数据。比如,可执行程序156调用代码原子141。可执行程序158也调用代码原子141。代码原子141的副本是从磁盘读出,并被载入每个程序的只读存储缓冲区176、178。然后,可执行程序156、158可以直接调用被加载的代码原子141。这样,可能来自不同产品和/或不同产品版本的多个不同的可执行程序156、158共享存于原子数据库120中的磁盘上的原子130(如原子141)。
图7b是关于利用单个视图并共享磁盘上和存储器中的一个原子的多个可执行程序的图示。在该实例中,许多可执行程序156、158共享缓冲区(如只读代码缓冲区170和只读数据缓冲区180)。当第一可执行程序(如可执行程序156)调用原子141时,原子管理程序160将原子141载入只读代码缓冲区170。当下一可执行程序(如可执行程序158)调用原子141时,原子管理程序160可以确定原子141已被加载。这样,多个不同的可执行程序156、158共享存于原子数据库120中的存储器里的代码原子130(如原子141),从而提供对在许多执行程序之间的原子的同时重用。应用关于共享只读代码缓存器170的可执行程序的某些限定,比如,不能用被共享的代码原子迅速建立链接。当因为正使用仅仅一个视图122,可以共享原子144时,另外的共享也是可能的。因此,可执行程序156、158都可以使用相同的视图122,并且可以共享被修改的原子144副本。
图7c是关于利用多个视图并共享磁盘上的一个原子的多个可执行程序的图示。在该实例中,许多可执行程序156、158各自都有自己的缓冲区(如只读代码缓冲区176、178,只读数据缓冲区186、188,以及读写数据缓冲区196、198)。此外,每个可执行程序156、158利用关于基础(underlying)原子数据库120的不同视图122、125访问不同的虚拟原子数据库121、124。视图122创建虚拟原子数据库121,在该库中代码原子141对调用144的代码原子142进行调用。视图125创建虚拟原子数据库124,在该库中代码原子141对调用145的代码原子142进行调用。当可执行程序156、158调用代码原子141时,这些程序通过其各自的视图(即视图122、125)访问原子数据库120,以便创建虚拟原子数据库(即虚拟原子数据库121、124)。然后,可执行程序156、158,通过将原子141的副本载入各自的缓冲区(如只读代码缓冲区176、178)中,可以共享原子141的磁盘副本。当可执行程序156的被加载的代码原子141运行时,程序将会对将被载入可执行程序156的只读代码缓冲区176中的代码原子142进行访问。代码原子142未经修改就被载入只读代码缓冲区176中。当可执行程序158的加载代码原子141运行时,程序将会对将被载入可执行程序158的只读代码缓冲区178中的代码原子142进行访问。将会从原子数据库120中加载代码原子142,原子数据库120具有如在视图125中定义的被变换的原子引用。这样,百分之一的代码原子141得以共享,并且可以共享大部分的代码原子142。对于代码原子142,将共享所有的代码字节,也将会共享大部分引用,因为仅仅单个引用被改变。在加载代码原子142时,区别是因为事实上每个可执行程序156、158利用不同的视图122、125来访问原子130。这样,多个不同的可执行程序156、158从磁盘共享存储于原子数据库120中的代码原子130(如原子141),同时用于修改如由不同视图122、125所定义的其他原子130。
图7d是关于利用多个视图并共享磁盘上和存储器中的一个原子的多个可执行程序的图示。在该实例中,许多可执行程序156、158维持独立的缓冲区(如只读代码缓冲区176、178,只读数据缓冲区186、188,以及读写数据缓冲区196、198),还共享一些缓冲区(如只读代码缓冲区170和只读数据缓冲区180)。此外,每个可执行程序156、158利用不同的视图122、125访问不同的虚拟原子数据库121、124。视图122创建虚拟原子数据库121,在该库中代码原子141对调用144的代码原子142进行调用。视图125创建虚拟原子数据库124,在该库中代码原子141对调用145的代码原子142进行调用。虚拟数据库124可以通过将视图125应用于虚拟数据库121来创建,在这种情况下,变换操作将会已经用145替换了原子143。当可执行程序156、158调用代码原子141时,这些程序通过视图(如视图122、125)访问原子数据库120,以便创建虚拟原子数据库(如虚拟原子数据库121、124)。实际上,每个虚拟原子数据库121和124都可以共享相同的基本物理原子数据库120。然后,可执行程序156、158可以通过将副本载入被共享的缓冲区—只读缓冲区170中,共享原子141的磁盘副本和存储器副本。当可执行程序156加载代码原子141时,原子将会被载入只读代码缓冲区176中。当可执行程序158加载代码原子142时,原子将会被载入只读代码缓冲区178中。尽管可执行程序156和可执行程序158可以共享磁盘,它们不能完全共享代码原子142,可以将原子载入共享的只读缓冲区170中用于其他调用程序使用。加载的区别是因为事实上每个可执行程序156、158利用不同的视图122、125来访问原子130,因此,应用不同的变换。这样,多个不同的可执行程序156、158从磁盘和存储器中共享存于原子数据库120中的代码原子130(如原子141),同时用于替换如由不同视图122、125所定义的其他原子130。
图8说明一种原子管理过程。在步骤321处,访问视图122,以便对作为加载目标的原子应用任何需要的变换。变换可以包括修改原子引用、原子代码/数据(字节)和/或原子特征。在步骤322处,原子管理过程通过将原子从原子数据库载入存储器来管理原子化的计算机程序代码和/或数据,原子包括一个原子标识符;计算机程序代码和/或数据信息;以及计算机代码和/或数据引用信息。然后,在步骤324处,修改计算机代码和/或数据引用信息,这样,存储器地址代替了原子标识符和偏移。
图9是关于一种原子数据库数据结构的图示。原子数据库120存储原子130。原子130对于单个数据,如被编译的过程或字符串常量。原子130在需要时被从原子数据库120载入存储器中。这减少了存储器占用空间和磁盘I/O。原子数据库120是从原子标识符132值(整数)到原子130的映射。原子标识符132可以被表示为识别原子130的一个31位整数。可以以任意顺序加载原子130。对原子数据库120的磁盘上的表示进行优化,以节省空间和最小化将原子130载入存储器所需的I/O。原子数据库120还提供从原子标识符132值到与相应的原子130有关的信息的映射,如符号和调试信息。原子数据库120是这样一个文件,包括几个不同部分,每部分具有可变大小,这些部分包括一个DB-首部350和一些原子映射表360。在各种实施例中,原子映射表360可以包括:一个主体原子映射表(body-atom-map)、一个符号原子映射表(symbol-atom-map)、一个类别原子映射表(category-atom-map)以及一个描述原子映射表(description-atom-map)。首先是DB-首部350,而其他表的顺序、位置和数量都是任意的。对于其他部分的每一个,DB-首部350包括文件偏移。
DB-首部350正是在数据库文件中最靠前的内容。它包括关于文件和其他部分位置的一些全局信息,包括:幻数(magic-number)、版本号、cpu类型、os类型、主体原子映射表偏移、符号原子映射表偏移、类别原子映射表偏移以及描述原子映射表偏移。
幻数识别该文件为原子数据库120,还定义文件中所有其他的多字节数的终止端(endianness)。如果按小的终止(endian)字节顺序来存储数据库:0xD7 0x15 0xFF 0x31,幻数包括这4个字节。对于一个大的终止文件,倒换这些字节:0x31 0xFF 0x15 0xD7。这个字节顺序没有特殊含义。将总是以处理器的本来终止端(native endianness)来存储数据库文件,它包含处理器代码。这避免了在运行时需要浪费的字节交换。然而,幻数明确指定了终止端,所以,跨平台工具可以控制原子数据库120。
版本号指明数据库所用的文件格式的版本。
CPU类型指明生成数据库的CPU类型(如Pentium、PowerPC等)。
OS类型是生成数据库的操作系统的类型(如Win32、Linux、MacOS等)。
主体原子映射表偏移是相对于文件起始处,主体原子映射表部分开始的文件偏移。
符号原子映射表偏移是相对于文件起始处,符号原子映射表部分开始的文件偏移。
类别原子映射表偏移是相对于文件起始处,类型原子映射表部分开始的文件偏移。
描述原子映射表偏移是相对于文件起始处,描述原子映射表部分开始的文件偏移。
图10是关于一种原子映射表首部数据结构的图示。原子映射表360包含一个原子映射表首部370和一个原子映射表数组380。原子映射表360将原子标识符132映射到文件偏移,有关那个原子标识符132的某些信息就可以在文件偏移处找到。原子映射表360表示将会为任何一组原子标识符132工作,但是对于原子标识符132的邻近范围,它会得到优化,所以举例来说,用于原子标识符132{12、23、24、216}的原子映射表360将会比用于原子标识符132{10、11、12、13}的原子映射表360占用更多空间。一个原子映射表360部分以原子映射表首部370为起始,370包括一个默认原子序列增量372、一个原子偏移序列数组大小374、一个原子偏移序列数组偏移376以及一个原子映射表数据偏移378。
对于对应于连续原子标识符132的数据,在包含文件偏移序列的原子映射表360中,可以使用默认原子序列增量372。在原子映射表360中对这些序列进行“增量编码”,以节省空间。增量编码是一种对作为连续数对之间的差值的一系列数字进行存储的技术。对于许多序列,增量将是很小的,而且由于许多编码方案可以更为紧凑地存储近零数,增量序列将会通常比原始序列占用更小的空间。比如,{1000,1011,1012,1013,1015,1016}的增量编码将会是{1000,1,1,1,2,1}。增量通常是很小的正数,但是可以通过从每一个数中减去一个选择得当的常数即默认原子序列增量372来使增量更趋近于0。比如,假定原始数字序列为{1000,1050,1104,1165,1202}。对此序列进行增量编码,则得到{1000,50,54,61,37}。由于默认原子序列增量372等于50,该序列还可能调整为{1000,0,4,11,-13}。因为这些最终数字更近于0,该序列可以更为紧凑地进行编码。也可以应用哈夫曼(Huffman)编码或算数编码方案。
原子偏移序列数组大小374是原子映射表360的序列数组中的入口数。
原子偏移序列数组偏移376是相对于数据库文件中的原子映射表360部分的起始处,原子映射表360的序列数组的文件偏移。
原子映射表数据偏移378是相对于数据库120文件中的原子映射表360部分的起始处,对于原子映射表360,数据起始处的文件偏移,。
原子映射表360(如主体原子映射表、符号原子映射表、类别原子映射表和描述原子映射表)包含一个原子映射表数组380。每个原子映射表数组380元素是对被压缩的一系列文件偏移(即原子偏移序列390)的引用。对于属于一组连续原子标识符132的信息,每个原子偏移序列390包含被压缩的文件偏移。
图11是关于一种原子映射表数组数据结构的图示。原子映射表数组380包括以下元素:第一标识符382、序列大小384和序列偏移386。第一标识符382是第一原子130在序列中的原子标识符132。序列大小384是在原子偏移序列390中的原子130的数目。序列中的原子130具有起始为第一标识符382的连续原子标识符132。序列偏移386是相对于数据库120文件的原子映射表360部分的起始处,原子偏移序列390的起始处的文件偏移。原子映射表数组380由每个序列中的第一原子130的原子标识符132进行分类。这使通过作对分检索(binary search)将连续原子标识符132映射到它的包含序列成为可能。然后,扫描包含序列将会得到用于所期望的原子130的文件偏移。
图12是关于一种原子偏移序列数据结构的图示。原子偏移序列390是文件偏移的增量编码数组,包括:一个第一原子文件偏移392和一个增量编码文件偏移数组394。将每个文件偏移都加到原子映射表数据偏移378上,并且相对于原子映射表360部分,对结果进行解释。一个长序列比包含相同文件偏移数目的两个较短的序列占用空间少,因为它摊销固定的开销给每序列。然而,越长的序列花费越长的搜索时间。所以,典型将原子映射表360分成的序列数目比确实需要的要多,以对其长度进行合理限定,并因此对搜索时间进行合理限定。然而,对序列大小没有固定限制。
第一原子文件偏移392是第一原子130在序列中的文件偏移。序列的其余部分是以这个值为开始的一系列增量。
被增量编码的文件偏移数组394是编码一系列文件偏移的字节块,在文件偏移处可以找到属于连续原子标识符132的数据。
为了对序列进行编码,编码器从一系列文件偏移开始。这些偏移表示将加到原子映射表数据偏移378的字节偏移。比如,假定原始文件偏移序列是{1000,1050,1104,1165,1645,760}。要注意的是原子130在文件中不必依次排列。首先,对序列增量编码会得到{1000,50,54,61,480,-885}。如果默认原子序列增量372等于50,还可以将此序列进一步调整为{1000,0,4,11,430,-935}。最后,把序列中的每个数(经过第一步骤之后,将这些数存储于第一原子文件偏移392中)作为可变大小的整数进行编码。编码得到的字节序列为{0x00 0x04 0x0B 0x83 0x2E 0xF8 0xF9}。利用较小值用较少字节的可变大小编码方案对一些整数进行存储。带符号的整数作为7比特值的序列进行编码。将这些值按大的终止字节顺序(高字节在先)进行存储,而不管数据库的整个终止端。每字节的高位是特殊标志,指明后面是否还跟有字节。第一字节的第7位(数值数据的最高位)是符号扩展位。无符号整数作为7比特值的序列进行编码。将这些值按大终止字节顺序(高字节在先)存储,而不管数据库的整个终止端。每字节的高位是特殊标志,指明后面是否还跟有字节。所产生的值是0扩展。
利用原子映射表360将特定类型的信息与原子标识符相关联。比如,可以将原子映射表360用于代码/数据主体信息,符号信息,种类信息和描述信息。
主体原子映射表将每个原子标识符132映射到加载那个原子标识符132所需的信息块,对于正常原子,该块包括可以合并形成最终的正常原子主体的有关原子引用136和原子字节134的压缩信息,而对于专用原子,包括适于专用原子的每个子类的信息。
利用该块的第一字节对一组原子标志396进行编码。如果原子标志396的低三位的值未包含专用标识符(如三位上指明值“7”),那么原子130就是正常原子,否则,它是专用原子。为了提高正常原子主体的加载过程,对于原子130,将原子引用136和原子字节134都连续存储在原子数据库120文件中。为了使原子数据库120的大小保持较小,因而提高将其加载的速度,对于正常原子主体,以多种方式压缩原子引用136和原子字节134。
图13是关于一种编码原子数据结构的图。对于正常原子,信息块包括:原子标志396,原子数信息397,编码原子引用398以及编码原始原子字节399。
原子标志396利用各种不同的标志位指定原子压缩类型。本发明的实施例支持多种压缩类型。原子标志396的其他位指定应当将该原子载入哪个缓冲区中(即只读代码缓冲区、只读数据缓冲区、读写数据缓冲区)。还有一些其他位将定义原子130在加载时所需要的队列(alignment)的以2为底的对数(log base two)(比如,在这些位中存储的值“3”将使原子130在加载时被模(mod)8字节排列)。
原子数信息397是字节块,包含关于编码原子引用398块中会出现多少个引用的信息,以及将会从编码原始原子字节399块中提取多少个原始字节的信息。那个入口将确定要提取的引用的数量和原始字节的数量。将概念上的原子字节134和原子引用136分别作为编码原子引用398和编码原始原子字节399进行编码。
图14是关于一种编码原子引用数据结构的图示。每个编码原子引用398都是描述从这个原子130到那个原子130的引用的字节块。比如,如果原子130表示调用由另一原子130所表示的另一过程的过程,将会在编码原子引用398中对后一原子130进行描述。这个关于编码原子引用398的数组是由原子管理程序160使用,以在程序160加载398时把这些原子130链接在一起。
原子数信息是由编码原子引用398编码的原子引用的数量。
每个编码原子引用398包括:一个原子引用类型(atom-ref-type)402、一个源偏移增量(source-offset-delta)404、一个目的偏移(dest-offset)406以及一个目的原子标识符(dest-atom-id)408。
原子引用类型402定义从这个原子130到那个原子130的不同类型引用。不是所有类型都将由所有平台使用。有效的原子引用类型402包括急切-绝对-32(eager-absolute-32)、急切-相对-32(eager-relative-32)、懒惰-绝对-代码-32(lazy-absolute-code-32)、懒惰-相对-代码-32(lazy-relative-code-32)以及懒惰-绝对-32(lazy-absolute-32)。
急切-绝对-32使原子管理程序160立即加载被引用的原子130,并存储到该原子的绝对地址。
急切-相对-32类似于急切-绝对-32,但是急切-相对-32存储到相对引用的原子130的偏移。相对偏移是从引用的起始处计算。
懒惰-绝对-代码-32定义到包含代码的原子130的绝对地址(如32位)。它是“懒惰的”,因为被引用的原子130实际上直到首次调用时才加载。原子管理程序160通过建立引用来管理延迟加载,以指向首次调用时懒惰地加载被引用的原子130的代码存根。
懒惰-相对-代码-32类似于懒惰-绝对-代码-32,但是懒惰-相对-代码-32存储相对于引用的偏移。相对偏移是从引用的起始处计算。
数据的懒惰加载或按需加载隐含是通过提供代码的懒惰加载来提供,而明确是通过编码引用的原子标识符来提供,这样,在运行时,被引用的数据原子直到被实际访问时才会被加载。既然,引用数据的代码的加载一直延迟到被调用时,代码引用的数据同样受到延迟——隐含地提供了数据的懒惰加载。懒惰数据明显地典型需要程序员支持,以便标记要懒惰加载的数据(如利用编译器指示)。在一个实施例中,明显地利用特定编码算法来引用懒惰数据,该算法以2乘以引用的原子标识符并将引用的原子标识符加1,以生成懒惰数据的原子标识符。
懒惰-绝对-代码-32定义到另一原子130的绝对地址(如32位地址)。它是懒惰的,因为被引用的原子130实际上没有被明确加载。相反,原子管理程序160通过存储被编码的地址(2*被引用的原子标识符)+1来链接该引用。要注意的是,被编码的地址总是奇数的。不像可以利用跳跃存根的懒惰的代码引用,懒惰的数据引用需要从原子管理程序160运行的程序中合作。它需要核对奇数指针值,并识别出它们就是懒惰的数据引用。然后,它需要通过回调到原子管理程序160来加载所期望的原子130,并将会典型地用最终地址来重写引用。自然一定会得知懒惰加载的数据具有偶数列,或者对于这样的指针,奇数值将是不明确的。
源偏移增量404指定出现在原子130中的引用有多少字节。将该值表示为从前一引用的末尾的增量。对首次引用进行编码,好像前一引用在源偏移0处结束一样。引用总是由它们的源偏移分类进行存储,所以,该数组中增量总是非负的。比如,如果原子130在字节偏移0、4、8、12、20处具有4字节引用,那么对于那些引用,源偏移增量将被编码为0、0、0、0、4。
目的偏移406将字节数的偏移编码为该引用指向的被引用(目的)的原子130。
目的原子标识符408是该引用指向的原子130的原子标识符132。
被编码的原始原子字节399是表示原子130的原子字节134的字节块,将容纳其他原子130的任何引用所需的空间换出,并且剩余的原始字节以原子压缩类型所指定的方式进行压缩。可以移走原子字节内的引用,以创建原始字节,因为被编码的引用信息包括一个源偏移(识别在哪进行引用),一个目的标识符(识别目标原子)和一个目的偏移(识别引用将多少字节指向目标原子)。比如,如果原子字节134表示一个C字符串常量,该数组将会容纳该字符串中的一系列可能压缩过的字符。相反,如果原子字节134包括四种数据类型,其后接着对另一原子130的四字节引用,其后接着另外八个数据类型,被编码的原始原子字节399就会包含12字节可能压缩过的数据。在加载期间,四字节引用将被接合进去,从而使整个加载的原子字节占有16字节。
专用的原子是由包含特定标识符(如将其最低的三位设为值“7”)的原子标记396来定义。原子标志396的剩余位指定专用的原子是否为dll引用原子(dll-ref-atom)或dll原子(dll-atom)。
dll引用原子包括三个字段:原子标志(atom-flag)、dll原子标识符(dll-atom-id)以及dll符号(dll-symbol)。dll引用原子对应于外部DLL中的符号(像用于如printf( )这样的库函数的原子130)。将那些原子130表示为一对DLL和在那个DLL中查找的符号。dll原子标识符指定dll原子的标识符,dll原子指定查找dll符号的DLL。dll-symbol指定在DLL中查找哪个符号。
dll原子包括一个原子标志字段和一个dll路径名称字段。dll原子与dll引用原子有关,并用于指定dll引用原子要查找符号的DLL。dll路径名称指定适于传给dlopen、LoadLibrary或同等函数的路径名称。将它存储为C字符串(一系列以0为结尾的字节)。
符号原子映射表将原子标识符132映射到原文的符号,通过原文符号可以用名称来访问所关联的原子130。符号有助于以用户友好的方式来引用原子130。比如,当用原子标识符值57来提交原子130时,对于程序员,用名字(如“printf”)来引用原子130比用原子标识符值(如“57”)更容易。
类别原子映射表是从原子标识符132到具有不定语义的原文类别的原子映射表360。类别原子映射表考虑到开发者对原子的特定分类。在另一实例中,可以将类别用于对原子130加上标签,以识别字符字符串原子130,识别用于国际化以及用于许多其他用途的原子130。
描述原子映射表是从原子标识符132到具有不定语义的原文描述的原子映射表360。可以将描述原子映射表用于存储在开发/调试基于原子的系统时对开发者有益的调试信息。
基于配置引用的用法,可以静态或动态改变原子引用的引用类型。原子引用136通常默认为“懒惰的”,以便在运行时,将实际原子字节134的加载一直延迟到实际需要时。“急切的”引用使被引用的数据/代码在加载调用原子130时加载,而不管它是否实际需要。通常,在运行时,在给定的原子130内执行的运行时代码路径不会执行原子130内的所有指令。加载未调用或未引用的原子130浪费了存储器和处理资源。
解决用于代码的懒惰引用包括指向一个首次调用时懒惰地加载引用原子130的代码存根。解决用于数据的懒惰引用包括将被引用的原子标识符存储为被定义为(2*被引用的原子标识符)+1的修改原子标识符。
一旦执行/访问懒惰的代码引用,可以进行优化以避免间接使用代码存根。优化包括“后向修补(back-patching)”引用代码,以直接引用所加载的原子130。后向修补用直接跳到存储器中的代码原子130来代替利用存根。对于首次实际调用程序来说,可以进行后向修补,并且还可以将后向修补应用于任何被加载的原子130,这样,如果当实际上调用被引用的原子130时,可以直接跳到该原子。代码存根可以留在存储器中以备未完成后向修补的任何原子使用。本发明的实施例提供标记代码原子130和数据原子130引用,以实现原子级上的特定加载动作(如懒惰的或急切的)。
图15是关于一种有6个代码过程和3个数据元素的实例系统的图示。在该实例中,过程P1调用过程P2和P3,过程P1还对访问数据元素D2的数据元素D1进行访问。过程P2调用过程P4,并访问数据元素D3。过程P3访问数据元素D1,并调用过程P5。根据本发明的一个实施例,将每个代码过程{P1,P2,P3,P4,P5,P6}定义为单个的可独立编址的原子。类似地,将每个数据元素{D1,D2,D3}定义为单个的可独立编址的原子。在运行时,当加载P1时,立即将D1加载,这使得D2也被加载。如果P2和P3的引用是懒惰的,对于P2和P3,将创建存根,从而考虑到这些过程的实际代码加载一直推迟到它们实际调用的时候。很可能的是,在正常的执行路径期间不会调用一些代码过程(如差错处理程序(error handler))。在这种情况下,将会通过延迟加载来节省处理和存储。基于代码的懒惰加载(如P2),数据的隐含懒惰加载提供了处理器和存储器的节省。
对数据原子引用进行编码,以为数据元素提供类似能力。数据的明确懒惰加载可以提供甚至更多的节省(如甚至在加载P2之后还可以加载D3)。
通过修改被引用的原子的原子标识符,原子管理程序160可以将数据元素/原子一直延迟到实际被引用时。当利用这些代码原子时,很可能的是,在正常的执行路径期间不会引用一些数据原子(如差错消息)。懒惰地/延迟地加载数据原子也节省了处理和存储。
传统系统(如Linux DLL)提供代码存根,但是这些系统在启动时间对所有可能的引用建立存根。相反,本发明的实施例仅对每个由被加载的原子130已实际引用的原子建立存根。参照图13,加载P1将会使用于P2和P3的存根创建。传统系统典型地在启动时加载所有的数据元素。比如,在一个传统系统中,在启动时将会把D1、D2和D3都加载。相反,本发明的实施例在加载D2时仅加载D3,或者仅当D3实际使用时进行加载。在加载方面,以类似方式灵活处理数据和代码提供了许多性能改善。这一点对具有相对大的要编码的数据速率的系统尤为正确。
利用视图,该实例系统可以包括替换P5的一个新过程P6。现有系统不必进行改变,因为可以将视图用于加载和引用以P6的引用来替换P5的引用的操作。
图16a是实例数据原子130的图示。从概念上表示数据原子130,以举例说明其原子标识符132、原子字节134和原子引用136。数据原子16001(类似于图15中的D1)包含两项数据(原子字节134):对一个人名(即“玛丽 史密斯”)的引用(指针)和一个代表玛丽年龄的整数(即47)。该引用(原子引用136)是对原子16002的引用。原子16002(类似于图15中的D2)是表示字母字符串“玛丽 史密斯”(原子字节132)的数据原子130,原子16002不引用任何其它原子。
图16b是关于实例代码原子130的图示。从概念上表示代码原子130,以举例说明其原子标识符132、原子字节134和原子引用136。代码原子15000(类似于图15中的P5)表示用于打印人名和年龄的print_person( )过程的可执行代码。代码原子16000(类似于图15中的P3)表示调用print_person( )过程来打印玛丽名字和年龄的过程。代码原子16000通过引用数据原子16001来引用用于玛丽的数据,并通过对代码原子15000的引用,print_person( ),来调用print_person( )函数。因此,由原子16000表示的原子包括两个原子引用136,一个是对原子15000(用于print_person( )过程的代码原子)的代码原子引用136,另一个是对原子16001(用于玛丽的数据的数据原子)的数据原子引用。
图16c是关于实例替换代码原子的图示。将代码原子17000增加到原子数据库120上,并且它表示print_person( )过程的更新版本(原子15000)。调用print_person( )的可执行程序现在可以调用老的print_person( )过程(原子标识符15000),或者是新的print_person( )过程(原子17000),这取决于关于代码原子17000,是否利用修改对原子15000的引用的视图来执行可执行程序。这样,可以将视图应用于使可执行程序调用现有过程的更新版本,虽然还在适当位置把现有过程留给替换的调用程序。
图17a是关于一种原子数据库差分过程的图示。原子数据库差分过程500取得两个原子数据库,第一原子数据库510和第二原子数据库520,并生成一个可以被存储为修补文件的视图122。可以将视图122用于虚拟地或物理地将一个原子数据库变换为另一数据库。原子数据库差分过程的一个目标在于最小化视图122的大小,这样可以将其存储起来,并以有效的方式分布。
每个原子130具有一个“主体”(原子主体134),包括字节块(用于过程的可执行代码,或者字符串常量的字符),以及没有或者多个对其他原子130的引用。将每个引用定位于主体内的某些特定偏移;比如,对于在偏移20处或其附近所调用的过程,到该过程的调用指令20将会典型地包括对原子130的引用。
原子数据库120对具有标记的边缘的指向图进行编码,图中每个原子130都是一个节点,并且每个原子引用136都是一个边缘。生成修补文件涉及识别第一原子数据库510和第二原子数据库520之间公用的子图,以及重用它们而不是将那些节点再次运载到修补文件中。不幸的是,生成质量修补不只是需要识别同构子图。实际上,子图除了有一个或两个差别之外,通常是同构的;比如,当改变一个过程而调用它的所有过程都保持不变,就出现这样情况。我们还是会喜欢将大量的原子重用于该子图,而不是因为一个差异而将它们一起放弃。
修补文件对第一原子数据库510的一系列变换进行编码,变换提供其产生的图,该图同构于第二原子数据库520。识别正确的一组变换是原子数据库差分过程500的一部分。原子数据库差分过程500将第二原子数据库520中的每个原子分类为三种类别中的其中一种,每种类别是不同种类的图变换。分类向量包括生成修补文件所需的所有信息。重用分类确定可以重用第一原子数据库510中的原子130,所以没有必要将其增加到差分集上。这是最好的情况。替换分类确定新原子130需要替换第一原子数据库510中的原子130,大概允许其他原子归入重用类别。修补文件中将会出现原子130的字节。插入分类确定新原子130与第一原子数据库510中的任意原子130毫无共同之处,所以需要将其加上。修补文件中将会出现该原子130的字节。人们认为插入比替换略好一些,因为修补文件不必包含描述替换的信息。删除操作是可选的,因为在进行没有损害的修补之后,可以留下附加的原子130。当应用修补时,该过程实际上不必替换磁盘上的原子130,因为可以将变换操作用于修改对老的原子130的引用,当从后向修补安装的角度看,相反应当使用新原子130。
现在参照图17b,这里每个大写字母{A、B、C、D、E、F}表明原子130的内容。两个原子当且仅当具有相同大写字母时才具有相等主体。主后缀“′”表明节点是新图中的节点。对于该图,一序列优化变换是:重用(C,C′),替换(D,E′),重用(B,B′)和插入(A′)。删除(F)是可选的。
最要注意的是,变换替换(D,E′)是使变换重用(B,B′)的关键。一旦由B和B′所引用的原子变换为相等,B和B′就成为相等。算法将花费大量时间试图变换该图,以将该图变换,使尽可能多的重用合并成为可能。变换允许重用来自以前图中的B和C,所以不必将它们运载到修补文件中。
现在参照图17c,所示的是看起来简单但实际上更为复杂的实例。要注意的是,对边缘进行排序,所以两幅图不是很一般地同构。在该实例中,必须做出选择:要么重用X和Y,要么重用A。两种选择都可以。为了重用X和Y:重用(X,X′),重用(Y,Y′)以及替换(A,A′)。为了重用A:替换(X,Y′),替换(Y,X′)以及重用(A,A′)。正确的答案取决于X、Y和Z有多大。如果A与X和Y相比较小,第一答案较好。如果A相对较大,那么第二答案较好。
使用贪心算法来选择最大化重用合并的一组图变换。并不保证该算法生成优化的结果,当这些图适度类似时该算法效果将会很好。两个原子130,一个来自(老的)第一原子数据库510而另一个来自(新的)第二原子数据库520,在差分算法将一个映射到另一个时,被定义为“合并的”。两原子130合并后,就被看作是相等的。名词“合并”描述了考虑用于合并的一对原子130。“提交的合并”是实际上完成了的合并。一旦差分算法结束,每个提交的合并将会被分类为重用合并或替换合并。将未被合并的原子130分类为插入合并。每个原子130至多可以合并一次。如果两原子(老的原子和新的原子)还可能以重用合并来结束共同合并,它们就是“兼容的”。尤其是:
1)原子130除彼此外还未与任何原子130合并,
2)原子130具有同样的原子主体,
3)忽视它们引用的原子130,原子130具有成对的同样引用,换句话说,引用具有相同的偏移、类型等等,
4)所有被引用的原子130要么彼此相互成对合并,要么根本没有进行合并,换句话说,还未提交使该合并不可能为重用合并的合并,
5)对“自身”的引用必须在两个原子中成对排列,以及
6)原子130没有内部矛盾的合并要求,比如,如果老的原子引用过原子X两次,而新的原子引用过原子A和B,就会出现这种要求。为了成为重用合并,X将不得不与A和B进行合并,而这是不可能的。
如果两原子130(老的原子、新的原子)彼此“兼容”而与其他原子“不兼容”,它们是“唯一兼容的”。合并的“权重”是重要性的指示。如果用重用合并没有成功合并原子130,该权重等于将要加到修补文件的所估计的字节数。这实际上是原子的磁盘字节表示的大小。
差分算法大体包括以下步骤:
1)规范化老的db和新的db,
2)标识一组“目标”合并GM,
3)标识一组辅助GM的合并AM,
4)在GM非空时:
a)选择并应用AM中的最佳合并。
b)更新GM。
c)更新AM。
5)取消每个已提交的证明不是重用合并,或者不是辅助提交的重用合并的合并,如果出现任何唯一兼容的合并,将所有的合并加到GM,给出一个无限权重并转向步骤3)。
6)将老的db和新的db之间的已修改的共享算法应用到查找剩余的同构,如果出现任何唯一兼容的合并,将所有的合并加到GM,给出一个无限权重并转向步骤3)。
7)如果存在任何兼容的合并,以最大权重提交合并,给它一个无限权重,将它加到GM并转向步骤3)。
标准化老的db和新的db包括相互独立来瓦解每个数据库内的同构子图,在老的db和新的db上运行标准的原子共享算法。这样标准化数据库,从而避免了需要将原子多次合并的大多数情况。
识别GM,一组“目标合并”,包括通过大量的在其他方面不明确的原子中明确一些“固定点”,试图对两图进行排列。这些提供一个起始点,从该点可以决定其他合并。GM总是等于还未成为正式的重用合并的一组所有唯一兼容的合并。利用混杂了原子主体和其引用的结构的散列(hash)表来找唯一兼容的合并。当算法运行时,将合并加到GM,并在变换其余图时将其从GM除去。将GM的元素称为“目标合并”。要注意的是该算法没有试图找到可能曾经发生的所有重用。通常将会有数量极大的重用。在最糟糕的情况下,可能的重用合并的总数量将与图大小的平方类似。
识别AM,一组“辅助合并”,从而了解到对于将成为重用的目标合并,所有被引用的原子必须成对合并。那些成对合并被称为“辅助合并”,并且这组所有的成对合并是AM。因此,AM完全是一个关于GM的函数。GM的元素还可以在AM中出现。当目标合并辅助另一目标合并时将发生这种情况。
当应用“明显”合并时,阻碍一个原子与另一原子进行合并的是那些原子与任何其他原子进行合并将不再自由。然而,如果仅有一个其他原子是潜在的合并对象(反之亦然),那么那个阻碍将消失。在这样的情况下,立即将那两原子合并没有损害。提交这样的合并的好处在于合并有助于使剩余合并待选的数目更为精确。在该阶段中,所有这样的“明显”合并得到识别及应用。每个原子可以在目标合并、辅助合并或两者中消失。既然重要的是决定是否有多于一个的潜在合并,例示所有可能的合并(可能进行n2次)是不必要的。相反,可以对合并进行计数,因而当找到第二可能合并对象时,可以停止该过程。通过定义,潜在目标合并的数量与兼容原子的数量一样。利用散列表可以很容易算出该数量。
对于原子X,对潜在辅助合并的计数更为复杂。这是通过X的所有父原子的迭代来完成。对于每个父原子,检查该父原子与其兼容的其他原子;这些原子的每一个都表示一个潜在的目标合并。对于每个潜在的目标合并,要注意的是X会不得不与其合并以使自己成为成功的重用合并的类似原子。每个这样的原子是X的一个潜在辅助合并对象。对那些原子计数显示出X曾经可能会成为多少个辅助合并候选的对象。
在GM非空时,尽力将每个目标合并(老的原子、新的原子)变为实际的重用。如较早讨论的,这需要由老的原子和新的原子所引用的所有原子的成对合并。主循环(main loop)识别具有最高“分数”的合并(下面进行定义),并贪心地提交那个合并,重复该过程直到GM为空。具有负分的合并如果具有最高分(如果不是没有可能构建实际上可以出现合并的情况,合并将很复杂),理论上可以得到提交,但是明显忽视分数等于负无穷大的合并。
每个合并具有一个分数,该分数(很粗略地)估计提交该合并将会把修补文件的大小降低多少。辅助合并和目标合并都有分数。重要的是分数计算是相对局部的过程。如果每个合并需要改变整图的分数,该算法将会运行过慢而不实用。如果合并不是辅助合并也不是具有提交的所有辅助合并的目标合并,分数将是负无穷大。否则,分数是关于目标合并对其产生的“压力”的函数。
每个目标合并将压力均匀地应用于其所依赖的所有未提交的辅助合并,以及其本身。对“本身”的引用不接收压力。通过采用除了对“本身”的引用以外,通过取被未提交的辅助合并的数量除的目标合并的权重来计算压力。
所以,具有小数量的引用的极大原子将对辅助合并产生相当大的压力,而具有大量引用的原子将对辅助合并产生相对小的压力,这表明每个合并的用处很小。由于此公式,当提交更多的辅助合并时,在要进行合并的剩余候选上的压力将增加,因而激励它们“结束工作”。
将合并上的所有压力总和称为P。对于与M相互排斥的其他辅助合并,辅助合并的分数M等于P减去所有P的最大值。比如,合并原子(X,Y)意味原子(X,Z)不能进行合并,因为X仅能合并一次。如果合并(X,Z)得到很多,那么对于(X,Y)合并,为阻止合并而受处罚是有意义的。
当可能有大量的合并时,用“最大”代替“总和”是为了避免病态处罚(pathological penalization),因为它们不都能发生。在前一实例中,由(X,Y)阻止的每个合并必定涉及X或Y,所以即使理论上阻止了上千个合并(如(X,A),(X,B),(X,C),...),至多同时可能有这些合并中的其中两个发生(涉及X的一个合并和涉及Y的一个合并)。所以对于上千个受到阻止的合并的处罚是太过苛刻了。
要注意的是目标合并对本身应用压力,即使分数通常是负无穷大。这就是所以与目标合并相互排斥的辅助合并因为阻止它而受到处罚。
合并两原子可以导致三种事件发生:GM、AM或AM和GM中的合并分数。如果目标合并成为提交的重用,目标合并集将明显改变。当发生改变时,从GM中除去合并,因为完全完成了合并。仅提交目标合并是不足以将合并从GM中除去的,因为合并还需要将压力应用于辅助合并,所以合并实际上成为重用。当提交合并时,涉及那些原子的其他合并变为不可能,因为每个原子仅能合并一次。那样将会导致依赖当前不可能的合并的任何目标合并没有希望成为重用合并,因此,它们停止成为目标合并,并被从GM中除去。合并还可以通过将兼容合并变成唯一兼容合并来创建新目标合并。比如,假定在老的db和新的db中的每一个中都有10个原子,所有原子都相互兼容。对于那一对表示好的合并,这里没有好的指导,因此,该过程不会产生所有的100(10*10)个目标合并。但是当由这些原子所引用的原子中出现合并时,成对的这些原子突然可以变为唯一兼容,因为对于在老的db中的给定原子,在新的db中可能仅有一个这样的原子,具有相同的主体,并且它的合并的引用都依然潜在地排成列。
将以前没有考虑目标合并的两个兼容原子合并在一起,创建一个新的目标合并,因为现在它们唯一兼容。对此的一种方式是,既然已将它们提交合并,该过程最好还是通过将压力施加在它们引用的原子上来尽力使合并变为重用。
AM完全是关于GM的一个函数,所以GM的变化会影响AM。从语义上讲,好像每次GM变化,都从头重新计算AM。实际上,增加了对AM的刷新。
根据上面给出的公式,合并的分数受合并的影响。从语义上讲,好像是从头重新计算所有的合并候选分数。实际上,在原子图中只有“临近”合并的原子的分数需要刷新它们的分数。
如果已提交的合并既不是重用也不能使其成为重用,应当取消合并。有两个原因:首先,替换合并比插入略为昂贵一些。其次,取消合并使涉及的原子对于不同合并来说都是合格的,这可能对于使一些重新合并成为可能是必要的。如果在取消步骤之后,任何未提交的唯一兼容合并出现,就将所有合并加到GM并重试主循环。但是在开始再次循环之前,把具有最高权重的新的目标合并给与无限权重,以保证至少该合并会成为提交的重用。这保证算法将会最终停止,而不是连续取消和始终重新应用合并。
原子系统已经具有可以瓦解数据库中的所有同构原子的通用的共享算法。问题基本上与“FSM减少”相同。计算两幅图之间的差值的问题与共享同构原子有关,因为两算法都是寻找同构。运行在老的db和新的db之间的修改过的共享算法是定位其他算法所错过的同构的好的支持(backstop)。该修改过的共享算法在以下方面区别于标准的共享算法:1)原子仅可以在数据库之间共享,在它们的内部不共享,2)甚至通常不可共享的原子,如易变的数据,都可以共享,以及(3)每个原子仅可以共享一次。如果在共享步骤之后,出现任何未提交的唯一兼容合并,正如前一步骤那样,在给最重的目标合并无限权重之后,重试主循环。
如果还存在任何兼容合并,提交具有最大权重的合并,给与合并无限权重,将其加到GM并重试主循环。可选择的是,存在这样的选择,检查与每个原子有关的人可读描述,并利用描述来指导合并。该“欺骗”常常会有效,但是如果重新命名过程而另外的保持不变,将会失败。
虽然已根据其中的优选实施例对本发明作以专门说明,本领域的技术人员要理解的是不偏离附加的权利要求书所涵盖的发明范围,这里可以进行各种形式和细节上的变化。
特别是,对具有大量不同部分的原子数据库120进行了说明,本领域的技术人员将会很容易认识到,在本发明的所教范围内可以添加或删除表示原子130的不同使用的部分。另外,在本发明的所教范围内,可以改变实际的磁盘编码方案。
尽管本发明的实施例适于完成CurlTM运行时,在发明内容中没有把本发明限定到用于CurlTM运行时。可以将本发明实施例应用于任何软件程序。
Claims (24)
1.一种用于创建原子数据库的视图的方法,包括:
定义一组变换操作;以及
将该组变换操作应用于所述原子数据库,使得在虚拟地应用所述变换操作时,在运行时,创建一个虚拟原子数据库,并且在真实地应用所述变换操作时,创建一个新的原子数据库,所述原子数据库存储原子,所述原子包括:
一个永久分配的原子标识符,
计算机代码和/或数据,
对其他原子的引用。
2.根据权利要求1的方法,其中将所述新的原子数据库存储在一个与所述原子数据库独立的文件中。
3.根据权利要求1的方法,其中所述新的原子数据库替换原始原子数据库。
4.根据权利要求1的方法,其中所述变换操作包括:
插入一个新原子的插入操作。
5.根据权利要求1的方法,其中所述变换操作包括:
修改一个现有原子的修改操作。
6.根据权利要求1的方法,其中所述变换操作包括:
删除一个现有原子的删除操作。
7.根据权利要求1的方法,还包括:
将所述视图和所述原子数据库与第一可执行程序和第二可执行程序相关联;
在运行时,利用所述视图,虚拟地对所述原子数据库进行变换,以创建一个虚拟原子数据库;以及
通过所述第一可执行程序和所述第二可执行程序加载来自所述虚拟原子数据库的原子,从而共享所述第一可执行程序和所述第二可执行程序之间的原子。
8.根据权利要求7的方法,其中将所述原子载入所述第一可执行程序可访问的第一存储缓冲区中,并且将所述原子载入所述第二可执行程序可访问的第二存储缓冲区中。
9.根据权利要求7的方法,其中将所述原子载入所述第一可执行程序和所述第二可执行程均可访问的存储缓冲区中。
10.根据权利要求1的方法,还包括:
将第一视图和所述原子数据库与第一可执行程序相关联,并将第二视图和所述原子数据库与第二可执行程序相关联;
在运行时,利用所述第一视图和所述第二视图,虚拟地对所述原子数据库进行变换,以创建第一虚拟原子数据库和第二虚拟原子数据库;以及
通过利用所述第一视图由所述第一可执行程序和通过利用所述第二视图由所述第二可执行程序加载来自所述原子数据库的原子,从而共享所述第一可执行程序和所述第二可执行程序之间的原子。
11.根据权利要求10的方法,其中将所述原子载入利用所述第一视图所述第一可执行程序可访问的第一存储缓冲区中,并且将所述原子载入利用所述第二视图所述第二可执行程序可访问的第二存储缓冲区中。
12.根据权利要求10的方法,其中将所述原子载入利用所述第一视图所述第一可执行程序和利用所述第二视图所述第二可执行程均可访问的存储缓冲区中。
13.根据权利要求1的方法,其中基于所述原子将在其上执行的计算机硬件和/或软件系统的优化特征,定义所述变换操作。
14.根据权利要求1的方法,其中定义所述变换操作,以便限制对所述原子所提供的某些特征的访问。
15.根据权利要求1的方法,其中所述原子还包括原子特征,且所述原子变换操作改变所述原子特征。
16.根据权利要求1的方法,其中该组变换操作仅包括用第二原子替换第一原子的修改操作,这样就创建了一个映射表。
17.根据权利要求1的方法,其中该组变换操作应用于虚拟原子数据库。
18.一种用于创建一组原子变换操作,以将第一原子数据库变换为第二原子数据库的方法,包括:
a)利用标准的原子共享算法,规范化所述第一原子数据库和所述第二原子数据库,所述第一原子数据库和所述第二原子数据库的每一个存储原子,所述原子包括:
一个永久分配的原子标识符,
计算机代码和/或数据,
对其他原子的引用;
b)确定所述第一原子数据库的原子和所述第二原子数据库的原子之间的一组目标合并;
c)确定辅助所述目标合并的所述第一原子数据库的原子和所述第二原子数据库的原子之间的一组辅助合并;
d)在该组目标合并不为空时,重复以下步骤:
i)在该组辅助合并中选择一个最佳合并;
ii)提交所选择的最佳合并;
iii)更新该组目标合并;
iv)更新该组辅助合并;
e)取消每个提交的不是重用合并,或者未辅助提交的重用合并的合并;
f)确定是否创建了唯一的兼容合并,并将所述唯一的兼容合并添加至所述目标合并,将一个无限权重指定给所述唯一的兼容合并的其中一个,并转到步骤c);
g)应用使用了所述第一数据库和所述第二数据库的修改过的原子共享算法,以便识别剩余的同构;
h)确定是否创建了唯一的兼容合并,并将所述唯一的兼容合并添加至所述目标合并,将一个无限权重指定给所述唯一的兼容合并的其中一个,并转到步骤c);以及
i)确定是否创建了任何兼容合并,并提交具有最大权重的兼容合并,将一个无限权重指定给所述提交的兼容合并,并将所述提交的兼容合并添加至该组目标合并,并转到步骤c);
19.根据权利要求18的方法,其中至少一个所述提交的合并是替换合并。
20.根据权利要求18的方法,其中至少一个所述提交的合并是插入合并。
21.根据权利要求18的方法,其中至少一个所述提交的合并是删除合并。
22.一种用于创建原子数据库的视图的装置,包括:
一组变换操作;以及
一个处理器,其将该组变换操作应用于所述原子数据库,使得在虚拟地应用所述变换操作时,在运行时,创建一个虚拟原子数据库,并且在真实地应用所述变换操作时,创建一个新的原子数据库,所述原子数据库存储原子,所述原子包括:
一个永久分配的原子标识符,
计算机代码和/或数据,
对其他原子的引用。
23.一种用于创建原子数据库的视图的装置,包括:
用于定义一组变换操作的装置;以及
用于将该组变换操作应用于所述原子数据库的装置,使得在虚拟地应用所述变换操作时,在运行时,创建一个虚拟原子数据库,并且在真实地应用所述变换操作时,创建一个新的原子数据库,所述原子数据库存储原子,所述原子包括:
一个永久分配的原子标识符,
计算机代码和/或数据,
对其他原子的引用。
24.一种计算机程序产品,包括:
计算机可用介质,用于创建原子数据库的视图;
在所述计算机可用介质上体现的一组计算机程序指令,包括的指令有:
定义一组变换操作;以及
将该组变换操作应用于所述原子数据库,使得在虚拟地应用所述变换操作时,在运行时,创建一个虚拟原子数据库,并且在真实地应用所述变换操作时,创建一个新的原子数据库,所述原子数据库存储原子,所述原子包括:
一个永久分配的原子标识符,
计算机代码和/或数据,
对其他原子的引用。
Applications Claiming Priority (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US10/178,898 | 2002-06-21 | ||
US10/178,898 US7281017B2 (en) | 2002-06-21 | 2002-06-21 | Views for software atomization |
Publications (1)
Publication Number | Publication Date |
---|---|
CN1672150A true CN1672150A (zh) | 2005-09-21 |
Family
ID=29734812
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CNA038173417A Pending CN1672150A (zh) | 2002-06-21 | 2003-06-18 | 用于软件原子化的视图 |
Country Status (8)
Country | Link |
---|---|
US (1) | US7281017B2 (zh) |
EP (1) | EP1518193A2 (zh) |
JP (1) | JP2005531066A (zh) |
KR (1) | KR20050081869A (zh) |
CN (1) | CN1672150A (zh) |
AU (1) | AU2003247547A1 (zh) |
CA (1) | CA2490281A1 (zh) |
WO (1) | WO2004001592A2 (zh) |
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108959499A (zh) * | 2018-06-26 | 2018-12-07 | 郑州云海信息技术有限公司 | 分布式文件系统性能分析方法、装置、设备及存储介质 |
CN109145025A (zh) * | 2018-09-14 | 2019-01-04 | 阿里巴巴集团控股有限公司 | 一种多数据源集成的数据查询方法、装置及业务服务器 |
CN112241276A (zh) * | 2019-07-19 | 2021-01-19 | 华为技术有限公司 | 一种设备的升级方法及装置 |
CN113448942A (zh) * | 2020-03-27 | 2021-09-28 | 阿里巴巴集团控股有限公司 | 数据库访问方法、装置、设备及存储介质 |
Families Citing this family (36)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7029573B2 (en) * | 2001-06-19 | 2006-04-18 | Exxonmobil Research And Engineering Company | Composition and control method for treating hydrocarbon |
US7117507B2 (en) * | 2002-06-03 | 2006-10-03 | Sumisho Computer Systems Corporation | Software atomization |
US7281017B2 (en) | 2002-06-21 | 2007-10-09 | Sumisho Computer Systems Corporation | Views for software atomization |
US10069808B2 (en) * | 2003-04-16 | 2018-09-04 | Eileen Chu Hing | Methods and systems for providing a customized network |
US8037102B2 (en) | 2004-02-09 | 2011-10-11 | Robert T. and Virginia T. Jenkins | Manipulating sets of hierarchical data |
US9646107B2 (en) | 2004-05-28 | 2017-05-09 | Robert T. and Virginia T. Jenkins as Trustee of the Jenkins Family Trust | Method and/or system for simplifying tree expressions such as for query reduction |
US20060020866A1 (en) * | 2004-06-15 | 2006-01-26 | K5 Systems Inc. | System and method for monitoring performance of network infrastructure and applications by automatically identifying system variables or components constructed from such variables that dominate variance of performance |
US7882147B2 (en) * | 2004-06-30 | 2011-02-01 | Robert T. and Virginia T. Jenkins | File location naming hierarchy |
US7620632B2 (en) * | 2004-06-30 | 2009-11-17 | Skyler Technology, Inc. | Method and/or system for performing tree matching |
US7801923B2 (en) | 2004-10-29 | 2010-09-21 | Robert T. and Virginia T. Jenkins as Trustees of the Jenkins Family Trust | Method and/or system for tagging trees |
US7627591B2 (en) | 2004-10-29 | 2009-12-01 | Skyler Technology, Inc. | Method and/or system for manipulating tree expressions |
US7630995B2 (en) * | 2004-11-30 | 2009-12-08 | Skyler Technology, Inc. | Method and/or system for transmitting and/or receiving data |
US7636727B2 (en) | 2004-12-06 | 2009-12-22 | Skyler Technology, Inc. | Enumeration of trees from finite number of nodes |
KR100673313B1 (ko) * | 2004-12-30 | 2007-01-24 | 재단법인서울대학교산학협력재단 | 코드조각 번호 매김을 이용한 프로그램 간의 코드조각결합방법 |
US8316059B1 (en) | 2004-12-30 | 2012-11-20 | Robert T. and Virginia T. Jenkins | Enumeration of rooted partial subtrees |
US8615530B1 (en) | 2005-01-31 | 2013-12-24 | Robert T. and Virginia T. Jenkins as Trustees for the Jenkins Family Trust | Method and/or system for tree transformation |
US7681177B2 (en) | 2005-02-28 | 2010-03-16 | Skyler Technology, Inc. | Method and/or system for transforming between trees and strings |
US8356040B2 (en) | 2005-03-31 | 2013-01-15 | Robert T. and Virginia T. Jenkins | Method and/or system for transforming between trees and arrays |
US7899821B1 (en) | 2005-04-29 | 2011-03-01 | Karl Schiffmann | Manipulation and/or analysis of hierarchical data |
US7685145B2 (en) * | 2006-03-28 | 2010-03-23 | Microsoft Corporation | Database physical design refinement using a merge-reduce approach |
US9043553B2 (en) * | 2007-06-27 | 2015-05-26 | Microsoft Technology Licensing, Llc | Leveraging transactional memory hardware to accelerate virtualization and emulation |
US8266387B2 (en) * | 2007-06-27 | 2012-09-11 | Microsoft Corporation | Leveraging transactional memory hardware to accelerate virtualization emulation |
US8176253B2 (en) * | 2007-06-27 | 2012-05-08 | Microsoft Corporation | Leveraging transactional memory hardware to accelerate virtualization and emulation |
US20090024986A1 (en) * | 2007-07-19 | 2009-01-22 | Microsoft Corporation | Runtime code modification |
US8370823B2 (en) * | 2007-08-27 | 2013-02-05 | International Business Machines Corporation | Device, system, and method of computer program optimization |
US8584102B2 (en) * | 2007-12-27 | 2013-11-12 | Microsoft Corporation | Creating and using deltas to modify existing computer code |
US8261240B2 (en) * | 2008-01-15 | 2012-09-04 | Microsoft Corporation | Debugging lazily evaluated program components |
US20090193043A1 (en) * | 2008-01-29 | 2009-07-30 | Inventec Corporation | Method and system for transforming database and compressible database structure |
KR20120072138A (ko) * | 2010-12-23 | 2012-07-03 | 한국전자통신연구원 | 맞춤형 소프트웨어 제공 장치 및 방법, 그리고 소프트웨어 맞춤화 방법 |
US8892513B2 (en) * | 2011-10-31 | 2014-11-18 | U9T Inc | Method, process and system to atomically structure varied data and transform into context associated data |
US9256419B2 (en) * | 2012-04-23 | 2016-02-09 | Hewlett Packard Enterprise Development Lp | Dynamic software updates |
US20140188952A1 (en) * | 2012-12-31 | 2014-07-03 | Praveen Killamsetti | Reading data without an indirection logical reference identifier in a system that uses indirection access |
US10333696B2 (en) | 2015-01-12 | 2019-06-25 | X-Prime, Inc. | Systems and methods for implementing an efficient, scalable homomorphic transformation of encrypted data with minimal data expansion and improved processing efficiency |
WO2019092552A1 (en) | 2017-11-09 | 2019-05-16 | nChain Holdings Limited | Systems and methods for ensuring correct execution of computer program using a mediator computer system |
KR20200086284A (ko) | 2017-11-09 | 2020-07-16 | 엔체인 홀딩스 리미티드 | 최적화된 확인 가능한 계산을 위해 실행 가능한 명령어를 단순화하기 위한 시스템 |
KR20200096248A (ko) | 2017-12-13 | 2020-08-11 | 엔체인 홀딩스 리미티드 | 암호 자료를 안전하게 공유하기 위한 시스템 및 방법 |
Family Cites Families (30)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US4246638A (en) | 1978-09-14 | 1981-01-20 | Thomas William J | Method and apparatus for controlling usage of a programmable computing machine |
US5291601A (en) | 1989-06-01 | 1994-03-01 | Hewlett-Packard Company | Shared libraries implemented with linking program loader |
CA2102883A1 (en) | 1993-02-26 | 1994-08-27 | James W. Arendt | System and method for lazy loading of shared libraries |
US5446888A (en) | 1994-01-14 | 1995-08-29 | Pyne; Charles F. | Remote file transfer method and apparatus |
JP2755154B2 (ja) | 1994-02-23 | 1998-05-20 | 日本電気株式会社 | プログラム変換処理装置およびプログラム変換処理方法 |
TW313643B (zh) | 1994-12-14 | 1997-08-21 | At & T Corp | |
US5802367A (en) | 1995-07-07 | 1998-09-01 | Microsoft Corporation | Method and system for transparently executing code using a surrogate process |
US6112025A (en) | 1996-03-25 | 2000-08-29 | Sun Microsystems, Inc. | System and method for dynamic program linking |
US5893113A (en) | 1996-04-25 | 1999-04-06 | Navigation Technologies Corporation | Update transactions and method and programming for use thereof for incrementally updating a geographic database |
IL127492A (en) | 1996-06-11 | 2004-06-01 | Edgar Codd | Delta model processing logic representation and execution system |
US5832520A (en) | 1996-07-03 | 1998-11-03 | Miller, Call, Plauck And Miller | Automatic file differencing and updating system |
US6006034A (en) | 1996-09-05 | 1999-12-21 | Open Software Associates, Ltd. | Systems and methods for automatic application version upgrading and maintenance |
US5991765A (en) | 1997-05-06 | 1999-11-23 | Birdstep Technology As | System and method for storing and manipulating data in an information handling system |
US6421827B1 (en) | 1997-12-17 | 2002-07-16 | International Business Machines Corporation | System and method for detecting and reordering loading patterns |
US6230316B1 (en) | 1998-04-17 | 2001-05-08 | Symantec Corporation | Patching rebased and realigned executable files |
US6279149B1 (en) | 1998-09-24 | 2001-08-21 | International Business Machines Corporation | Aggregate structure identification and its application to program analysis |
US6243859B1 (en) | 1998-11-02 | 2001-06-05 | Hu Chen-Kuang | Method of edit program codes by in time extracting and storing |
US6564219B1 (en) * | 1998-11-19 | 2003-05-13 | Emc Corporation | Method and apparatus for obtaining an identifier for a logical unit of data in a database |
US20020073398A1 (en) | 1998-12-14 | 2002-06-13 | Jeffrey L. Tinker | Method and system for modifying executable code to add additional functionality |
US6763397B1 (en) | 1999-05-27 | 2004-07-13 | Sun Microsystems, Inc. | Fully lazy linking |
US6601114B1 (en) | 1999-05-27 | 2003-07-29 | Sun Microsystems, Inc. | Fully lazy linking with module-by-module verification |
US6564223B1 (en) | 1999-09-30 | 2003-05-13 | Oracle Corp. | Method and article for managing references to external objects in a runtime environment |
US6691305B1 (en) | 1999-11-10 | 2004-02-10 | Nec Corporation | Object code compression using different schemes for different instruction types |
US7089390B2 (en) | 2001-02-16 | 2006-08-08 | Broadcom Corporation | Apparatus and method to reduce memory footprints in processor architectures |
US20020143764A1 (en) * | 2001-04-03 | 2002-10-03 | Martin Andrew R. | Data management system and method for intercepting and changing database instructions between a database back end and an application front end |
US7047521B2 (en) | 2001-06-07 | 2006-05-16 | Lynoxworks, Inc. | Dynamic instrumentation event trace system and methods |
US6971089B2 (en) | 2001-08-01 | 2005-11-29 | International Business Machines Corporation | Debugger impact reduction through motion of induction variable based breakpoints |
US7117507B2 (en) | 2002-06-03 | 2006-10-03 | Sumisho Computer Systems Corporation | Software atomization |
US7281017B2 (en) | 2002-06-21 | 2007-10-09 | Sumisho Computer Systems Corporation | Views for software atomization |
US7490331B2 (en) | 2003-03-04 | 2009-02-10 | International Business Machines Corporation | Mapping to and from native type formats |
-
2002
- 2002-06-21 US US10/178,898 patent/US7281017B2/en not_active Expired - Lifetime
-
2003
- 2003-06-18 KR KR1020047020754A patent/KR20050081869A/ko not_active Application Discontinuation
- 2003-06-18 EP EP03761098A patent/EP1518193A2/en not_active Withdrawn
- 2003-06-18 CA CA002490281A patent/CA2490281A1/en not_active Abandoned
- 2003-06-18 WO PCT/US2003/019180 patent/WO2004001592A2/en not_active Application Discontinuation
- 2003-06-18 CN CNA038173417A patent/CN1672150A/zh active Pending
- 2003-06-18 JP JP2004515872A patent/JP2005531066A/ja not_active Withdrawn
- 2003-06-18 AU AU2003247547A patent/AU2003247547A1/en not_active Abandoned
Cited By (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108959499A (zh) * | 2018-06-26 | 2018-12-07 | 郑州云海信息技术有限公司 | 分布式文件系统性能分析方法、装置、设备及存储介质 |
CN109145025A (zh) * | 2018-09-14 | 2019-01-04 | 阿里巴巴集团控股有限公司 | 一种多数据源集成的数据查询方法、装置及业务服务器 |
CN109145025B (zh) * | 2018-09-14 | 2021-09-24 | 创新先进技术有限公司 | 一种多数据源集成的数据查询方法、装置及业务服务器 |
CN112241276A (zh) * | 2019-07-19 | 2021-01-19 | 华为技术有限公司 | 一种设备的升级方法及装置 |
CN113448942A (zh) * | 2020-03-27 | 2021-09-28 | 阿里巴巴集团控股有限公司 | 数据库访问方法、装置、设备及存储介质 |
CN113448942B (zh) * | 2020-03-27 | 2022-07-22 | 阿里巴巴集团控股有限公司 | 数据库访问方法、装置、设备及存储介质 |
Also Published As
Publication number | Publication date |
---|---|
AU2003247547A8 (en) | 2004-01-06 |
CA2490281A1 (en) | 2003-12-31 |
WO2004001592A3 (en) | 2004-05-21 |
US20030236794A1 (en) | 2003-12-25 |
KR20050081869A (ko) | 2005-08-19 |
AU2003247547A1 (en) | 2004-01-06 |
EP1518193A2 (en) | 2005-03-30 |
US7281017B2 (en) | 2007-10-09 |
WO2004001592A2 (en) | 2003-12-31 |
JP2005531066A (ja) | 2005-10-13 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN1672150A (zh) | 用于软件原子化的视图 | |
CN100559346C (zh) | 用于实例化抽象类的系统和方法 | |
CN1287257C (zh) | 用于算术表达式优化的方法和装置 | |
CN1315017A (zh) | 包含内部引用的两种版本数据表格之间的差别提取 | |
CN1645323A (zh) | 以存储技术抽象方式在文件内创建文件系统 | |
CN1826586A (zh) | 软件原子化 | |
EP0949566B1 (en) | Method and system for performing static initialization | |
US20070271553A1 (en) | Method and system for translating assembler code to a target language | |
CN1672133A (zh) | 优化的代码生成 | |
CN1529849A (zh) | 编译用于交互式电视的解释性语言的方法和装置 | |
CN1276359C (zh) | 用于检查和操作数据的存储器引擎 | |
CN1591406A (zh) | 集成多应用数据处理系统 | |
CN1802632A (zh) | 用于在程序代码转换期间执行解释器优化的方法和装置 | |
CN1577268A (zh) | 共享库系统及构建该系统的方法 | |
CN1781078A (zh) | 硬件加速器个性编译器 | |
US6983458B1 (en) | System for optimizing data type definition in program language processing, method and computer readable recording medium therefor | |
US10541046B2 (en) | Creating genetic devices | |
CN1168029A (zh) | 文档管理设备,数据压缩方法和数据解压缩方法 | |
CN1504881A (zh) | 爪哇执行设备和爪哇执行方法 | |
CN1127688C (zh) | 转变位结构体系中的指令的方法、系统 | |
CN1228558A (zh) | 程序变换方法和程序变换系统 | |
CN1415091A (zh) | 数据结构管理装置、数据结构管理系统、数据结构管理方法以及用于记录数据结构管理程序的计算机可读介质 | |
CN101443753A (zh) | 用于数字图像的可扩展元数据体系结构的系统和方法 | |
CN1379879A (zh) | 并行计算机体系结构,使用这种体系结构的信息处理单元 | |
CN1853167A (zh) | 具有可扩展预配置的动态内容处理的系统和方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C02 | Deemed withdrawal of patent application after publication (patent law 2001) | ||
WD01 | Invention patent application deemed withdrawn after publication |