高级并发与锁机制_第1页
高级并发与锁机制_第2页
高级并发与锁机制_第3页
高级并发与锁机制_第4页
高级并发与锁机制_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1/1高级并发与锁机制第一部分高级并发原理及实现 2第二部分锁机制的类型及特点 5第三部分锁粒度与性能影响 8第四部分死锁检测与处理 10第五部分并发编程模式 12第六部分无锁并发编程 15第七部分性能分析与优化 17第八部分分布式并发管理 20

第一部分高级并发原理及实现关键词关键要点主题名称:并发编程模型

1.多进程模型:创建多个相互独立的进程,各进程拥有自己的内存空间和执行上下文。

2.多线程模型:在单个进程内创建多个线程,共享同一个内存空间,但执行上下文不同。

3.协程模型:一种轻量级的并发模型,允许在单个线程内同时执行多个任务,在任务之间切换时无需保存和恢复线程上下文。

主题名称:并发控制机制

高级并发原理及实现

一、线程与协程

1.线程

*操作系统的轻量级实体,共享进程的地址空间

*具有独立的执行栈和局部变量,支持并行执行

*创建和管理成本相对较高

2.协程

*用户态轻量级线程,由用户级库管理

*共享同一个执行栈和局部变量,执行顺序由库控制

*创建和管理成本远低于线程,易于实现高并发

二、锁机制

1.悲观锁

*在访问临界区前加锁,防止其他线程访问

*实现简单,但会造成较长的等待时间和资源争用

2.乐观锁

*在访问临界区后检查数据是否发生变化,发生变化则回滚操作

*减少了锁的使用,提高了并发性,但需要维护版本号或时间戳

3.读写锁

*区分读操作和写操作,允许多个线程同时读,但只允许一个线程写

*提高了读操作的并发性,但写操作的效率较低

4.无锁并发

*使用原子操作或非阻塞数据结构,避免使用锁

*极致的并发性,但实现复杂度高,仅适用于特定场景

三、并发控制机制

1.原子操作

*保证操作不可分割,要么全部执行成功,要么全部执行失败

*使用硬件指令或特殊语言特性实现,如compare-and-swap

2.非阻塞数据结构

*通过并发链表、无锁队列等数据结构,实现无锁并发

*利用CAS等原子操作,保证数据一致性

3.线程池

*管理线程的生命周期,避免频繁创建和销毁线程的开销

*提高线程复用率,减少资源消耗

4.异步编程

*利用事件驱动或消息队列机制,实现异步并行执行

*避免线程阻塞,提高响应速度

四、高级并发技术

1.Reactor模式

*事件驱动模式,使用一个或多个线程处理来自多个客户端的事件

*可用于构建高性能网络服务器和分布式系统

2.分布式锁

*解决分布式系统中多实例并发访问问题

*利用分布式一致性协议,保证锁的全局唯一性和一致性

3.分布式事务

*保证分布式系统中多个操作的原子性、一致性、隔离性和持久性

*使用分布式协调协议,如二阶段提交或Paxos

4.负载均衡

*将请求均匀分配到多个服务器,提高系统吞吐量和可用性

*使用轮询、加权轮询或一致性哈希等算法实现

五、并发中的常见问题

1.死锁

*多个线程互相等待对方的资源,导致程序陷入僵局

*通过预防(死锁避免算法)、检测(死锁检测算法)和恢复(死锁恢复机制)解决

2.竞态条件

*多个线程同时访问共享数据时,导致数据不一致

*通过同步机制(锁、原子操作)和无锁并发技术避免

3.内存可见性

*多个线程操作共享内存时,可能出现数据不一致

*通过内存屏障、volatile变量或原子操作保证内存可见性第二部分锁机制的类型及特点锁机制的类型及特点

互斥锁(Mutex)

*互斥锁是一种最基本的锁机制,用于保护临界区代码。

*同时只有一个线程可以获取互斥锁。

*当其他线程尝试获取已被另一个线程持有的互斥锁时,会被阻塞。

*互斥锁可避免多个线程同时执行临界区代码,确保数据完整性。

自旋锁(Spinlock)

*自旋锁与互斥锁类似,但当其他线程尝试获取已被另一个线程持有的自旋锁时,不会被阻塞。

*自旋锁会不断轮询自旋锁变量,直到其状态变为未锁定,然后获取锁。

*自旋锁在争用较少的情况下性能较高,但在争用激烈的情况下可能导致CPU消耗过大。

读写锁(Read-WriteLock)

*读写锁允许多个线程同时读取共享数据,但只能有一个线程同时写入共享数据。

*这种锁机制提高了并发读操作的性能,同时仍然确保了写操作的独占性。

乐观锁

*乐观锁基于这样一个假设:大多数情况下,数据不会被并发修改。

*在执行写操作之前不获取锁。

*如果在写操作过程中检测到并发修改,则回滚该写操作并重试。

*乐观锁在争用较少的情况下性能较高,但在争用激烈的情况下可能导致回滚和重试开销过大。

悲观锁

*悲观锁基于这样一个假设:数据很可能会被并发修改。

*在执行写操作之前获取锁。

*悲观锁可以确保数据完整性,但会降低并发性能。

锁类型比较

|锁类型|并发读|并发写|争用下性能|

|||||

|互斥锁|无|无|低|

|自旋锁|无|无|中|

|读写锁|高|低|中|

|乐观锁|高|低|高(争用少)/低(争用多)|

|悲观锁|无|高|低|

锁机制的特点

死锁

*当两个或多个线程相互等待对方释放锁时发生。

*死锁会导致线程永久阻塞,需要通过设计避免或通过死锁检测和恢复机制解决。

饥饿

*当一个线程长时间无法获取锁或被其他线程抢占锁时发生。

*饥饿会导致线程永远无法执行,需要通过公平锁机制或优先级调度算法解决。

性能开销

*锁机制会引入额外的开销,包括锁获取和释放的成本以及对并发性的限制。

*选择合适的锁机制对于优化应用程序性能至关重要。

粒度

*锁机制的粒度是指锁保护的数据范围。

*细粒度的锁可以提高并发性,但也可能引入更多开销。

*粗粒度的锁可以降低开销,但也可能降低并发性。

可伸缩性

*锁机制的可伸缩性是指其在系统负载增加时处理并发请求的能力。

*可伸缩的锁机制可以随着系统规模的扩大而保持高效。

锁机制选择

选择合适的锁机制取决于应用程序的特定要求,包括并发级别、争用模式、性能开销和可伸缩性。

一般而言:

*对于低争用和短临界区,互斥锁或自旋锁是合适的。

*对于高并发读操作和低并发写操作,读写锁是合适的。

*对于乐观并发的更新操作,乐观锁是合适的。

*对于需要确保数据完整性的写操作,悲观锁是合适的。第三部分锁粒度与性能影响关键词关键要点【锁粒度】

1.锁粒度是指锁保护的数据范围。粒度越大,锁的保护范围越广,并发度越低;粒度越小,锁的保护范围越窄,并发度越高。

2.细粒度锁允许对数据进行更细致的控制,避免了不必要的同步开销,提高了并发度,但会带来更高的锁管理开销。

3.粗粒度锁虽然牺牲了并发度,但锁管理开销较低,适合保护大块数据或需要保证数据一致性的地方。

【锁升级】

锁粒度与性能影响

锁粒度是指对资源施加锁定的范围。它可以从细粒度(锁定单个数据元素)到粗粒度(锁定整个资源)不等。锁粒度的大小会对系统性能产生重大影响。

细粒度锁定

*优点:

*允许并发访问不同的数据元素,从而提高吞吐量。

*减少死锁的可能性,因为同一资源的不同部分可以同时被不同的线程访问。

*缺点:

*会产生大量的锁管理开销,导致性能下降。

*可能会导致优先级反转,当低优先级线程获得对高优先级线程所需资源的锁时就会发生这种情况。

粗粒度锁定

*优点:

*锁管理开销更低,性能更高。

*优先级反转的可能性较小。

*缺点:

*降低了吞吐量,因为同一资源的不同部分不能同时被不同的线程访问。

*增加了死锁的可能性,因为整个资源被锁定。

选择适当的锁粒度

选择适当的锁粒度需要权衡吞吐量、性能和死锁风险等因素。以下是一些指导原则:

*频繁访问的数据:使用细粒度锁定,以最大化并发性和吞吐量。

*偶尔访问的数据:使用粗粒度锁定,以降低锁管理开销。

*共享程度高的数据:使用更细粒度的锁定,以减少冲突和死锁。

*共享程度低的数据:使用更粗粒度的锁定,以提高性能。

数据结构对锁粒度的影响

数据结构的类型也会影响锁粒度的选择。例如:

*链表:细粒度锁定(锁定单个节点)可以最大化并发性。

*数组:粗粒度锁定(锁定整个数组)可以提高性能。

*哈希表:细粒度锁定(锁定单个哈希桶)可以减少冲突,但可能会导致优先级反转。

锁粒度优化技术

有几种优化技术可以帮助减轻锁粒度的负面影响:

*分段锁:将资源划分为较小的段,并对每一段使用单独的锁。这允许并发访问不同的段。

*乐观同步:在访问数据之前不获取锁,而是使用版本控制来检测冲突。如果检测到冲突,则回滚更改。

*无锁数据结构:使用数据结构,例如无锁队列和无锁堆栈,可以消除对锁定的需求。

基准测试

在进行锁粒度优化时,进行基准测试以确定最佳锁粒度非常重要。基准测试应该在预期的工作负载下进行,并考虑不同的数据大小和线程数量。第四部分死锁检测与处理死锁检测与处理

死锁概述

死锁是一种并发系统中的一种特定状态,其中两个或多个线程相互等待彼此释放锁才能继续执行。这会导致系统陷入僵局,导致所有涉及的线程都无法完成其任务。

死锁检测

死锁检测机制旨在识别系统中存在的死锁。有两种主要类型的死锁检测算法:

*资源分配图检测算法:此算法构建一个资源分配图,其中节点表示线程,边表示线程持有的锁。如果图中存在环路,则表明存在死锁。

*等待-图检测算法:此算法构建一个等待图,其中节点表示线程,边表示线程正在等待的锁。如果图中存在环路,则表明存在死锁。

死锁处理

一旦检测到死锁,有几种方法可以处理它:

*死锁预防:通过在系统设计中采取措施来防止死锁的发生,例如:

*有序资源分配:强制线程按固定顺序获取资源,以避免环路形成。

*死锁避免:在分配资源之前检查是否存在潜在死锁,并仅在安全时才分配。

*死锁检测与恢复:

*死锁检测:使用上述算法检测死锁。

*回滚与恢复:回滚涉及线程到死锁发生前的状态,并释放锁。恢复涉及重新启动线程。

*线程中止:中止一个或多个死锁线程并释放其锁,以打破死锁。

*资源抢占:从一个线程中强制抢占资源并授予给另一个线程。

*超时机制:在等待资源时为线程设置超时,如果超时,则回滚线程或中止线程。

选择死锁处理机制

选择死锁处理机制取决于系统的具体需求。以下是一些考虑因素:

*性能:检测和处理死锁的开销可能很昂贵。

*可靠性:不同的处理机制具有不同的安全性级别。

*公平性:某些机制可能导致某些线程优先于其他线程,从而影响公平性。

*应用程序语义:应用程序可能对死锁处理机制有特定要求。

死锁避免与死锁检测

死锁避免试图完全防止死锁的发生,而死锁检测在死锁发生后采取措施。死锁避免通常比死锁检测开销更大,但它消除了系统中死锁的可能性。死锁检测虽然开销较小,但它需要系统已经陷入死锁。

结论

死锁检测与处理是并发系统中的关键机制,可以防止系统陷入僵局。通过了解死锁检测和处理算法,以及如何选择最合适的处理机制,可以提高系统的可靠性、性能和公平性。第五部分并发编程模式关键词关键要点【无锁数据结构】:

1.通过消除传统锁机制来提高并发性,如使用CAS原子操作、无锁队列和无锁哈希表。

2.适用于高并发场景,如多线程处理、分布式系统和实时系统。

3.避免死锁、优先级反转和上下文切换带来的开销。

【基于信道的并发】:

高级并发与锁机制

并发编程模式

并发编程模式是指一系列设计模式,用于管理和协调并发执行中的资源访问。这些模式提供了一种结构化和可重复的方式来管理共享状态,以避免数据竞争和确保程序的正确性。

主要并发编程模式

互斥锁(Mutex)

互斥锁是一种锁,一次只允许一个线程访问共享资源。它确保在任何时刻,最多只有一个线程可以访问共享数据,从而防止数据竞争。

信号量(Semaphore)

信号量是一种锁,用于限制访问共享资源的线程数量。它可以确保资源的使用受到控制,并且不会被过量使用。

读写锁(RWLock)

读写锁是一种锁,允许多个线程同时读取共享数据,但一次只允许一个线程写入共享数据。它提高了并发性,同时防止了写入期间的数据损坏。

条件变量(ConditionalVariable)

条件变量是一种同步机制,用于等待特定条件发生。当条件满足时,线程可以被唤醒继续执行。

屏障(Barrier)

屏障是一种同步机制,用于等待一组线程都到达特定点。当所有线程都到达屏障时,它们可以同时继续执行。

原子操作

原子操作是一组不可分割的操作,作为单个单位执行。这确保了在并发执行期间,操作不会被中断,从而防止了数据竞争。

锁优缺点

优点:

*确保数据完整性:锁防止数据竞争,确保在任何时刻,共享数据只有一个线程访问。

*简单易用:锁是一种相对简单的概念,易于实现和使用。

缺点:

*性能开销:锁会引入性能开销,因为它们需要在资源访问前后进行获取和释放。

*死锁:如果锁被不当使用,可能会导致死锁,其中多个线程等待被释放的锁。

*优先级反转:锁可能会导致优先级反转,其中低优先级线程可以阻止高优先级线程访问共享资源。

锁替代方案

除了锁之外,还有其他机制可以用来管理并发访问共享资源,包括:

*无锁数据结构:无锁数据结构在不使用锁的情况下管理并发性。

*乐观并发控制(OCC):OCC依赖于乐观假设,即并发事务不会冲突。

*事务内存(TM):TM提供了一种抽象层,使程序员可以编写并发代码,而无需显式管理锁或事务。

结论

并发编程模式对于管理共享状态并防止数据竞争至关重要。互斥锁、信号量、读写锁、条件变量、屏障和原子操作是常见的并发编程模式,它们提供了灵活性和可控性,以满足各种并发编程需求。然而,锁的使用也可能带来性能开销、死锁和优先级反转等问题。因此,在选择并发编程模式时,必须权衡锁的优点和缺点,并考虑其他锁替代方案。第六部分无锁并发编程无锁并发编程

无锁并发编程是一种并发编程范例,它避免使用传统的锁机制(如互斥锁、自旋锁)来协调对共享数据的访问。相反,它依赖于无锁数据结构和算法,这些结构和算法不需要显式锁定来确保数据的一致性。

无锁数据结构

无锁数据结构是专门设计为在并发环境中使用,无需显式锁定即可提供数据一致性的数据结构。最常见的无锁数据结构包括:

*无锁栈:一种后入先出(LIFO)数据结构,允许并发地入栈和出栈元素。

*无锁队列:一种先进先出(FIFO)数据结构,允许并发地入队和出队元素。

*无锁哈希表:一种数据结构,使用键值对存储数据,允许并发插入、删除和查找操作。

*无锁跳表:一种排序的数据结构,类似于平衡树,但支持并发查找、插入和删除操作。

*无锁原子计数器:一个共享计数器,支持并发递增和递减操作。

无锁算法

无锁算法是专门设计为在并发环境中使用,无需显式锁定即可实现特定任务的算法。一些常见的无锁算法包括:

*非阻塞算法:一种算法,保证即使其他线程修改了共享数据,每个线程也能在有限的时间内完成其操作。

*等待自由算法:一种算法,当检测到共享数据正在被另一个线程修改时,线程会休眠,直到共享数据可用。

*乐观并发控制(OCC):一种算法,允许多个线程并发地修改共享数据,然后通过校验和时间戳等机制检查冲突。

无锁并发编程的优点

使用无锁并发编程具有以下优点:

*可伸缩性:无锁并发编程避免了锁争用,从而可以提高并发性并提高应用程序的可伸缩性。

*性能:无锁数据结构和算法通常比基于锁的数据结构和算法具有更高的性能,因为它们消除了锁争用开销。

*简单性:无锁并发编程模型通常比基于锁的并发编程模型更简单,因为它不需要管理显式锁。

无锁并发编程的缺点

无锁并发编程也有一些缺点:

*复杂性:无锁数据结构和算法的实现可能比基于锁的数据结构和算法更复杂。

*调试困难:无锁并发编程中的错误可能很难调试,因为没有明确的锁定机制来跟踪数据访问。

*不适合所有场景:无锁并发编程不适合所有并发场景,尤其是涉及对数据进行长时间修改的情况。

结论

无锁并发编程是一种强大的技术,它可以提高并发应用程序的性能和可伸缩性。通过使用无锁数据结构和算法,程序员可以避免锁争用并实现更有效的并发控制。然而,无锁并发编程的复杂性和调试难度也需要考虑,因此在选择使用无锁并发编程时应仔细权衡利弊。第七部分性能分析与优化关键词关键要点性能分析与优化

主题名称:性能指标测量与分析

1.确定关键性能指标(KPI)并使用适当的工具进行测量,例如吞吐量、延迟、内存使用率和CPU利用率。

2.通过基准测试建立性能基线,并定期监控性能以检测偏离基线的异常情况。

3.利用日志记录、跟踪和采样技术收集性能数据,以识别性能瓶颈和改进区域。

主题名称:并发性优化

性能分析与优化

简介

在高并发环境中,性能分析和优化对于确保应用程序的可扩展性和响应性至关重要。通过对代码进行性能分析,可以识别系统瓶颈并实施优化措施来提高应用程序的吞吐量、减少延迟并降低资源消耗。

性能分析工具

有多种工具可用于分析和优化并发应用程序的性能。这些工具可以提供有关线程创建、同步机制、资源争用和等待时间等方面的深入见解。常见的性能分析工具包括:

*JavaVisualVM:一款Java应用程序性能监视和分析工具,提供实时和历史性能数据。

*JProfiler:一种商业性能分析工具,提供高级分析功能,包括线程跟踪和内存泄漏检测。

*YourKitProfiler:另一个商业性能分析工具,以其细粒度分析和低开销而闻名。

同步机制性能分析

同步机制(如锁和锁存器)对于确保线程安全性和避免数据竞争至关重要。然而,频繁或不当的同步可能会导致性能问题。性能分析时应重点关注:

*争用:多个线程尝试同时获取相同锁时发生的争用。争用会增加等待时间并影响应用程序的吞吐量。

*死锁:当两个或多个线程相互等待对方的锁时发生的死锁。死锁会永久阻止线程执行。

*锁粒度:锁的粒度是指受锁保护的数据量。细粒度锁可以减少争用,但开销更大。粗粒度锁开销更低,但会增加争用可能性。

优化同步机制

为了优化同步机制的性能,可以采取以下措施:

*减少争用:通过使用无锁数据结构(如并发哈希表)或调整锁粒度来减少争用。

*避免死锁:通过遵循严格的锁获取顺序或使用锁分层来避免死锁。

*选择合适的锁类型:根据争用和性能要求选择合适的锁类型,例如:读写锁、重入锁或原子变量。

资源争用性能分析

除了同步争用之外,资源争用(如CPU、内存和网络带宽)也可能导致性能问题。性能分析时应重点关注:

*CPU争用:当多个线程同时需要使用CPU资源时发生的CPU争用。CPU争用会导致线程等待并降低应用程序的整体吞吐量。

*内存争用:当多个线程同时访问或修改共享内存区域时发生的内存争用。内存争用可能会导致缓存未命中和页面错误,从而增加等待时间并降低性能。

*网络争用:当应用程序涉及大量网络交互时发生的网络争用。网络争用会增加延迟并限制应用程序的可扩展性。

优化资源争用

为了优化资源争用,可以采取以下措施:

*减少CPU争用:通过负载均衡、线程池和异步编程来减少CPU争用。

*优化内存分配:通过使用内存池和谨慎使用同步来优化内存分配。

*优化网络性能:通过使用高效的网络协议、缓存和压缩来优化网络性能。

其他优化策略

除了分析和优化同步机制和资源争用之外,还可以实施以下其他策略来提高并发应用程序的性能:

*代码剖析:分析应用程序代码以识别瓶颈和性能问题。

*并行化:将任务分解为多个并发执行的子任务,以提高吞吐量。

*异步编程:使用异步I/O操作来避免阻塞线程并提高响应性。

*缓存:通过缓存常用数据和计算结果来减少等待时间并提高性能。

结论

性能分析和优化是确保高并发应用程序可扩展性和响应性的关键。通过使用性能分析工具、优化同步机制、避免资源争用并实施其他优化策略,可以显著提高应用程序的性能,满足不断增长的业务需求。第八部分分布式并发管理关键词关键要点【分布式锁】:

1.分布式锁是一种协调机制,用于在分布式系统中控制对共享资源的访问。

2.实现分布式锁的方法有多种,包括基于数据库、基于缓存、基于消息队列和基于租约。

3.分布式锁需要考虑可用性、一致性和性能等因素,因此在选择实现方法时需要仔细权衡。

【分布式事务】:

分布式并发管理

引言

分布式系统中,并发是影响系统性能和正确性的关键因素。由于分布式系统组件之间的网络延迟和通信开销,并发管理面临着独特的挑战。

CAP定理

在分布式系统中,CAP定理表明系统最多只能同时满足一致性、可用性和分区容忍性中的两个特性。一致性指的是所有节点上的数据副本都是最新的,可用性指的是系统可以处理请求并且可以获得响应,分区容忍性指的是即使系统发生分区,系统仍可以继续运行。针对不同的应用场景,分布式系统需要根据CAP定理进行权衡取舍。

锁机制

锁机制是控制并发访问共享资源的基本工具。在分布式系统中,锁机制面临着以下挑战:

*分布式锁:由于系统组件分布在不同的机器上,传统的集中式锁机制无法使用,需要采用分布式锁机制。

*锁粒度:锁的粒度决定了并发访问的范围,过细的锁粒度会降低并发性,过粗的锁粒度又会引入不必要的等待。

*死锁:在分布式系统中,由于网络延迟和通信故障,死锁的可能性更高。因此,需要采取措施来避免和处理死锁。

分布式锁机制

分布式锁机制主要包括以下几种类型:

*中央锁服务器:一个中央服务器管理所有锁,客户端需要向服务器申请锁。

*分布式锁服务:一个分布式服务提供锁服务,客户端可以与服务交互以获取锁。

*基于Paxos的锁:Paxos是一种分布式共识算法,可以用于实现分布式锁。

*基于ZooKeeper的锁:ZooKeeper是一个分布式协调服务,可以用于实现分布式锁。

锁粒度

锁粒度的选择取决于应用程序的特性。一般来说,可以根据以下原则选择锁粒度:

*互斥锁:当需要保证对共享资源的独占访问时,使用互斥锁。

*读写锁:当需要允许多个线程同时读取共享资源时,使用读写锁。

*乐观锁:当并发访问共享资源的概率较低时,使用乐观锁。

死锁处理

死锁的处理方法主要包括以下几种:

*死锁检测:定期检查系统是否存在死锁。

*死锁预防:采用适当的锁机制和调度算法来防止死锁发生。

*死锁恢复:当发生死锁时,通过回滚事务或abort线程来恢复系统。

其他并发管理技术

除了锁机制之外,分布式系统中还有其他并发管理技术,例如:

*无锁数据结构:无锁数据结构使用原子操作来消除锁的开销。

*事务:事务提供一种机制来确保多个操作要么全部成功,要么全部失败。

*版本管理:版本管理允许并发访问共享资源,并跟踪资源的更改历史。

最佳实践

在分布式系统中管理并发时,需要注意以下最佳实践:

*最小化锁的使用:只在绝对必要时才使用锁。

*选择合适的锁粒度:根据应用程序的特性选择合适的锁粒度。

*避免死锁:采用适当的锁机制和调度算法来避免死锁发生。

*使用并发管理技术:根据需要使用无锁数据结构、事务、版本管理等并发管理技术。

*监控和性能调优:定期监控系统的并发性能,并根据需要进行性能调优。

结论

并发管理是分布式系统设计和实

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论