`

并行编程——并发级别

阅读更多

在看多核编程相关论文时,往往一个并发算法会说自己是wait-free的或者lock-free的,或者是 non-blocking 的,这些专有词汇其实表示的是并发的程度,或者说并发的级别。并发级别的理解是阅读各种并发算法设计论文以及并发数据结构实现的必备基础。

1.1  Wait-freedom 无等待并发

Wait-freedom 指的是每一个线程都一直运行下去而无须等待外部条件,整个流程中任何操作都能在一个有限的步骤内完成,这是最高的并发级别,没有任何阻塞。

 结合之前原子操作部分的知识,可以简单认为能够直接调用一个原子操作实现的算法或程序就属于Wait-free,比如下面的 increment_reference_counter 函数就是wait-free的,它封装了atomic_increment这个原子自增原语,多个线程可以同时调用这个函数对同一个内存变量进行自增,而无须任何阻塞(其实也是有阻塞的,是总线锁级别)

 与此做对比,CAS类的调用就不是wait-free的,注意wait-free的原语都不能包含内部循环,CAS原语使用时通常包含在“循环直到成功”的循环内部。

 void increment_reference_counter(rc_base* obj)

{

    atomic_increment(obj->rc);

}

1.2  Lock-freedom 无锁并发

Lock-freedom 指的是整个系统作为一个整体一直运行下去,系统内部单个线程某段时间内可能会饥饿,这是比wait-freedom弱的并发级别,但系统整体上看依然是没有阻塞的。所有wait-free的算法显然都满足lock-free的要求。

 Lock-free算法通常可以通过同步原语 CAS实现。

 void stack_push(stack* s, node* n)

{

    node* head;

    do

    {

        head = s->head;

        n->next = head;

    }

    while ( ! atomic_compare_exchange(s->head, head, n));

}

多个线程同时调用上述函数,理论上某个线程可以一直困在循环内部,但一旦有一个线程原子操作失败而返回循环,意味着有其他线程成功执行了原子操作而退出循环,从而保证系统整体是没有阻塞的。

 其实前面的原子自增函数也可以用下面的原语实现,在这种实现里,不再是所有线程都无阻塞了,某些线程可能会因为CAS失败而回绕若干次循环。

void increment_reference_counter(rc_base* obj)

{

       Int rc;

       Do {

       rc = obj->rc;

} while(!atomic_compare_exchange(obj->rc,rc,rc+1));

}

1.3  Obstruction-freedom 无阻塞并发

Obstruction-free 是指在任何时间点,一个孤立运行线程的每一个操作可以在有限步之内结束。只要没有竞争,线程就可以持续运行,一旦共享数据被修改,Obstruction-free 要求中止已经完成的部分操作,并进行回滚,obstruction-free 是并发级别更低的非阻塞并发,该算法在不出现冲突性操作的情况下提供单线程式的执行进度保证,所有 Lock-Free 的算法都是 Obstruction-free 的。

1.4  Blocking algoithms 阻塞并发

阻塞类的算法是并发级别最低的同步算法,它一般需要产生阻塞。可以简单认为基于锁的实现是blocking的算法。详细参考第五章

上述几种并发级别可以使用下图描述:

蓝色是阻塞的算法,绿色是非阻塞算法,金字塔越上方,并发级别越高,性能越好,右边的金字塔是实现工具(原子操作、锁、互斥体等)

分享到:
评论

相关推荐

    高性能计算之并行编程技术—— MPI并行程序设计.zip

    本资料“高性能计算之并行编程技术—— MPI并行程序设计”深入探讨了如何利用MPI进行高效的并行程序设计。 MPI(Message Passing Interface)是一种编程模型,允许程序员在不同进程间传递消息,从而实现并行计算。...

    并行计算——结构·算法·编程习题答案

    并行编程涉及到多种编程模型和工具,如OpenMP用于共享内存环境,MPI(Message Passing Interface)适用于分布式内存系统,CUDA和OpenCL则用于GPU编程。编程时,需要掌握并行编程的原语,如线程、进程、锁、信号量、...

    [并行计算——结构·算法·编程]

    - 并行编程模型:如OpenMP、MPI(Message Passing Interface)、CUDA(用于GPU计算)等。 - 并行编程语言:如C++、Java、Python的并行库,以及专门的并行语言如Charm++、HPF等。 - 错误处理与调试:在并行环境中...

    并行计算——结构·算法·编程 习题答案

    1. **并行编程语言和库**:如OpenMP、CUDA、OpenCL等,它们的语法、并行区域的定义以及并行循环的处理。 2. **错误处理和调试**:在并行环境中,数据竞争、死锁和竞态条件等问题的识别和解决方法。 3. **性能优化...

    并行计算——结构·算法·编程 复习资料

    编程是实现并行计算的关键步骤,通常涉及到特定的并行编程模型和语言: - **OpenMP**:一种用于共享内存系统的库,通过添加简单的注解(pragma)来指示并行化。支持C、C++和Fortran等语言。 - **MPI(Message ...

    多核并行实验——Ubuntu

    2. **OpenMP**:OpenMP(Open Multi-Processing)是一种广泛使用的并行编程模型,它为C、C++和Fortran提供了库支持,允许程序员通过添加特定的编译器指令来实现并行化。 3. **MPI(Message Passing Interface)**:...

    并行开发——Parallel[收集].pdf

    在.NET Framework中,System.Threading.Tasks命名空间提供了对并行编程的支持。 平行开发的一个关键工具是System.Threading.Tasks.Parallel类。该类提供了几种方法来简化并行任务的创建,包括Parallel.Invoke、...

    多核并行计算——学习总结

    该资源整理方式很独特,是利用结构图的形式进行...该资源是对多核并行计算的总结,里面包含并行和并发,各种锁机制,同步机制,互斥机制,并发数据结构等内容的总结。有了该图,学习多处理器编程,会有很大的指导效果

    C++并发编程实践 C++ Concurrency in Action

    ### C++并发编程实践 #### 一、简介与并发编程基础 《C++并发编程实践》这本书由Anthony Williams编写,是一本深入讲解C++多线程编程技术的专业书籍。本书旨在帮助读者掌握C++中的并发编程技巧,并通过大量的示例...

    游戏架构设计——高性能并行编程.doc

    在游戏架构设计中,高性能并行编程是提升游戏性能的关键技术。CPU-bound 和 memory-bound 是两种不同的性能瓶颈类型,理解它们的区别有助于优化程序。CPU-bound 指的是计算密集型任务,即程序主要受限于处理器的计算...

    Java并发编程之——Amino框架

    6. **性能优化**:Amino框架可能针对Java的JVM进行了优化,如减少锁竞争、利用并发API来提高并行度,从而提升整体程序性能。 7. **代码可读性和可维护性**:通过提供高级并发工具和抽象,Amino可能帮助开发者编写出...

    多线程与多核编程——一本书的一部分。

    多线程能够提高程序的执行效率和响应速度,而多核处理器则让并行计算变得更加普及。本文档摘自一本关于多线程与多核编程的专业书籍,主要介绍了进程与线程的概念及其在多任务系统中的作用,同时也探讨了在多核环境下...

    分布式并行编程.docx

    《分布式并行编程:Hadoop引领的变革》 在当前的互联网时代,数据量呈爆炸性增长,传统的单机处理方式已无法满足大规模数据的处理需求。Hadoop,这个由IBM中国开发中心的曹羽中等软件工程师介绍的开源框架,为...

    多线程编程——MFC中的多线程开发

    在Windows编程环境中,Microsoft Foundation Classes (MFC) 提供了对多线程的支持,使得开发者能够在同一应用程序中处理多个并发任务。多线程编程能够提高应用程序的效率和响应性,尤其是在进行耗时操作如网络通信、...

    并行计算导论(陈国良电子版)

    “编程”部分则会讲解并行编程模型和语言,如OpenMP、MPI、CUDA等。OpenMP是一种用于共享内存系统的编程模型,通过简单的指令可以实现多线程并行;MPI则适用于分布式内存环境,提供了丰富的通信原语进行进程间通信;...

    java虚拟机并发编程

    为了更好地理解Java并发编程的实际应用,我们可以考虑一个简单的例子——使用`Future`和`Callable`来实现异步任务的执行。假设有一个复杂的计算任务需要长时间执行,但主程序不能等待这个任务完成。此时,可以将计算...

    深入编程内幕——Visual C++

    另外,Visual C++也支持多线程编程,利用Windows API或C++11标准库中的thread,开发者可以编写并发和并行程序,充分利用多核处理器的优势。 最后,Visual C++还包含对C++11、C++14和C++17新特性的支持,如lambda...

    python-sockertserver并发编程思想(csdn)————程序.pdf

    在这个例子中,我们将深入探讨如何使用`socketserver`进行并发编程,特别是通过`ThreadingTCPServer`来处理多个客户端的并发连接。 首先,`socketserver`模块主要包含两类类:Server类和Request类。Server类主要...

    免费午餐已经结束——软件历史性地向并发靠拢

    ### 免费午餐已经结束——软件历史性地向并发靠拢 #### 核心知识点解析 随着信息技术的迅猛发展,计算领域面临着前所未来的变革。本文深入探讨了“免费午餐已经结束”这一现象背后的深层原因,即处理器性能提升的...

Global site tag (gtag.js) - Google Analytics