多核和并发编程之间有什么区别

时间:2011-03-21 01:08:43

标签: multithreading concurrency multicore concurrent-programming

任何人都可以帮助我,我正在做一个演示文稿,并希望包括一些 - “多核和并发编程之间的区别”,我已经google了一下,但没有提出很多好的描述,任何帮助赞赏! :)

谢谢,

埃蒙

5 个答案:

答案 0 :(得分:4)

并发 (同时发生或存在)意味着不同的代码 MAY 以完全相同的周期执行。这意味着如果多个处理器或具有多个核心的处理器可用并且程序正确制作,则可以可能并行发生。仅添加线程并不意味着并发执行。

我说 MAY 可能的原因是,当程序单独的线程需要共享volatile / mutable状态时,需要访问该状态的其他线程无法继续执行并且必须等待轮到他们访问该状态,然后事情又开始连续发生。

通常,这是在单个程序中实现的,因为多个线程在与另一个线程完全相同的周期内并发执行代码,因为上面没有资源争用。这需要多个物理处理器或核心。其他模型运行多个可以同时执行的重量级OS进程。

使用可变共享状态很难正确进行并发编程。

  

您可以编写并发计划   在单个单独运行串行   核心处理器,但可扩展到   同时执行更多的事情   当更多的处理器或核心,甚至   多个处理器   核心存在。

     

如果多线程/多处理器系统可以同时在独立的输入数据范围内运行,您还可以使单线程程序并发。示例:单核线程3D渲染程序可以在双核机器上运行2个单独的实例,第一个渲染所有奇数帧,第二个渲染所有偶数帧。只要他们不尝试分享任何可变资源。

多核意味着单个CPU具有多个处理器核心,可以同时执行线程或进程,并且通常显示为主流操作系统的多个处理器。

  

NOT 暗示单线程程序从可用的其他处理器内核中获得任何并发行为或好处。

答案 1 :(得分:2)

并发编程更广泛 - 它只是指编写将“同时”运行的软件 - 即:一次会发生多件事。

“多核”编程实际上是指并发编程的特定子集,其中您在特定计算机上定位多个可用CPU核心。这是最常见的并发编程形式(通常是在单个计算机上运行的单个进程),但仍然只有一种形式的并发编程。

答案 2 :(得分:1)

您可以在只有一个CPU核心的计算机上进行并发编程。操作系统提供了多个线程同时运行的错觉,它可以在它们之间快速切换。

由于两个线程可以在两个核心上同时运行,因此具有多个核心的计算机只需更少地切换此上下文。它只是有点特殊,因为线程错误会让你的生活变得更加困难。两个线程同时尝试访问共享内存位置的几率要高得多。

答案 3 :(得分:1)

在高级别,多核是计算机中处理器芯片的属性。多核意味着它拥有多个处理核心。有几种类型的多处理器计算机:旧式超级计算机,有数千台计算机通过以太网连接,系统具有多个处理器(如2奔腾4),以及现代多核系统,其中每个处理器包都有多个处理核心9like英特尔i7)。第三种类型通常称为芯片多处理器(CMP)的多核。

并发编程是软件的一个属性。并发编程是关于编写代码,该代码被分成多个任务,如果处理器可用,它们可以并发执行。虽然并发程序确实利用了多核,但并发编程在两个方面更为广泛:

  1. 并发程序可以在单核或多核上运行。
  2. 并发程序可用于上面提到的任何类型的多处理器。
  3. 因此,总结一下:

    并发编程是指可以使用多个处理器的软件。这些处理器可以位于同一芯片(多核或多芯片处理器)或不同芯片(通常称为SMP)上。您可以拥有可以将两个多核芯片放在同一系统中的系统,使其同时成为CMP和SMP。并发编程也适用于此。

答案 4 :(得分:1)

并发编程关注看似重叠的操作,主要关注由于非确定性控制流而引起的复杂性。与并发程序相关的定量成本通常是吞吐量和延迟。并发程序通常是IO绑定但不总是,例如,并发垃圾收集器完全在CPU上。并发程序的教学示例是Web爬行程序。该程序启动对网页的请求,并在下载结果可用时同时接受响应,累积已经访问过的一组页面。控制流是不确定的,因为每次运行程序时,响应不一定以相同的顺序接收。这种特性使得调试并发程序变得非常困难。一些应用程序基本上是并发的,例如Web服务器必须同时处理客户端连接。 Erlang,F#asynchronous workflows和Scala的Akka库可能是高度并发编程最有前途的方法。

多核编程是并行编程的一个特例。并行编程涉及为提高吞吐量的特定目标而重叠的操作。通过使控制流确定性来避免并发编程的困难。通常,程序会生成并行运行的子任务集,而父任务仅在每个子任务完成后才会继续。这使得并行程序比并发程序更容易调试。并行编程的难点在于粒度和通信等问题的性能优化。后者在多核的背景下仍然是一个问题,因为将数据从一个缓存传输到另一个缓存有相当大的成本。密集矩阵 - 矩阵乘法是并行编程的一个教学实例,它可以通过使用Straasen的分而治之算法并行地攻击子问题来有效地求解。 Cilk可能是多核上高性能并行编程最有前途的方法,它已被英特尔的Threaded Building Blocks和微软的Task Parallel Library(在.NET 4中)采用。