本篇文章参考 windows核心编程 P215
下图这个简单的测试会产生1个,2个,4个线程,这些线程会使用不同的线程同步机制来重复执行相同的任务,在双核处理器上执行结果如下:
线程/微秒 volatile读取 volatile写入 interlocked递增 关键段 SRWLock共享模式 SRWLock独占模式 互斥量
1 8 8 35 66 66 67 1060
2 8 76 153 268 134 148 11082
4 9 145 361 768 244 307 23785
1. 读取一个volatile长整形值
LONG lValue = value;
volatile 读取非常快,因为它不需要进行任何同步,直接从内存中取出数据,与CPU高速缓存完全无关
2. 写入一个volatile值
单线程的时候只有8微秒,两个线程的时候,我们很显然认为执行相同的操作,时间只不过是加倍,但是实际在双处理器的机器上时间消耗的更多,为76。这是因为CPU之间必须相互通信,保证缓存的一致性,四个线程时,时间加了一倍,因为在双线程时,消耗的时间已经考虑到了cpu之间的相互通信,这里仅仅是工作量加倍。
如果cpu数量增加,消耗的时间还会增加,因为相互通信花费的时间更长。
3. 使用interlockedIncrement 来安全地递增一个volatile值
InterlockedIncrement(&value);
interlockedIncrement 要比volatile读写都要慢,因为它要保证在同一时刻cpu之间只有一个cpu能够访问并修改它。使用两个线程比使用一个线程慢的多,因为cpu之间需要通信,来保证告诉缓存的一致性。4个线程更慢,因为工作量加倍。 如果在4个cpu的机器上 性能可能更糟,因为要在4个cpu之间进行通信。
4. 使用关键段来读取volatile长整形值
关键段比较慢,因为存在进入和离开两个过程。 此外,进入和离开关键段需要修改CRITICAL_SECTION结构中的多个字段,所以当发生争夺现象的时候,关键段执行要慢得多。4个线程时,花费的时间超过了2个线程的两倍还多,因为上下文的切换增大了资源争夺的可能性。
5. SRWLock 来读取volatile长整型值
当只有一个线程的时候,SRWLock 执行读取和写入操作的时间几乎相同。
当有两个线程的时候,SRWLock 执行读操作性能要优于写操作,因为读操作可以同时读取,而写操作是互斥的。 与四个线程较为相似。
此外,由于多个线程会不断地写入锁的字段以及它保护的数据,因此各cpu必须在他们的高速缓存之间来回传输数据。
6. 使用内核对象 互斥量
性能最差,这是因为等待互斥量以及后来释放互斥量需要线程每次都在用户态和内核态之间来回进行切换,而这种切换的时间消耗是非常巨大的,在两个线程或者四个线程执行时,性能会急剧下降。
如果我们希望在应用系统中得到最佳性能,首先应该尝试不要使用共享数据,然后依次使用volatile读取,volatile写入,Interlocked API, SRWLock 以及 关键段。 如果都不能满足要求的话,在去尝试使用内核对象。
相关推荐
此外,还需要考虑到时钟同步机制对系统性能的影响,以及时钟同步机制在不同应用场景中的适用性。 分布式时钟同步机制是分布式系统中的核心技术之一,对分布式系统的正确运行和高效运作起着至关重要的作用。因此,在...
sqlserver同步机制介绍 SQL Server提供了多种同步机制,以满足不同的业务需求。以下是几种常见的SQL Server同步机制: Change Data Capture (CDC) Change Data Capture是SQL Server 2008引入的一种同步机制。它...
**同步机制在JAVA中的应用与...在实际的系统设计中,合理地使用同步机制不仅可以提高程序的并发性能,还能确保程序的正确性和可靠性。通过操作系统课程设计,学生可以深入理解并发编程的挑战以及Java提供的解决方案。
Java同步机制是多线程编程中确保数据一致性与正确性的关键。在Java中,主要有两种同步机制:内置的`synchronized`关键字以及基于`java.util.concurrent`包中的高级同步工具类。本文将深入探讨这些机制的底层实现,...
### Java同步机制浅谈 ...然而,需要注意的是,过度使用同步机制会导致性能下降,甚至可能导致死锁等问题。因此,在实际开发中,应根据具体情况选择最合适的同步策略,并尽可能减少不必要的同步控制。
【Eucalyptus信息同步机制的分析与改进】 Eucalyptus 是一个流行的开源基础设施即服务(IaaS)云计算平台,广泛应用于互联网数据中心(IDC)。它的架构包括云控制器(CLC)、存储控制器(Walrus)、集群控制器(CC)和节点...
操作系统同步研究——Linux内核同步机制 根据提供的文件信息,我们可以生成以下知识点: 1. 操作系统同步研究的重要性:操作系统同步研究是操作系统领域中的一个重要话题,它关乎系统的性能、稳定性和安全性。在 ...
### 并行与分布式仿真时间推进同步机制综述 #### 引言 并行分布仿真技术作为当前国际仿真领域的前沿发展热点之一,在诸多科学及工程领域中发挥了重要作用。该技术利用计算机并行处理能力,有效地提高了对复杂动态...
### 北京大学操作系统 进程同步机制 #### 基本概念 在现代操作系统中,进程同步机制是一项至关重要...此外,对于进程互斥的处理,多种软件解法各有优劣,选择合适的同步机制对于提高系统的稳定性和性能具有重要意义。
### 剖析MFC多线程程序的同步机制 #### 概述 在现代软件开发中,多线程编程已成为提升程序性能的关键技术之一。然而,随着线程数量的增加,线程间的同步问题变得日益突出。MFC(Microsoft Foundation Classes)...
CAN总线的设计原理,尤其是位定时和同步机制,对于保证网络通讯的准确性和实时性至关重要。本文详细探讨了CAN总线位定时和同步机制的工作原理,并提出了一种基于Quartus II 7.0环境实现的设计方法。 CAN总线的位...
2. 同步写全局负载均衡机制:此机制确保无论是在单个ZVOL(ZFS中的逻辑块设备)还是多个ZVOL存在同步写时,都能在底层存储设备之间实现负载均衡,从而进一步提高同步写的性能。 该优化方法已经在Linux环境下针对ZFS...
实验部分,论文使用了片上同构众核处理器Goddson-T的模拟器和AMD Opteron商业片上多核处理器作为平台,对比了硬件支持的同步机制与基于原语的同步机制的性能。实验结果表明,硬件支持的同步机制能够显著提升片上众核...
同时,也要注意同步机制可能带来的性能问题,并采取相应的优化措施。在Java多线程编程中,同步是一个核心概念,用于控制多个线程对共享资源的访问,以确保数据的一致性和线程安全。Java提供了两种主要的同步机制:...
多线程同步机制可以让多个线程同时执行,提高了系统的性能和效率。 二、Java多线程同步机制的类型 Java多线程同步机制有两种类型:synchronized方法和synchronized块。synchronized方法是将访问共享资源的方法标记...
"Java多线程同步机制的应用分析" Java多线程同步机制的应用分析是指在Java语言中,如何使用同步机制来保护临界区,以避免多线程之间的冲突和错误。该机制通过管程机制和同步语法来保护临界区,使得多线程可以安全...
"CAN总线位定时和同步机制的分析" BIT TIMING AND SYNCHRONIZATION MECHANISM OF CAN BUS CAN总线位定时参数可以由用户来编程设置,合理的设置位定时能够有效保证位流的同步,提高CAN总线的通讯性能。本文详细分析...
"流媒体系统同步机制和缓冲机制的研究与应用"这个主题聚焦于两个核心概念:同步和缓冲,它们是确保流媒体服务质量和用户体验的关键。 同步机制在流媒体系统中扮演着至关重要的角色。它主要解决的是在网络传输过程中...