C++并发编程概述——关于并行编程分布式编程

对于并发编程的诸多方法本人一直感觉到混乱,刚好最近看了一些资料,觉得是时候系统的梳理一下了。以下资料大部分来自《C++并行与分布式编程》,英文版叫《Parallel and Distributed Programming Using C++》。有兴趣的同学可以找来看一下。


1、什么是并发?

如果两个事件是在同一时间间隔内发生的,就说这两个事件是并发的,两个或多个任务在同一时间间隔内执行叫做并发执行。对于大部分同学来说,最大的混淆在于并发和并行的区别。并行是指多个任务在每时每刻都同时进行,就像电路里面的并联一样。并行要比并发更难得,显然对于单CPU来说,除了指令级别的并行,我们并不能实行精确的并行,除非拥有多个CPU或者多个核。我们的多进程和多线程只能称为是并发。

2、为什么要并发?

既然并发并不能实现严格的并行——实际上并发只是看起来是在同一时间间隔内同时执行,但在微观意义可能却还是串行,就像电路里面的串联,那么我们为什么还要并发编程呢?自己骗自己么?哈哈,当然不是,并发编程有很多实际意义的。

  1. 有时并发确实能在同一时间间隔内完成更多的任务,也就是有利于增加任务的吞吐量。因为在单CPU的情况下,并不是所有的任务在进行的每时每刻都使用CPU,也许还要使用IO等设备。而在多CPU或者多台计算机组成的集群的情况下,就更不用说了。
  2. 并发有利于简化程序解决方案。有时把问题的解决方案看作一组并发执行的任务更合理。这是模拟现实场景的自然方式。
  3. 有时对于效能而言速度处于次要地位,采用并发性是为了使软件在相同的时间间隔内做更多的工作。比如一个网站支持多少个用户同时访问。
  4. 最后,采用并发性可以简化软件,通常一系列较短的并发执行操作比一个较长的复杂的顺序操作更容易实现。并发使软件运行速度更快,处理更多的负载或简化程序的设计方案,其主要目标是软件优化,即采用并发性使软件性能更佳。

3、怎么实现并发?

并行和分布式编程是达到软件并发的两种基本途径。它们是两种不同的、有时又相互交叉的编程范例。并行编程技术将程序必须处理的作业分配给一个物理或虚拟计算机内的两个或者多个处理器;而分布式编程技术则一般是将作业分配给集群内的不同计算机的一个或者多个处理器。从这个角度讲,分布式编程的范围要比并行编程范围更大。
并行程序可以分成进程或者线程实现。
分布式程序仅能分成进程实现。
在技术上,并行程序有时候是分布式的,例如PVM编程。
在技术上,分布式编程有时用于实现并行性,例如MPI编程。
但并非所有的分布式程序都包括并行性,分布式程序的各部分可以在不同时间间隔内的不同时刻执行。
在纯粹的并行程序中,并发执行部分都是同一个程序中的部分;
在分布式程序中,并发执行的部分通常实现成分离的程序。

4、并行编程

由于并行编程一般是在同一台机器上,通常实现并行编程需要借助专门的硬件。如果是只需要CPU运算的,那么硬件上至少是多个CPU才能实现严格意义的并行。另外,也可以是CPU,显卡,声卡的并行运算。最简单的并行模型是在同一台机器中有多个CPU共享同一个存储器,这个模型拥有互斥读互斥写、互斥读并发写、并发读互斥写、并发读并发写四种基本读写算法,这样才能保证并行执行任务而不会出错。

5、分布式编程

分布式编程技术允许软件利用因特网、团体或企业内部网络及广播网上的资源。所有关于一个程序通过某种网络连接与另一个程序的通话都是分布式编程,从这个意义上来讲,我们通常编写B/S架构或者C/S架构的程序都是分布式编程。分布式编程有以下好处:

  1. 分布式编程技术提供对地理上可能相隔很远的资源的访问。比如Web服务;
  2. 分布式编程技术提供对昂贵的硬件和软件资源的共享访问,比如高端全息照相打印机;
  3. 分布式计算可用于冗余和实效的处理,比如服务器的热备份功能通过配置集群来实现;
  4. 分布式编程技术允许用户共享庞大的数据库,比如分布式存储。

6、并发编程设计过程

  1. 分解。分解是将问题和解决方案划分成多个部分的过程。
  2. 通信。一旦软件解决方案将软件分解成大量的并发执行部分,这些部分通常需要进行一定量的通信。如果各部分之间不进行通信,那么这些部分就不能真正组成一个单独的应用程序。
  3. 同步。当软件的多个构建处理同一个问题时,他们必须进行协调,比如执行顺序的协调,访问资源的协调等等。

7、C++开发如何实现软件并发

在应用程序开发中有几种层次的并发,但是我们C++程序编程所涉及到的并发性和操作系统或者硬件的并发性是不同的,尽管硬件的并发和操作系统级的并发支持应用程序的并发,但是我们关注的是应用程序。
在C++编程实现并行性使用库。系统库和用户库都能用于支持C++中的并行性。

系统库

系统库是由操作系统环境提供的库,新的单一UNIX规范中的一部分POSIX线程是对C++并发实现的支持。除指令集并行外,将程序分成线程或进程是获得C++并行性的唯一方法,新规范提供了做这项工作的工具,开发者可以使用:

  • POSIX线程(也称Pthread)
  • POSIX产生函数
  • exec()函数族

在C++中可以用POSIX线程库进行多线程编程,如果程序在有多个处理器的计算机中运行,那么每个线程可能分别在一个处理器上运行,因此可以并发执行。如果仅有一个处理器可用,那么可以通过进程的上下文切换达到并发并给人一种并行的感觉。POSIX线程可能是在C++程序中引入并行性最简单的方法。

用户级库

这些用户级库是实现了另一种国际标准的用户级库,也可以用于支持C++的并行性,主要有:

  • MPI(Message Passing Interface,消息传递接口):是消息传递的标准规范。MPI是为超大规模并行计算机和工作站集群的高性能而设计的。MPICH是MPI标准的一种实现。MPICH给C++编程者提供了一组API和库,这些API和库支持并行编程。尽管C++没有固定的并行性原语,但是它能够利用支持并行性的功能库如MPICH,这就是C++的优点,它是为灵活性而设计的。
  • PVM(Parallel Virtual Machine,虚拟并行计算机):集群编程的一种标准,是一个软件包,它允许一个异构计算机集通过网络连接在一起,使用起来如同一个单独的大规模并行计算机。PVM系统的全部目标是使一个计算机集可以协调工作用于并发或并行计算。PVM是最易于使用、最灵活的可用于基本并行编程任务的平台,这些并行编程任务需要涉及到运行不同操作系统的不同类型的计算机。
  • CORBA(Common Object Request Broker Architecture,公共对象请求代理体系结构):是分布式跨平台面向对象编程的标准。MICO是其一个可免费利用、完全自适应的实现,MICO支持C++。

使用以上的用户级库需要预先下载获取,他们很容易得到。

8、并行和分布式编程的编程环境

最后我们需要关注一下最普遍的并行和分布式编程环境是:

  • 集群:用网络连接到一起,以提供单一逻辑系统的计算机集合。
  • MPP:大规模并行处理器,是具有数百个处理器的一个单独计算机。
  • SMP:对称多处理系统,拥有多个处理器的一个单独系统。

可见,平时单机单CPU单核的情况下我们编写的并发程序不一定能够真正的并行,并发编程主要还是应用在一定硬件资源编程环境基础上。

你可能感兴趣的:(C++,云计算,并发,并行,c++,编程)