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

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

如今,我找到了如下解释: 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楼

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

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


#3楼

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

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

他们试图讨论的事实是,从前,大多数计算机只有一个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)。

相关文章
相关标签/搜索