多核与并发编程有什么区别?

4

有没有人能帮我一下?我正在制作一个演示文稿,想包括一些关于“多核和并发编程的区别”的内容。我已经谷歌了一下,但没有找到很好的描述,感激任何帮助!

谢谢,

Eamonn


1
可能是并行编程和多核编程有什么区别?的重复问题。 - user177800
5个回答

4

并发(Concurrent)意味着不同的代码可能在同一周期内执行。这意味着,如果有多个处理器或具有多个核心的处理器,并且程序被正确地编写,事情就可以可能以并行方式发生。但仅添加线程并不意味着并发执行。

我之所以说可能,是因为每当程序的不同线程需要共享易变/可变状态时,需要访问该状态的其他线程将无法继续执行,它们必须等待轮到它们访问该状态,然后事情再次按顺序发生。

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

使用易变共享状态进行并发编程非常困难。

您可以编写一个在单个核心处理器上串行运行的并发程序,但在存在更多处理器或核心,甚至是多个处理器和多个核心的情况下,可以扩展以同时执行更多任务。

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

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

不意味着单线程程序从可用的额外处理器核心中获得任何并发行为或好处。


并发编程在处理可变共享状态时很难正确实现。Cilk示例是一个很好的反例。共享可变状态的并发编程可能很困难,但在多核并行编程中通常是必不可少的。 - J D

2

并发编程更为广泛 - 它指的是编写能够同时运行多个任务的软件。

"多核"编程实际上是并发编程的一个具体子集,其中你的目标是利用特定机器上多个可用的CPU核心。这是最常见的并发编程形式(通常是在单台计算机上运行的单个进程),但仍然只是并发编程的一种形式。


1

你可以在只有一个CPU核心的机器上进行并发编程。操作系统提供了一种假象,即多个线程同时运行,它们之间快速地切换。

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


你不能在单核 CPU 上进行并发编程,虽然可以进行异步编程,但是单核 CPU 一次只能做一件事情,你所描述的是时间片轮转,根据定义这不是并发。 - user177800
这是无稽之谈。从单个核心获得的并发错误完全相同。线程由硬件中断调度,对程序状态毫不关心。奇怪,你看起来足够老,应该已经调试过这样的错误了。 - Hans Passant
在单核 CPU 上,只有一件事情可以同时发生,这是由物理定律所决定的。在非常短的时间内做多于一件事情不是并发的,因为它们不是同时发生的。[定义并发 - 形容词同时存在、发生或完成。(https://www.google.com/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#safe=off&q=define%20concurrent)你不能随意创造并发的新定义。并发也不意味着共享状态,你似乎混淆了很多东西。 - user177800

1

在高层次上,多核是计算机处理器芯片的一个属性。多核意味着它具有多个处理内核。有几种类型的多处理器计算机:旧式超级计算机通过以太网连接数千台计算机、具有多个处理器(如2个 Pentium 4)的系统以及现代多核系统,在这些系统中,每个处理器套件都具有多个处理内核(例如Intel i7)。第三种类型通常称为芯片多处理器(CMP)的多核处理。

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

  1. 并发程序可以在单个核心或多个核心上运行。
  2. 并发程序可以在我上面提到的任何类型的多处理器上使用。

因此,总结一下:

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


1

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接