一种终端软件升级方法及装置的制造方法_3

文档序号:9217050阅读:来源:国知局
步骤3. 4:对强连通分量进行分组。
[0085] 步骤3. 5 :使用拓扑排序建立兀素集合的有序关系。
[0086] 步骤4:以步骤3的元素输出顺序作为处理的顺序,逐个元素进行差分信息的计 算,这部分计算将交给DifTAlgorithm模块负责。
[0087] 步骤4. 1 :利用Sort模块对Old元素内部元数据进行排序(这一个排序的动作 对于后期进行搜索匹配区域的效率和匹配长度至关重要,而匹配的长度越长则差分效果越 好),上面的每一个元素〇1屯其实是一组二进制数据,这些二进制数据是一个元素内部的数 据,称之为元数据。
[0088] 步骤4. 2 :利用Search模块进行新旧数据的交叉搜索,以获取源数据到目标数据 的差分信息,所谓的差分信息其实就是找到对应的匹配区域和非匹配区域,用相应的控制 命令取代数据本身生成的信息,控制命令由Command模块生成的。
[0089] 步骤5:由Command模块生成控制命令。
[0090] 步骤6:最后将各个元素的差分信息交由Compress模块进行压缩优化。
[0091]步骤7 :将输出数据流再交给Packager模块以预定义的格式整合到一个差分数据 结构中,进行输出。
[0092] 步骤8:最后输出到差分文件中,最终生成差分包。
[0093] 上述8步骤描述了各个模块是以怎样的方式做出从源版本到目标版本的差分包 的。
[0094] 预处理源文件和目标文件的步骤具体如下:
[0095] 下面以一个例子讲解该算法过程,但是本算法的使用情况并不仅限于这个例子。
[0096] 为了降低问题规模,采用分治的思路处理源文件和目标文件,首先对源文件和目 标文件的数据进行建模,将文件数据转为相应的集合,然后计算集合中的每一个元素对偶 (〇1屯,newj的差分信息。
[0097] 建立的集合一般是一个多重集合,也即是一个有着多个相同属性元素的集合,可 以表示成:
[0100] 以上就是一个有n个e元素,n个d元素,n个a元素的多重集合。而每一个元素 并不是一个简单数据而是一个复合数据,包含了如位置,数值等等属性。
[0101] 对每一个元素以一种原地升级的方式进行单独的差分升级,也就是进行 〇1屯一neWi的操作,所谓的原地升级就是将同一块区域的源数据直接更新成目标数据,具 体地说,本发明所述的差分方案就是专门针对这一类flash空间很小的设备的,采用原地 升级的升级方式,所谓的原地升级就是,依次更新设备上某一地址区间上的版本数据,然后 将对应的目标版本的新数据直接覆盖写入这一地址区间。这样的话就会出现提前覆盖源数 据这样的情况,而在更新下一个元素数据的时候有时是需要用到这一块的源数据的,所以 为了避免这种情况,需要提前对各个元素进行一次排序。为了使得依赖关系尽可能的紧确, 首先会预处理一次元素集合以找到集合的偏序关系,其实就是各元素间的依赖关系,根据 这一偏序关系建立元素间的有向图,再使用Tarjan算法找到这一有向图的所有强连通分 量:
[0104] 其中,〇Wstt| = {old, :dk <iSd,}?这里[dk,dj]是指一个强连通分量i所对应的元 素索引范围。然后对各个强连通分量进行分组,再对组间的强连通分量进行拓扑排序,从而 建立多重集合的有序关系:
[0105] 也就是把各个元素安排成一个线性序列使得只要ddauS 则有akl〈ak2。这意味着所有元素被重新安排成一条线,使得所有箭头都指向右。
[0106] 使用优化的快速排序进行元数据的倍增排序,具体如下:
[0107] 每一个元素是带有成员数据的数据结构,其实就是一组二进制数据,这些二 进制数据是一个元素内部的数据,称之为元数据。首先需要使这些元素内部的元数据也有 序,设计了一种带有缓存机制的排序算法,排序的目的是为了后期建立匹配区域和非匹配 区域提供量化标准,以便搜索。因此针对每一个元素内部的元数据使用倍增法的思想来 进行排序:首先通过一轮迭代将数据分组(即将rank值相同的元数据归到一个元组(meta_ group)中),记录当前迭代中各元组的名次(它代表了这一组中所有元数据的名次)和元组 中所含的元数据个数(也称之为元组的长度),以用到下一次迭代中,当元组的长度为1时, 那么这个元组标记为已排好序的,也就是已经找到了它合适的位置。然后在下一次迭代时 对同一个meta_group中的元数据使用优化过的快速排序方法进行排序,排序使用的主键 是当前元组中每一个元数据之后的元数据的名次(注意数据的长度一定要是这个组所代表 的长度,从而达到倍增的目的),次键是当前元组的名次,如果上一轮的比较迭代的比较长 度是H-order,那么这一轮比较迭代就是2H-〇rder的比较,所以是倍增的。以此类推直到比 较长度等于元素内部数据的长度时,该元素内部的比较就结束了,算法复杂度显而易见是 0(l〇gn),这样能够保证了元素内部数据的有序性。
[0108] 而上述过程所产生的有序性的记录,会以特定格式将其序列化到文件中,文件名 要具有唯一性。使得下次使用这写有序性数据的时候无需再次做一次处理,而是直接从文 件中反序列化出来加以使用,从而略过产生中间临时数据这一过程以提升算法实际执行效 率。
[0109] 同时在排序过程中我们使用了优化的快速排序,优化点有2点,分别是:消除尾 递归、减少函数的调用堆栈深度。伪代码如下所示:
[0110]
[0111] 本来算法的末尾还有一次sfqsort(OldRank,selector+1,right)的调用,但是消 除尾递归以后就会去掉这次sfqsort的函数调用,减少调用树的叶子节点数目。
[0112] 降低最坏情况下的调用堆栈深度,让每一次的待排序子区间至少减半,而调用堆 栈深度是跟子区间长度紧密相关的,因为调用树的每一层都会递减至少一半子区间的规 模,而到达调用树的叶子节点时调用结束,而调用树的最大深度记为O(logn),所以调用堆 栈深度最坏情况下就是〇(l〇gn),其中n是[left,right]的区间长度。伪代码如下所示:
[0113]
[0114] 排序的目的是为了给将来的搜索提供量化指标(也就是以什么样的标准来进行 搜索),同时排序以后的数据才便于使用二分搜索查找相同数据建立匹配区域和非匹配区 域。
[0115] 建匹配区域和非匹配区域,具体如下:
[0116] 在对二进制数据搜索最优匹配的过程中,我们是在已经排好序的数据基础之上进 行二分搜索的,这也是整个算法高效的核心所在。
[0117] 利用搜索到的最优匹配,找到绝对匹配区域,但实际在对二进制编译文件的研究 中发现,实际上代码的一处修改,会导致整个编译文件的处处修改,所以如果在一定阈值范 围内,区域仍然大致匹配的话,那么实际上这里不是代码修改导致的非匹配区域。因而算法 会将绝对匹配区域一直扩展下去,直到阈值范围以外。而这一段区域称之为模糊匹配区域。 经过研究和验证,这一点改进是必要且可行的。在元数据上的控制区域的结构示意图如图 6所示,其中:
[0118] Equal区域是绝对匹配区域,DifT区域是绝对非匹配区域,括号部分是模糊匹配 区域。区域的箭头代表绝对匹配区域的可扩展方向,将从上一次的模糊匹配区域开始进行 前向扩展,同时从该次的绝对匹配区域开始进行后向扩展,如果在扩展区域中发现该区域 满足了模糊匹配的条件,那么将该扩展区域标记为模糊匹配区域,并合入到上一次的匹配 控制区域,这需要动态调整上一个控制命令。否则以一个新的控制命令来记录新的控制匹 配区域。
[0119] 计算源文件和目标文件的差分信息,具体如下:
[0120] 建立了匹配区域和非匹配区域后,将对每一个区域以一个控制命令取代,即以 一种表格的形式记录控制命令对应的控制区域,这样大量的信息就被短短几个字节所取 代,从而达到差分的目的。控制命令分成SetCommand、CopyCommand两大类。SetCommand 代表非匹配部分数据,这一部分数据在old数据中找不到匹配的数据,只能进行替 换;CopyCommand代表匹配区域部分数据,这一部分数据可以在old源文件上查找到相应 数据,所以只需要标记以后即可跳过,差分的效率主要体现在CopyCommand的个数上。
[0121] 控制命令的结构分为4部分组成,组成如图10所示:
[0122] Type:表示该命令的类型,类型详情见上述;
[0123]From:表示该命令所控制的区域的起始地址;
[0124]LengthData:长度数据,是指所代表的数据的长度,对这一个值会进行精心的编码 优化;
[0125]data:CopyCommand不需要这一部分在数据流中不会占据位置,而SetCommand需 要这一部分表示需要插入的数据内容。
[0126] 本发明还可以对SetCommand的编码进行优化,其中SetCommand命令分为:SET_ command_base,SET_PTR_DELTA_C0MMAND,SET_PTR_PAIR_C0MMAND,S
当前第3页1 2 3 4 5 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1