并发编程和并行编程有什么区别?

风流意气都作罢 提交于 2020-03-08 18:16:49

并行编程和并行编程有什么区别? 我问谷歌,但没有找到任何可以帮助我理解这种差异的东西。 你能给我两个例子吗?

现在,我找到了以下解释: http : //www.linux-mag.com/id/7411-但是“并发是程序的属性”与“并行执行是机器的属性”对我来说还不够-我还是不能说什么。


#1楼

我在一些博客中找到了此内容。 认为它是有用和相关的。

并发和并行性不是一回事。 如果未预先确定两个任务的执行顺序,则两个任务T1和T2是并发的,

T1可以在T2之前执行并完成,T2可以在相同时间(并行)同时执行T1,T1和T2之前执行并完成,T1和T2可以交替执行,...如果有两个并发线程如果操作系统将其调度为在一个单核非SMT非CMP处理器上运行,则可能会并发但不会并行。 并行可能在多核,多处理器或分布式系统上进行。

并发通常被称为程序的属性,并且是比并行性更笼统的概念。

资料来源: https : //blogs.oracle.com/yuanlin/entry/concurrency_vs_parallelism_concurrent_programming


#2楼

我相信并发编程是指多线程编程,它是让您的程序运行从硬件详细信息中抽象出来的多个线程。

并行编程是指专门设计程序算法以利用可用的并行执行。 例如,您可以并行执行某些算法的两个分支,以期比起先检查第一个然后再检查第二个分支的结果更快(平均)达到结果。


#3楼

它们是两个短语,从(非常轻微)不同的角度描述同一件事。 并行编程从硬件的角度描述了这种情况-至少有两个处理器(可能在单个物理包中)并行处理问题。 并发编程从软件的角度描述了更多东西-可能在同一时间(并发)发生两个或多个动作。

这里的问题是,人们在实际上不存在这两个短语的情况下,试图使用这两个短语进行明确的区分。 现实情况是,他们试图绘制的分界线数十年来一直模糊不清,并且随着时间的推移变得越来越模糊。

他们试图讨论的事实是,从前,大多数计算机只有一个CPU。 当您在单个CPU上执行多个进程(或线程)时,CPU一次实际上仅在其中一个线程中执行一条指令。 并发的外观是一种错觉-CPU在来自不同线程的执行指令之间切换的速度足够快,以至于让人感觉到(任何小于100 ms的瞬间看起来都是瞬时的),就好像它正在一次做很多事情。

与此形成鲜明对比的是,一台具有多个CPU的计算机或一个具有多个内核的CPU,因此该计算机正好同时执行来自多个线程和/或进程的指令。 执行一个的代码不能/不影响另一个执行的代码。

现在的问题是:如此清晰的区分几乎从未存在过。 计算机设计师实际上是相当聪明的,所以他们很久以前就注意到(例如)当您需要从I / O设备(例如磁盘)读取某些数据时,花了长时间(就CPU周期而言)完。 他们没有让CPU闲置,而是想出了各种方法让一个进程/线程发出I / O请求,并让其他进程/线程的代码在I / O请求完成时在CPU上执行。

因此,早在多核CPU成为规范之前,我们就有来自多个线程的操作并行发生。

不过,那只是冰山一角。 几十年前,计算机也开始提供另一级别的并行性。 再次,作为非常聪明的人,计算机设计师注意到,在很多情况下,他们所使用的指令不会互相影响,因此可以从同一流中同时执行多个指令。 早已广为人知的一个例子是Control Data6600。这是(在相当大的程度上)1964年推出时地球上最快的计算机-至今仍使用许多相同的基本体系结构。 它跟踪每个指令所使用的资源,并具有一组执行单元,一旦它们所依赖的资源可用,它们就会执行指令,这与最新的Intel / AMD处理器的设计非常相似。

但是(正如商业广告所说的那样)等等-还不止这些。 还有另一个设计元素,进一步增加了混乱。 它有很多不同的名称(例如,“ Hyperthreading”,“ SMT”,“ CMP”),但它们都引用相同的基本思想:一个CPU可以同时使用多个资源来同时执行多个线程,每个线程和线程之间共享的一些资源是独立的。 在典型情况下,这与上面概述的指令级并行性结合在一起。 为此,我们有两组(或更多组)体系结构寄存器。 然后,我们有一组执行单元,可以在必要的资源可用时立即执行指令。 这些通常合并得很好,因为来自不同流的指令实际上从不依赖于相同的资源。

然后,我们当然可以使用具有多个内核的现代系统。 这里的事情很明显,对吧? 我们有N个内核(目前在2到256个左右之间),每个内核都可以同时执行指令,因此我们有一个真正的并行处理的清晰案例-在一个进程/线程中执行指令不会不会影响另一个执行指令。

好吧,有点。 即使在这里,我们也有一些独立的资源(寄存器,执行单元,至少一个缓存级别)和一些共享资源(通常至少是最低缓存级别,并且肯定还有内存控制器和内存带宽)。

总结一下:人们喜欢在共享资源和独立资源之间进行对比的简单场景实际上在现实生活中从未发生过。 在共享所有资源的情况下,我们最终会遇到类似于MS-DOS的情况,其中一次只能运行一个程序,并且必须停止运行一个程序才能完全运行另一个程序。 有了完全独立的资源,我们有N台运行MS-DOS的计算机(甚至没有网络来连接它们),根本无法共享它们之间的任何内容(因为即使我们可以共享文件,那也就是共享资源,违反了什么都不共享的基本前提)。

每个有趣的案例都涉及独立资源和共享资源的某种组合。 每台相当现代的计算机(以及很多不是现代的计算机)至少具有同时执行至少一些独立操作的能力,并且几乎任何比MS-DOS更复杂的事物都至少利用了这一点。一定程度上。

人们喜欢画的“并发”和“平行”之间的漂亮,清晰的划分是不存在的,而且几乎永远不会存在。 人们喜欢归类为“并发”的内容通常仍然涉及至少一种并且通常是更多不同类型的并行执行。 他们喜欢归类为“并行”的内容通常涉及共享资源,(例如)一个进程在使用两者之间共享的资源时阻止了另一个进程的执行。

人们试图在“并行”和“并行”之间划清界限,他们生活在幻想中的计算机实际上并不存在。


#4楼

如果您正在使用线程编程(并行编程),则不一定要这样执行(并行执行),因为这取决于计算机是否可以处理多个线程。

这是一个视觉示例。 非线程机器上的线程

        --  --  --
     /              \
>---- --  --  --  -- ---->>

线程计算机上的线程

     ------
    /      \
>-------------->>

破折号代表执行的代码。 如您所见,它们既拆分又分别执行,但是线程机可以一次执行几个单独的部分。


#5楼

我了解到的区别是:

1)并发-使用共享资源串联运行2)并行-使用不同资源并排运行

因此,即使它们在点(2)汇合在一起,也可以使彼此同时发生的两件事同时发生,或者在执行的整个操作中,有两件事利用相同的储备金(1)。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!