多核环境下互斥锁优化算法_第1页
多核环境下互斥锁优化算法_第2页
多核环境下互斥锁优化算法_第3页
多核环境下互斥锁优化算法_第4页
多核环境下互斥锁优化算法_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

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

文档简介

17/23多核环境下互斥锁优化算法第一部分多核环境互斥锁争用问题 2第二部分互斥锁优化的必要性 3第三部分自旋锁的原理及实现 6第四部分适应性自旋锁的改进 8第五部分无锁数据结构的应用 10第六部分基于哈希表的互斥锁算法 13第七部分基于无锁队列的互斥锁算法 15第八部分互斥锁优化策略的性能评估 17

第一部分多核环境互斥锁争用问题关键词关键要点【多核环境互斥锁争用问题】

1.争用的本质:多核环境中,多个线程同时竞争访问共享资源,由于互斥锁机制只能允许一个线程独占访问,因此会导致线程等待和争用。

2.争用的后果:严重的争用会导致性能下降、死锁和数据损坏,从而影响应用程序的稳定性和可靠性。

3.争用的缓解策略:为了减轻争用问题,可以通过优化互斥锁算法、减少共享资源访问频率、使用无锁机制等手段。

【细粒度锁】

多核环境互斥锁争用问题

多核处理器系统中存在互斥锁争用问题,这会影响系统的性能和效率。互斥锁争用发生在多核CPU的多个线程同时尝试访问临界区(受互斥锁保护的共享数据或资源)时。

争用争用源

*共享内存访问:多核系统中的处理器共享内存,当多个线程同时尝试访问临界区中的共享数据时,就会发生争用。

*局部性不足:数据可能不在处理器缓存中,导致处理器需要从主内存中获取数据,这会增加延迟和争用。

*超线程:超线程技术允许在一个物理处理器核心中运行多个线程,这可能会加剧争用,因为线程共享缓存和资源。

争用后果

*延迟:争用导致线程等待访问临界区,从而增加延迟。

*性能下降:争用会显著降低系统的整体性能。

*死锁:如果线程不正确地使用互斥锁,可能会导致死锁,其中多个线程无限期地等待彼此释放锁。

*功耗增加:争用会增加处理器的功耗,因为线程不断地尝试获取锁。

争用缓解策略

为了缓解多核环境中的互斥锁争用问题,可以采用以下策略:

*细粒度锁:使用更细粒度的锁,锁定的共享数据更少,从而减少争用。

*自旋锁:使用自旋锁,当锁被占用时,线程会忙等而不是阻塞,从而减少延迟。

*互斥锁池:使用互斥锁池,为不同的临界区分配不同的互斥锁,从而将争用分布到多个处理器上。

*无锁数据结构:使用无锁数据结构,例如无锁队列和无锁哈希表,以消除互斥锁争用。

*线程局部存储(TLS):使用TLS将线程私有数据存储在每个线程的本地内存中,从而减少对共享内存的争用。

通过采用这些策略,可以在多核环境中优化互斥锁的性能并缓解争用问题,从而提高系统的整体效率。第二部分互斥锁优化的必要性关键词关键要点互斥锁优化的必要性

主题名称:多核环境中的竞争开销

1.多核环境中并发线程数量激增,导致互斥锁竞争更加激烈。

2.互斥锁竞争会导致CPU时间消耗在频繁的锁获取和释放操作上,从而降低系统效率。

3.过度的锁竞争可能导致死锁,进一步恶化系统性能。

主题名称:锁的不公平性

互斥锁优化的必要性

在多核环境中,互斥锁是同步共享资源的关键机制,用于防止多个线程同时访问临界区,从而保证数据的完整性和一致性。然而,互斥锁的引入也会带来性能开销,尤其是当竞争激烈时,可能会导致线程阻塞和排队延迟,进而影响应用程序的整体性能。

线程竞争引起的性能开销

当多个线程同时尝试获取同一互斥锁时,将发生线程竞争。此时,只有一个线程可以成功获取锁,而其他线程会被阻塞。阻塞的线程将被挂起,无法执行任何任务,直到互斥锁被释放。

线程竞争会带来以下性能开销:

*上下文切换:当一个线程被阻塞时,系统需要执行上下文切换,将该线程从运行状态切换到等待状态,并将另一个线程切换到运行状态。上下文切换的开销很大,尤其是当竞争激烈时。

*缓存失效:当一个线程阻塞时,其缓存中存储的数据可能失效,因为其他线程可能会修改共享资源。当线程被唤醒后,它需要重新获取缓存数据,这会进一步降低性能。

*资源消耗:被阻塞的线程仍然占用系统资源,如栈空间和CPU时间。在竞争激烈的情况下,大量的阻塞线程会消耗大量资源,从而降低系统的整体效率。

不同互斥锁类型的性能影响

不同的互斥锁类型具有不同的开销特征:

*自旋锁:自旋锁是一种轻量级的互斥锁,当锁被占用时,线程不会被阻塞,而是会不断循环(自旋)检查锁的状态。自旋锁的优点是上下文切换开销低,但缺点是会消耗CPU资源,尤其是当竞争激烈时。

*睡眠锁:睡眠锁是一种重量级的互斥锁,当锁被占用时,线程将被阻塞,并被置于等待队列中。睡眠锁的优点是CPU开销低,但缺点是上下文切换开销较高。

*混合锁:混合锁是一种介于自旋锁和睡眠锁之间的互斥锁,它在初始阶段使用自旋,当自旋一段时间后,锁仍然被占用,则切换到睡眠模式。混合锁可以兼顾自旋锁和睡眠锁的优点,但在竞争激烈的情况下,其性能可能会低于自旋锁。

优化互斥锁的必要性

为了最大限度地减少互斥锁带来的性能开销,需要对互斥锁进行优化。互斥锁优化可以从以下几个方面入手:

*减少竞争:通过适当的锁粒度分配和并发控制,可以减少线程对同一互斥锁的竞争。

*选择合适的锁类型:根据竞争程度和性能要求,选择合适的互斥锁类型,例如,在竞争激烈的场景下,使用自旋锁;在竞争不激烈的场景下,使用睡眠锁。

*优化锁实现:通过使用无争抢算法、高效的数据结构和硬件支持,可以优化互斥锁的实现,提高其性能。

*避免不必要的锁:在某些情况下,可以通过使用无锁数据结构或非阻塞算法来避免使用互斥锁,从而消除锁带来的性能开销。

通过对互斥锁进行优化,可以有效减少线程竞争、降低上下文切换开销和资源消耗,从而提高多核环境下应用程序的整体性能。第三部分自旋锁的原理及实现自旋锁的原理

自旋锁是一种轻量级同步原语,用于在多线程环境中保护共享资源。它的工作原理建立在不断轮询锁变量的状态之上,直至该变量指示锁已被释放。

与互斥锁不同,自旋锁不涉及内核调用,而是依靠CPU直接访问内存。当一个线程希望获取锁时,它会不断检查锁变量的值,如果锁已被占用,它将持续循环(“自旋”)直到锁可用。

自旋锁的实现

实现自旋锁需要使用原子操作,以确保锁变量的访问和修改是原子的。具体实现步骤如下:

1.定义锁变量:通常使用无符号整型变量表示锁状态,其中0表示锁已释放,非0值表示锁已被某个线程占用。

2.获取锁:线程不断循环检查锁变量的值。如果锁是释放的(值为0),它将尝试使用原子交换操作将锁变量设置为非0值。如果交换成功,则该线程获得了锁。否则,它将继续自旋。

3.释放锁:释放锁时,线程使用原子交换操作将锁变量设置为0,表示锁已释放。

自旋锁的类型

自旋锁有多种不同的类型,包括:

*Test-and-Test-and-Set(TTAS):最简单的自旋锁类型,仅使用一个原子操作(测试并设置)。

*TicketLock:通过分配唯一票证来管理线程顺序的公平自旋锁。

*CLHLock:一种无饥饿的自旋锁,使用队列结构来组织等待线程。

*MCSLock:一种无饥饿的自旋锁,使用单链表来组织等待线程。

自旋锁的优缺点

优点:

*轻量级:不涉及内核调用,开销较低。

*快速:对于短暂的锁持有时间,自旋锁比传统互斥锁更快。

*公平:某些自旋锁(如TicketLock和MCSLock)提供了线程公平性,确保所有线程都有机会获取锁。

缺点:

*处理器消耗:自旋锁不断轮询锁变量,可能会导致过度的CPU消耗。

*不适用于长时间锁持有:如果锁持有时间较长,自旋锁会浪费大量CPU周期。

*可能导致优先级反转:高优先级线程可能会被低优先级线程阻止,因为低优先级线程不断自旋并消耗CPU时间。

最佳实践

使用自旋锁时应考虑以下最佳实践:

*将自旋锁用于锁持有时间较短的情况。

*避免嵌套自旋锁,因为这可能导致死锁。

*使用公平的自旋锁以防止优先级反转。

*适当调整自旋次数,以平衡CPU消耗和延迟。

总之,自旋锁是一种轻量级同步原语,适合用于保护短暂的共享资源。然而,需要仔细考虑其优点和缺点,并根据具体应用程序选择合适的实现。第四部分适应性自旋锁的改进关键词关键要点【自旋锁的自适应等待队列】

1.通过将自旋队列细分为不同优先级的部分,从而减少自旋的时间,提高算法的效率。

2.使用链表或者哈希表等数据结构,将线程组织到相应的等待队列中,以缩短等待时间和优化性能。

3.该方法可以实现自适应调整,根据系统负载动态调整等待队列的长度和优先级,从而提升算法的适应性。

【可分配的自旋锁】

适应性自旋锁的改进

适应性自旋锁(TAS)是一种自旋锁,其自旋等待时间可以根据锁的争用情况动态调整。它可以显著提高多核系统中的效率,因为当锁不争用时,线程可以避免不必要的内核过渡。

TAS的基本思想是跟踪锁的争用历史,并根据历史数据调整自旋等待时间。当锁没有争用时,自旋等待时间较短,线程可以快速获取锁。当锁被频繁争用时,自旋等待时间会增加,线程会更频繁地进入内核,以避免长时间的自旋消耗CPU资源。

TAS的一个主要优点是其自适应特性。它无需预先了解锁的争用情况,而是可以动态调整其行为以适应实际情况。这使得TAS适用于各种不同的锁争用模式。

然而,传统的TAS也存在一些局限性。首先,当锁争用激烈时,TAS可能会导致线程长时间自旋,从而浪费大量的CPU资源。其次,TAS依赖于原子操作,这在某些硬件平台上可能开销较大。

为了解决这些局限性,提出了多种改进的TAS算法。

指数退避自旋锁(EBS)

EBS是一种改进的TAS算法,它采用指数退避策略调整自旋等待时间。当锁不争用时,EBS使用较短的自旋等待时间。当锁被争用时,EBS会将自旋等待时间指数级增加。这可以避免长时间的自旋,同时仍然可以快速获取锁。

自适应自旋锁(ALS)

ALS是一种进一步改进的TAS算法,它结合了自适应性和指数退避策略。ALS跟踪锁的争用历史,并根据历史数据调整自旋等待时间。当锁不争用时,ALS使用较短的自旋等待时间。当锁被频繁争用时,ALS会将自旋等待时间指数级增加。

与传统的TAS相比,ALS具有以下优点:

*降低CPU消耗:指数退避策略可以避免长时间的自旋,从而节省CPU资源。

*提高性能:自适应策略可以快速获取锁,即使在锁争用激烈的情况下也是如此。

*可移植性:ALS可以轻松移植到不同的硬件平台,因为它不依赖于特定的原子操作。

其他改进

除了上述改进之外,还提出了其他几种改进TAS的算法,它们针对特定的平台或场景进行了优化。例如:

*无锁自旋锁(LSL):LSL是一种自旋锁,它使用无锁技术避免原子操作的开销。

*硬件自旋锁(HSL):HSL是一种自旋锁,它利用硬件提供的特定指令来实现自旋。

*自旋和内核混合锁(SHL):SHL是一种混合自旋锁,它结合了自旋和内核过渡的优点。

结论

适应性自旋锁是多核系统中提高锁性能的重要工具。EBS和ALS等改进算法可以解决传统TAS的局限性,提供更高的性能和更低的CPU消耗。这些算法广泛应用于各种并发系统中,以提高可扩展性和效率。第五部分无锁数据结构的应用关键词关键要点【无锁队列】

1.无需互斥锁,通过内存屏障(MemoryBarrier)操作保证数据一致性。

2.使用环形缓冲区实现,避免了链表操作中的锁竞争。

3.适用于高并发环境下的队列操作,可极大地提升吞吐量。

【无锁栈】

无锁数据结构的应用

在多核环境中,无锁数据结构在以下应用场景中具有显著优势:

1.并发队列和栈

无锁队列和栈用于在并发环境中高效管理数据项的插入和删除操作。与使用锁的数据结构不同,无锁队列和栈采用原子操作来更新数据,从而避免了锁竞争和上下文切换的开销。

2.共享内存对象

无锁共享内存对象允许多个线程并发访问共享内存中的数据。通过使用原子操作和内存屏障,无锁共享内存对象确保数据的一致性和正确性,同时避免了锁开销。

3.哈希表

无锁哈希表在并发环境中提供高效的数据查找和插入操作。通过使用原子操作和并发哈希映射技术,无锁哈希表可以处理高并发访问而无需锁争用。

4.并发计数器

无锁并发计数器用于在多线程环境中安全地更新和查询共享计数器。通过使用原子操作,无锁并发计数器确保计数器的值在所有线程中都是一致的,同时避免了锁开销。

5.并发链表

无锁并发链表用于在并发环境中管理链表数据结构。通过使用原子指针更新和并发链表遍历技术,无锁并发链表可以处理高并发链表操作而无需锁争用。

6.数据结构中的原子操作

无锁数据结构广泛使用原子操作来保证数据的一致性。原子操作确保在执行操作期间,数据处于一个不可分割的状态,从而防止数据损坏。

7.并发容器

无锁并发容器是提供线程安全访问共享数据结构的集合。通过使用无锁数据结构作为基础,并发容器可以处理高并发访问而无需锁争用。

8.高性能计算

无锁数据结构在高性能计算中至关重要,因为它们可以消除锁争用和上下文切换的开销,从而提高并行应用程序的性能。

无锁数据结构的优点

*避免锁争用和上下文切换开销

*提高并行应用程序的吞吐量和响应时间

*适用于高并发环境

*确保数据的完整性和一致性

无锁数据结构的挑战

*设计和实现复杂

*可能会增加代码复杂性和调试难度

*必须仔细考虑内存一致性模型

结论

无锁数据结构在多核环境中具有广泛的应用,它们提供了高性能、低开销和线程安全的解决方案。虽然无锁数据结构的实现具有挑战性,但它们对于提高并行应用程序的性能至关重要。第六部分基于哈希表的互斥锁算法基于哈希表的互斥锁算法

在多处理器系统中,同步代码段访问共享资源时需要互斥,以保证数据的一致性。基于哈希表的互斥锁算法是一种有效的互斥锁实现方法,它利用哈希表来存储锁的状态,可以有效地减少锁冲突和提高系统性能。

算法设计

该算法使用一个哈希表来管理锁,哈希表中的每个条目对应一个锁,包含锁的状态(已加锁或未加锁)和其他相关信息。当线程需要获取某个锁时,它首先根据锁的键值计算哈希值,然后在哈希表中查找对应的条目。

如果条目存在且锁处于未加锁状态,则线程成功获取锁,并将锁的状态标记为已加锁。如果条目存在但锁处于已加锁状态,则线程需要等待,直到锁被释放。如果条目不存在,则该线程创建一个新的条目并获取锁。

锁获取流程

1.根据锁的键值计算哈希值。

2.在哈希表中查找对应的条目。

3.如果条目存在:

-若锁处于未加锁状态,则获取锁并返回。

-若锁处于已加锁状态,则等待锁被释放。

4.若条目不存在,则创建一个新条目并获取锁。

锁释放流程

1.根据锁的键值计算哈希值。

2.在哈希表中查找对应的条目。

3.如果条目存在且锁处于已加锁状态,则将锁的状态标记为未加锁。

4.如果条目不存在或锁处于未加锁状态,则抛出异常。

性能优化

为了提高算法的性能,可以采用以下优化措施:

*细粒度锁:使用多个较细粒度的锁,而不是一个全局锁,可以减少锁冲突和提高并发性。

*读写锁:区分读操作和写操作,允许并发读操作,以进一步提高并发性。

*自旋锁:对于短暂的锁操作,可以使用自旋锁,避免系统调用开销。

*自适应自旋时间:根据锁冲突的频率动态调整自旋时间,以优化性能。

*公平锁:保证线程以先到先得的顺序获取锁,防止饥饿现象。

应用场景

基于哈希表的互斥锁算法适用于以下场景:

*多线程应用程序中共享资源的同步

*并发数据结构(如哈希表和队列)的保护

*操作系统中的内核锁

优缺点

优点:

*减少锁冲突,提高并发性

*适用范围广泛,可以用于各种多线程应用程序

*可扩展性好,可以通过调整哈希表的大小和锁粒度来优化性能

缺点:

*哈希表的大小和结构可能会影响性能

*对于高并发场景,可能存在哈希冲突和锁争用

*实现和维护的复杂度比基本互斥锁算法更高第七部分基于无锁队列的互斥锁算法基于无锁队列的互斥锁算法

基于无锁队列的互斥锁算法是一种轻量级、无饥饿的算法,通过使用无锁队列来实现互斥锁的功能。算法的核心思想是将获取锁的操作转换为将当前线程插入无锁队列的尾部,释放锁的操作则将当前线程从队列中移除。

该算法的实现包含以下步骤:

加锁:

1.分配一个新的无锁队列节点QN,并将其标记为“未锁”。

2.将QN插入无锁队列的尾部。

3.循环等待,直到QN被标记为“已锁”。

4.将QN标记为“已锁”,表示当前线程已获取锁。

解锁:

1.将QN标记为“未锁”。

2.将QN从无锁队列中移除。

无锁队列的实现:

无锁队列通常使用以下一种或多种技术实现:

*CAS(比较并交换):一种原子操作,用于在队列头或尾插入或删除节点。

*MCS锁:一种基于ticket的无锁队列,使用票据计数器来保证先进先出(FIFO)顺序。

*Ticket锁:一种基于ticket的无锁队列,使用序列号来保证FIFO顺序。

*CLH锁:一种基于链表的无锁队列,使用局部节点来减少争用。

算法的优点:

*无饥饿:即所有线程最终都将获取锁,不会出现某个线程被无限期阻塞的情况。

*轻量级:与传统互斥锁算法相比,开销较低,适合高并发场景。

*可扩展性:算法的可扩展性取决于所使用的无锁队列的实现。

算法的缺点:

*性能下降:在高竞争场景下,算法的性能可能会下降,因为线程需要在队列中等待很长时间才能获取锁。

*公平性降低:算法不保证线程按请求顺序获取锁,这可能会导致不公平的情况。

算法的应用:

基于无锁队列的互斥锁算法广泛应用于高并发编程中,如:

*操作系统中的轻量级互斥锁

*并发数据结构中的无锁实现

*并行算法中的同步第八部分互斥锁优化策略的性能评估关键词关键要点【性能评估指标】

1.吞吐量:衡量互斥锁优化策略在多核环境下每秒处理请求的数量。

2.延迟:测量从请求发起到响应完成的时间,较低的延迟表明响应更迅速。

3.内存消耗:评估互斥锁优化策略占用的内存资源,以避免内存瓶颈。

【可扩展性测试】

互斥锁优化策略的性能评估

引言

在多核环境下,互斥锁机制对于保护共享资源至关重要。然而,互斥锁也可能成为系统性能的瓶颈。因此,优化互斥锁策略以提高并行度和减少争用变得十分必要。本文将评估几种互斥锁优化策略的性能,以提供指导以选择最佳策略。

评估方法

评估策略基于以下指标:

*吞吐量:系统每秒处理的请求数

*响应时间:系统处理单个请求所需的时间

*争用率:请求尝试获取互斥锁但失败的次数与总请求次数之比

我们使用一个多核模拟器来评估优化策略。模拟器模拟一个具有多个共享资源和多个并发线程的系统。我们使用测试套件对系统施加不同级别的负载,并测量优化策略在不同负载下的性能。

优化策略

我们评估了以下互斥锁优化策略:

*自旋锁:线程在尝试获取互斥锁时自旋,直到锁可用。

*锁消除:通过在编译时确定锁定区域是否可以安全删除来消除不必要的互斥锁。

*锁粗化:将多个互斥锁组合成一个较粗的互斥锁,以减少争用。

*乐观并发:线程在获取互斥锁之前执行其操作,并在成功时验证结果。

*无锁数据结构:使用无锁数据结构(如原子变量和无锁队列)来避免互斥锁。

结果

吞吐量:

*锁粗化策略在所有负载级别下都表现出最高的吞吐量。

*无锁数据结构策略在低负载下具有竞争力,但在高负载下吞吐量下降。

响应时间:

*自旋锁策略在低负载下具有最短的响应时间。

*锁消除策略在所有负载级别下都表现出稳定的响应时间。

*无锁数据结构策略在高负载下具有最长的响应时间。

争用率:

*锁粗化策略在所有负载级别下都显著降低了争用率。

*锁消除策略完全消除了争用。

*自旋锁策略在高负载下显示出较高的争用率。

结论

吞吐量优先:

*在吞吐量优先的情况下,锁粗化策略是最佳选择。它通过减少争用提高了系统的并行度。

响应时间优先:

*在响应时间优先的情况下,自旋锁和锁消除策略是可行的选择。自旋锁在低负载下提供最快的响应时间,而锁消除策略在所有负载级别下提供稳定的响应时间。

通用性:

*无锁数据结构策略可用于避免互斥锁,但其性能可能受负载的影响。它在低负载下具有竞争力,但在高负载下吞吐量下降。

选择指南

选择最佳优化策略取决于系统的具体要求和负载特征。以下指南可以提供帮助:

*高吞吐量、低争用:使用锁粗化策略。

*快速响应时间、中等争用:使用自旋锁或锁消除策略。

*低争用、无需互斥锁:使用无锁数据结构策略。

未来工作

未来的研究方向包括:

*探索自适应优化技术,可以动态调整策略以适应负载变化。

*研究硬件支持的优化技术,例如硬件事务内存。

*评估优化策略在不同多核架构上的性能。关键词关键要点自旋锁

关键要点:

1.自旋锁是一种轻量级互斥锁,它通过让线程在临界区入口处不断循环(自旋)来实现互斥访问。

2.自旋锁避免了传统锁机制中的上下文切换开销,因此在争用较少的情况下提供了更高的性能。

3.随着争用的增加,自旋锁会消耗大量CPU时间,因为线程会不断循环等待锁释放。

自旋锁实现

关键要点:

1.自旋锁通常使用原子操作(例如CAS)来实现。CAS操作允许线程在不阻塞的情况下尝试获取锁。

2.如果线程成功获取锁,它将设置锁的标志以表示已获取。

3.如果线程无法获取锁,它将继续自旋,直到锁被释放并成功获取为止。关键词关键要点基于哈希表的互斥锁算法

关键要点:

1.利用哈希表快速查找和插入锁对象。

2.允许并发访问锁对象,减轻锁竞争。

3.采用自旋锁机制,避免系统调用开销。

相关趋势和前沿:

*无锁数据结构:探索无需互斥锁的并发数据结构,进一步提高性能。

*硬件支持的并发:利用多核处理器的硬件特性,实现更高效的并发控制。

锁争用检测和优化

关键要点:

1.监控锁争用的发生情况,识别热点区域。

2.采用适应性锁算法,根据争用情况动态调整锁策略。

3.优化数据结构和算法,减少锁竞争。

相关趋势和前沿:

*局部性感知:分析访问模式,将相关数据放置在一起,减少锁争用。

*可扩展锁:设计可随着线程数量扩展的锁机制,避免锁争用瓶颈。

自旋锁优化

关键要点:

1.优化自旋锁的等待策略,避免过度自旋和上下文切换。

2.使用无锁的技术,如原子操作,减少自旋锁开销。

3.采用公平自旋锁,保证所有线程公平获得锁。

相关趋势和前沿:

*自适应自旋锁:根据系统负载动态调整自旋时间,提高效率。

*硬件加速的自旋锁:利用处理器特性,实现更高效的自旋机制。

可扩展性优化

关键要点:

1.设计可扩展的锁算法,支持多核系统和高并发场景。

2.采用

温馨提示

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

评论

0/150

提交评论