没有合适的资源?快使用搜索试试~ 我知道了~
理论计算机科学电子笔记176(2007)97-108www.elsevier.com/locate/entcs数据流分析作为可验证程序注释传输的一般概念WolframAmme,2 Marc-Andr′eMüoller,3PhilippAdler4InstitutfurIinforfrmatikFrieddrich-Schilller-Universita?tJena德国耶拿摘要即时(JIT)编译经常被采用,以便加速平台无关的和动态可扩展的移动代码应用程序的执行。由于动态编译所需的时间直接影响程序的执行时间,JIT编译器通常只利用简单快速的技术进行程序分析和优化。为了进一步改进这种编译器的分析和优化过程,可以使用程序注释然而,大多数当前的注释方法都基于这样的事实,即对所传输的程序信息的验证是耗时的,因此将不会在移动代码系统的消费者侧上执行。在本文中,我们提出了一个可验证的注释技术,是基于一个众所周知的迭代数据流算法,可用于传输的所有程序信息,可以通过数据流分析得出。编译和验证时间的初步测量表明,所提出的技术似乎是可实现的,因此可以用作安全程序注释的通用传输技术。关键词:数据流分析,程序注释,验证1介绍与平台无关的移动代码(如Java字节码)通常使用即时编译来执行。由于移动代码,特别是Java字节码,在到达运行时系统时通常是未优化的,因此即时(JIT)编译器通常应用几种分析和优化技术来更快更有效地运行移动然而,由于分析和优化工作量很大,1由发展集团以赠款AM-150/1-1和AM-150/1-3提供部分支助2电子邮件地址:amme@informatik.uni-jena.de3电子邮件地址:marcandm@informatik.uni-jena.de4电子邮件地址:phadler@informatik.uni-jena.de1571-0661 © 2007 Elsevier B. V.在CC BY-NC-ND许可下开放访问。doi:10.1016/j.entcs.2006.06.01998W. Amme等人/理论计算机科学电子笔记176(2007)97增加程序执行时间,大多数JIT编译器只包含快速和简单的分析方法。程序注释已经被建议用于改进JIT编译器的代码生成或验证过程。 术语程序注释用作在生成移动代码期间添加到移动代码中的代码信息的同义词。移动系统的用户端可以使用这些信息来加速优化或提高给定程序的安全性。将移动代码传输到运行时环境后的主要挑战是验证传输的注释。由于注释是从程序中导出的附加信息因此,在大多数项目中,计划注释被认为是合理的[7,13],不会受到进一步的审查。然而,如果代码使用者依赖于注释,但不能证明它们的正确性,则可能发生程序代码的语义上不正确的转换,并且可能导致有害行为。本文提出了一种基于数据流分析的可验证的程序注释技术,该技术可用于传输可通过数据流框架建模的程序信息。我们的技术得出的信息的程序在生产者侧利用一个众所周知的一般迭代数据流算法。分析完成后,我们的算法将部分派生的数据流信息(称为注释点)添加到传输的代码格式中。在消费者侧,通过使用与生产者侧相同的通用数据流算法的修改版本,从传输的注释点重构完整的数据流信息。程序注释的不准确传输(如操作)可以从该算法中检测到,因为所考虑的数据流问题的固定点无法从其注释点重建特别是,在这项工作中提出的技术已经开发的SafeTSA程序的注释。SafeTSA[1,2]是一种安全的移动代码格式,设计为Java虚拟机字节码语言(JVML)的替代品。SafeTSA使用新颖的编码技术安全而简洁地表示静态单一分配形式(SSA形式[4])中的程序。SSA Form的使用简化了验证和代码生成过程,还允许自然有效地应用生产者端平台无关优化。作为概念证明,我们已经开发了一个完整的系统,用于传输SafeTSA程序,可用于Java编写的程序以及IA32和PowerPC目标架构。本文的结构如下:第2节简单介绍了单调数据流分析,第3节描述了我们的程序注释技术的概念功能。实施细节和结果见第4节。在第5节中,我们讨论了相关的工作,第6节以总结结束。W. Amme等人/理论计算机科学电子笔记176(2007)9799fi(IN)= 出来IN_Z = OUT_X(a)(b)第(1)款OUT_YFig. 1. (a)语义函数的集合和(b)相遇算子。2单调数据流分析数据流分析通过将本地计算的数据流信息迭代地传播通过程序.原则上,每个数据流问题都可以使用数据流框架(L,F,F)来建模,其中L被称为数据流信息集,F是满足运算符(有时在文献中称为联合运算符),F是语义函数集。数据流框架的数据流信息集是分析所基于的对象的概念域。语义函数fi直接对应于程序中的指令,并对执行的结果进行建模。在输入的数据流信息上(见图1a)。meet运算符实现控制流程图中的连接路径。图1b描述了用于控制流程图的节点的相遇运算符的函数,该控制流程图的节点可以从其两个前趋节点到达。在该示例中,两个数据流信息项OUTX和OUTY(每个来自不同的程序路径)被合并成数据流信息INZ。图2显示了一个通用的迭代算法,当且仅当语义函数是单调的并且(L,L)形成一个有界半格,其中一个元素为1,零元素0[14]。符合以下要求的数据流框架正确性被称为单调数据流框架(Monotone Data Flow Framework,简称DVDF)。在算法的初始阶段方法的开始节点s被分配了一个特殊的元素NULL,它代表从方法的不同调用点到达开始节点的信息对于我们感兴趣的过程内分析,NULL代表没有传入信息,因此可以根据所考虑的数据问题由半格的一个或零个元素表示在迭代阶段,算法为每个指令连续地导出来自其直接前驱节点的传出数据流该算法终止并作为5一个语义函数f被称为单调i ∈,对于每个a,b∈L,f(a<$b)≤f(a)<$f(b),其中≤是通过半格给出的普通偏序:a≤bParticia<$b=a,对于每个a,b ∈L。在INSTR我出来XYOUT_XOUT_YZ100W. Amme等人/理论计算机科学电子笔记176(2007)971OUT(s):=NULL2对于每个n∈N− {s}3do OUT(n):= 1 end for4做5stable:= true6Forreveryn∈VN−{s}do7IN(n):= OUT(pred(n))8NEW:= f_n(IN(n))9如果NEW OUT(n),则10OUT(n):=NEW11stable:= false12endif13端14同时(!稳定)图二. 一般迭代算法如果对于每个指令不能导出进一步的数据流信息,则产生数据流框架的安全解决方案。3单调数据流分析作为可验证程序注释构造可验证程序注释的最简单方法是用通用迭代算法为每条指令导出的数据流信息项来注释该指令。由于分配给程序的开始节点的数据流信息对于每个特殊的数据流问题是已知的,因此在消费者侧,可以通过将通用迭代数据流算法应用于这些注释来验证传输的注释。如果算法的应用在一次执行迭代后是稳定的,则程序注释表示相应单调数据流框架的定点,因此必须与在生产者侧添加到移动代码格式的那些相同。相反,如果算法的应用将导致执行进一步的迭代,则注释必须在传输过程中被修改。3.1注释点但是,使用相应的数据流信息项注释每条指令将导致不可接受的文件大小。为了避免这样一个大的增加传输的程序代码在我们的方法中,只有数据流信息项将被添加到那些指令,这是必不可少的恢复所考虑的数据流分析的完整结果。在我们的方法中,对恢复整个数据流信息至关重要的指令称为注释点。根据对传输的程序注释的有效验证,注释点的选择应确保在通用算法的单次迭代期间,数据流结果的恢复可被集成到在SafeTSA中,它实际上可以被认为是一种高级中间表示,可以防止出现不可约的控制流程图,快速恢复和验证通过的要求可以通过对具有传出后向边缘的指令W. Amme等人/理论计算机科学电子笔记176(2007)97101(a)(b)(c)(d)::::::::图三.程序(a)不使用循环,(b)使用while循环,(c)使用重复循环,(d)使用嵌套循环。图3显示了一些示例程序的控制流程图中注释点的位置。在图中,黑色节点代表注释点,灰色阴影节点表示控制流程图的开始节点。 为 没有循环的程序(图3a)数据流信息项可以在通用算法的一次迭代期间为每个指令导出,因此对于这种程序不需要使用注释点。相反,对于包含一个或多个循环的程序(图3b,c和d),每个具有到循环入口点的传出边缘的指令都将成为注释点。3.2恢复和验证数据流信息为了恢复数据流信息项,首先将控制流图的起始节点设置为NULL。之后,与通用算法的功能相比,每个指令的数据流信息将从其前导节点迭代计算。在恢复过程中,为了保证数据流信息的恢复一次完成,对控制流图的节点进行反向后序遍历。使用这个遍历顺序保证了总是当一个循环的入口节点是102W. Amme等人/理论计算机科学电子笔记176(2007)971OUT(s):=NULL2针对每n∈VN− {s}in rpostorder do3IN(n):= OUT(pred(n))4NEW:= f_n(IN(n))5如果n是注释点,则6if(NEW/=OUT(n))7停止8endif9端见图4。 基于标注点的到达时,将在将数据流信息传递到循环外部之前导出循环内部的指令的数据流信息如果在针对每个注释点的恢复过程期间,计算与注释项完全相同的数据流信息项,则必须导出数据流框架的定点,并且因此从注释点恢复的数据流信息项至少代表数据流问题的安全解决方案图4显示了通用迭代算法的修改版本,该算法用于恢复数据流信息和验证注释点。与一般迭代算法的一个重要区别是,该算法中没有封闭的do-while循环,因此它只需要一次迭代即可完成恢复和验证过程。从每个指令数据的开始节点开始,在反转后序中计算流信息项这保证了当算法进入循环时,循环体中的数据流已经到达。此时,将导出的数据流信息与注释的数据流信息进行比较。如果它们不匹配,则所有注释都将被视为不正确,算法将停止。如果这些比较对于所有注释点都为真,则注释和所有其他数据流信息项都可以被认为是正确的,即,由算法递送的数据流信息项构建数据流问题的安全近似。为了证明我们算法的正确性,我们建立了以下定理,该定理指出,如果在算法中,具有传入信息K的循环的注释点的正确性可以被验证,则添加到注释点的项必须始终是相同情况下由一般迭代算法提供的信息的安全近似。定理3.1设(L,f,F)是一个环,p是一个任意环,f1,. ,fn∈F是分配给p的指令的语义函数,Ap是p的注释点,A ∈ L是已注释到Ap的项。 则对于每个K ∈ L,f1... <$f n(K <$A)= A =<$A ≤ f fix(K),其中ffix(K)代表将针对Ap利用输入数据流信息K对p应用一般迭代算法而导出的项。我的律师。 Sincef1.. . 如果你不介意,我们会很高兴的。 . fn由f1···n表示,因为单调性在函数复合下也成立从单调的-W. Amme等人/理论计算机科学电子笔记176(2007)97103我是一个很好的朋友,我f1···n(K<$A)≤f1···n(K)<$f1···n(A)的一个充要条件A≤f1···n(K)<$f1···n(A)当A≤f1···n(K)时,通过将K加到不等式的两边,我们得到:A<$K≤K<$f1···n(K)1···n的序列号不能更新,而且必须满足以下要求:f1···n(A<$K)≤f1···n(K<$f1···n(K))“我的天,一任意重复最后两步,我们经常得到A ≤ f fix(K)。□在所有的注释点都被我们的算法接受的情况下,从算法中恢复的数据流信息项的正确性可以通过定理3.1的连续应用来证明。作为一个开始,我们的算法可以处理的程序如图5a所示,我们的算法首先将与开始节点相关联的数据流信息向下传播到第一个循环条目。由于Ki可以被看作是正确的,因为它的原点在起始节点,定理3.1得出,离开循环的信息必须是对输入Ki应用的一般迭代算法所传递的信息的安全近似。在以这种方式验证注释点之后,其结果(现在可以被视为安全)将通过控制流程图传播,直到到达下一个循环。因此,定理3.1的连续重新应用最终将证明算法的正确性。对于一般的论证,内循环使用单调函数建模如果一个循环是嵌套的,如图5b和c所示,内部循环被认为是一个函数g。为了得到正确的结论,必须保证g保持底层循环的语义。 如前所述,定理3.1可以是应用。 由于假设f1为… f n(K j<$A j)= A j特别适用于可以得出结论,Aj是一般迭代算法将针对输入Kj上的内部循环的注释点导出的结果的近似。由于这个原因,在我们的算法中,语义函数的结果,即代表内部循环的执行对数据流信息的影响,总是可以被认为是原始数据流信息的安全近似。因此,即使存在内部循环,我们的算法执行的恢复过程也提供了安全的解决方案104W. Amme等人/理论计算机科学电子笔记176(2007)97Ki王空::(a)(b)(c)第(1)款SSS:::::::::AIGAiA j图五. (a)正常循环,(b)嵌套循环,(c)嵌套循环被函数g4实施情况和初步成果所提出的程序注释概念已完全实现到SafeTSA系统中。在这样做时,SafeTSA此外,此数据流算法的改良版本已整合至系统的消费者端,以执行必要的恢复及验证过程。为了隐藏实现细节,构造了DataFlowInformation(D fi)接口该接口必须由SafeTSA系统两侧的用户通过添加表示所考虑的数据流框架的数据流信息的适当字段和对象来分别扩展。图6描述了在D fi中定义的方法的一部分及其在生产者端的一般迭代算法中的调用点。为了将数据流算法用于注释目的,接口定义了编码和解码方法。在生产者端,代码必须实现为将数据流信息项编码为注释适当表示的方法,而其对应物必须实现为将其转换回消费者端的内部表示的方法为了从经验上评估所提出的注释技术是否提供了Ki:KiA我:W. Amme等人/理论计算机科学电子笔记176(2007)97105OUT(n)public void findDuplicate(findDuplicate);String s = NULL;对于N − {s}return(n)= 1;intfindDuplicate();做对于N −{s}中的所有n,执行IN(n):= /\OUT(pred(n));NEW:= f_n(n);if(NEW!OUT(n))* =新的;return();stable:= false;end if;int n =nums(nums);同时(!stable);见图6。 由接口Dfi给出的方法和由通用迭代算法调用的方法。基准数目的指令分析时间(秒)文件大小总注记点正常注记点(Δ%)莫尔丁1931260,3180,2204,17欧拉8709463,3702,0160,65Montecarlo2371120,5020,2540,12RayTracer166190,1180,0670,39搜索1116240,2720,1570,41见图7。 测量结果为了实现预期的性能优势,我们在SafeTSA的生产者和消费者端构建了接口D fi的实现支配边界计算给定控制流图的每个节点n的支配6n的节点。我们运行了一系列基准测试,其中我们特别比较了普通数据流分析和基于我们的程序注释技术的数据流分析所需的编译时间。下面讨论的所有结果都是通过运行Java Grande Forum Sequential Benchmarks(JGF)[10]第3节中的基准程序获得的。之所以选择Java Grande Benchmarks,是因为它们在源代码中可以免费获得,并且似乎适合于测量注释和非注释程序的编译为了从一次运行到下一次运行获得稳定的结果,我们将每个基准测试重复执行多次,并获得最佳结果。图7描述了注释点的数量、绝对编译时间6.控制流程图的节点k支配节点ni,在从开始节点开始并以n结束的所有路径上,将执行k的执行106W. Amme等人/理论计算机科学电子笔记176(2007)97以及我们在基准程序中应用普通和基于注释的数据流分析时测量的文件大小的增加。令人惊讶的是,测量结果表明,与程序指令的总数相比,恢复数据流信息所需的注释点的数量作为MonteCarlo基准测试的一个例子,只需要2371条指令中的12个注释点。为了估计通过注释点插入的额外文件大小开销,我们创建了基准程序的注释和非注释版本。这些不同编码的SafeTSA类的比较指出,在大多数情况下,由于注释而增加的文件大小是最小的实际上,测量结果显示,仅对于基准Moldyn,注释版本的文件大小增加了可观察到的(4.17%)。对于所有其他基准测试,文件大小增量在0.12%到0.65%之间,相对于未注释的基准测试版本。基于程序注释确定优势边界所需的编译时间测量结果表明,基于程序注释的数据流分析的应用程序始终导致相当大的性能增益。对于基准程序Euler,我们的注释算法甚至比非注释版本快1.354秒(或40%)。5相关工作JIT编译器的普遍使用导致对算法的研究增加,以加速移动代码的代码生成和程序执行。使用注释技术是一种很有前途的方法,可以将大部分优化工作外包给代码生产者。代码使用者可以使用获得的信息来减少动态优化的开销和时间消耗。因此,毫不奇怪,在这个领域的第一个出版物处理程序优化。在[3]和[8]中,引入了注释框架,其中JIT编译器利用Java前端生成的注释。这些注释携带有关优化的信息。因此,可以在不执行昂贵的分析和转换的情况下产生这种方法的一个主要问题是,这些注释是不可验证的,并且假设是合理的。几乎所有其他可用的注释技术,如[7],[9]和[13]中提出的注释技术,也都有这个缺点。注释只是作为代码属性或类似的属性传输,而没有针对操纵的保护。如果代码使用者依赖于所提供但经过操作的信息,则可能发生语义上不正确的转换,从而导致严重的安全问题。例如,在传输用于边界检查删除[13]或过程间副作用检查优化[9]的信息时,恶意代码可能会导致在未优化版本中会失败的检查的消除。在最坏的情况下,计算机攻击和数据丢失可能是后果。通过其他注释,威胁并不像前面提到的那么高。在传递有用信息的同时,W. Amme等人/理论计算机科学电子笔记176(2007)97107像虚拟寄存器分配[7]操作这样的程序改进导致更差的运行时行为,但程序语义没有改变。尽管如此,以这种方式进行的操纵仍然可以用于拒绝服务攻击和其他类似的威胁。为了减少执行移动程序的开销,减少验证时间(特别是对于受限设备)是合适的。在[11]中,验证过程被分成两部分,一部分在代码生产者处执行,另一部分在代码消费者处执行。在代码生产者处,验证信息被构造并作为验证证书(可以理解为注释)与移动代码一起传输给消费者。在那里,完成了由代码和证书检查组成的轻量级验证,比正常的验证算法需要更少的时间和空间。通过构造,这些验证证书是防篡改和可验证的,但该技术难以推广,难以应用于其他领域。在[5]和[6]中介绍的一些较新的研究指定了一种技术,该技术以安全和可验证的方式传输包含转义分析结果的注释这个想法是通过一个额外的维度来扩展基础类型系统,该维度代表“捕获”,即引用是否逃逸或可能逃逸的属性。此注释过程是防篡改的。如果将状态更改为escape或可能的escape,则只会丢失一个优化机会。反之,改变类型会产生一个被拒绝的错误程序。这种注释技术可以扩展到其他可以表示为基础类型系统中的类型的程序对于不能描述为另一种类型的注释,此过程不可行。6结论程序注释已经被建议用于改进JIT编译器的代码生成或验证过程。由于注释是从程序中导出的附加信息,并且不属于底层移动代码,因此程序注释的验证是复杂的,因此通常不会在移动代码系统的消费者侧执行在本文中,我们介绍了安全和可验证的程序注释传输的一般概念。 我们的方法是将对程序的移动代码表示的数据流分析,其已经在生产者侧执行。在消费者端,数据流分析的整个结果将从给定程序的注释点安全地恢复。已执行的测量,用于确定的domi- nance边界显示,所需的空间注释是可以忽略不计的,编译时间是比在运行时执行一个普通的数据流分析快得多。由于优势前沿是一个比较简单的数据流问题,本文的结果应被认为是初步的。因此,在未来的工作中,我们将集中在更复杂的数据流问题。一方面是108W. Amme等人/理论计算机科学电子笔记176(2007)97一般迭代算法的运行时间会增加,因为语义函数、相遇和比较运算符的另一方面,我们预计加载和解码注释的工作量更大,因为复杂数据流问题的注释更复杂。然而,对于预期的情况下,通过加载和解码引入的时间开销将进一步包括一小部分的整体编译时间,我们的算法也应该优于普通的数据流分析时,使用更复杂的应用程序。引用[1] Amme,W.,N. Dalton,M. Franz和J. von Ronne,SafeTSA:基于静态单赋值形式的类型安全和引用安全的移动代码表示,在:程序设计语言设计和实现会议论文集(PLDI(2001),pp. 137比147[2] Amme , W. , J. von Ronne 和 M. Franz , Quantifying the benefits of SSA-based mobile code , in :Proceedings of the International Workshop on Monitoring Optimization Meets Monitoring Verification(COCV101-115[3] Azevedo,A.,A. Nicolau和J. Hummel,Java注释感知的即时(AJIT)编译系统,在:Java Grande会议论文集(JAVA142-151[4] 塞隆河,J. Ferrante,B. K.罗森,M。N. Wegman和F. K. Zadeck,E. C. C.计算静态单赋值形式和控制依赖图,ACM程序设计语言与系统学报13(1991),pp.451-490[5] Franz,M.,C. Krintz,V. Haldar和C. H. Stork,Tamper proof annotations,Technical Report 02-10,Department of Information and Computer Science,University of California,Irvine(2002)。[6] Hartmann,A.,W. Amme,J. von Ronne和M. Franz,Code annotation for safe and efficient dynamicobject resolution,in:J. Knoop and W. Zimmermann,editors,Proceedings of the 2nd InternationalWorkshop on Bronze Optimization Meets Bronze Verification(COCV18比32[7] Jones , J. 和 S. N. Kamin , Annotating Java class files with virtual registers for performance ,Concurrency:Practice and Experience12(2000),pp. 389-406[8] 克林茨角和B. Calder,Using annotations to reduce dynamic optimization time,in:Proceedings of theConference on Programming Language Design and Implementation(PLDI156-167。[9] Le , A. ,O.我 不 知 道 , 我 。J.H endren , UsingInter-proceduralside-electinform ationinJIToptimizations , in : Proceedings of the International Conference on Construction ( CC'2005),2005,pp. 287-304[10] 马修,J. A.,P. D. Coddington 和K. A. Hawick,Java Grande Benchmarks的分析和开发,在:JavaGrande会议论文集(Java72-80.[11]罗 斯 , E. 和 K. H. Rose , Lightweight bytecode veri fication , in : Proceedings of the Workshop onFormal Underpinnings of the Java Paradigm(OOPSLA[12] von Ronne,J.,“一种基于静态单分配表的安全高效的独立于机器的代码传输格式,并应用于即时编译”,博士。论文,加州大学欧文分校,美国(2005年)。[13] Yessick,D. E、在注释感知的JVM(2004)。[14] Zima,H. P.和B. Chapman,
下载后可阅读完整内容,剩余1页未读,立即下载
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://profile-avatar.csdnimg.cn/default.jpg!1)
cpongm
- 粉丝: 4
- 资源: 2万+
上传资源 快速赚钱
我的内容管理 收起
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![](https://csdnimg.cn/release/wenkucmsfe/public/img/voice.245cc511.png)
会员权益专享
最新资源
- VMP技术解析:Handle块优化与壳模板初始化
- C++ Primer 第四版更新:现代编程风格与标准库
- 计算机系统基础实验:缓冲区溢出攻击(Lab3)
- 中国结算网上业务平台:证券登记操作详解与常见问题
- FPGA驱动的五子棋博弈系统:加速与创新娱乐体验
- 多旋翼飞行器定点位置控制器设计实验
- 基于流量预测与潮汐效应的动态载频优化策略
- SQL练习:查询分析与高级操作
- 海底数据中心散热优化:从MATLAB到动态模拟
- 移动应用作业:MyDiaryBook - Google Material Design 日记APP
- Linux提权技术详解:从内核漏洞到Sudo配置错误
- 93分钟快速入门 LaTeX:从入门到实践
- 5G测试新挑战与罗德与施瓦茨解决方案
- EAS系统性能优化与故障诊断指南
- Java并发编程:JUC核心概念解析与应用
- 数据结构实验报告:基于不同存储结构的线性表和树实现
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035111.png)
安全验证
文档复制为VIP权益,开通VIP直接复制
![](https://csdnimg.cn/release/wenkucmsfe/public/img/green-success.6a4acb44.png)