任何人都可以帮助我,我正在做一个演示文稿,并想包括一些关于 - '多核和并发编程之间的区别',我用谷歌搜索了一下,但没有找到很多好的描述,任何帮助表示赞赏!:)
谢谢,
埃蒙
任何人都可以帮助我,我正在做一个演示文稿,并想包括一些关于 - '多核和并发编程之间的区别',我用谷歌搜索了一下,但没有找到很多好的描述,任何帮助表示赞赏!:)
谢谢,
埃蒙
并发 (同时发生或存在)意味着不同的代码可以在完全相同的周期执行。这意味着如果多个处理器或具有多个内核的处理器可用并且程序设计正确,那么事情可能会并行发生。仅仅添加线程并不意味着并发执行。
我说MAY和可能的原因是,任何时候程序单独的线程需要共享 volatile/mutable 状态,需要访问该状态的其他线程无法继续执行,并且必须等待轮到他们访问该状态,并且事情开始发生再次连续。
通常这是在单个程序中实现的,因为多个线程在与另一个线程相同的精确周期同时执行代码,假设没有上面列出的资源争用。这需要多个物理处理器或内核。其他模型运行多个可以同时执行的重量级操作系统进程。
使用可变共享状态很难正确地进行并发编程。
您可以编写一个在单个单核处理器上串行运行的并发程序,但当存在更多处理器或内核,甚至是具有多个内核的多个处理器时,可以扩展以同时执行更多事情。
如果单线程程序可以同时对独立的输入数据范围进行操作,您还可以使单线程程序在多核/多处理器系统上出现并发。示例:单线程 3D 渲染程序可以在双核机器上运行 2 个单独的实例,第一个渲染所有奇数帧,第二个渲染所有偶数帧。只要他们不尝试共享任何可变资源。
多核是指单个 CPU 具有多个可以同时执行线程或进程的处理器内核,通常在主流操作系统中表现为多个处理器。
这并不意味着单线程程序会从可用的额外处理器内核中获得任何并发行为或好处。
并发编程更广泛-它仅指编写将“并发”运行的软件-即:一次会发生不止一件事。
“多核”编程实际上是指并发编程的特定子集,其中您针对特定机器上的多个可用 CPU 内核。这是最常见的并发编程形式(通常是在单台计算机上运行的单个进程),但仍然只是并发编程的一种形式。
并发编程考虑似乎重叠的操作,主要关注由于非确定性控制流而产生的复杂性。与并发程序相关的定量成本通常是吞吐量和延迟。并发程序通常受 IO 限制,但并非总是如此,例如并发垃圾收集器完全在 CPU 上。并发程序的教学示例是网络爬虫。该程序启动对网页的请求,并在下载结果可用时同时接受响应,累积一组已访问过的页面。控制流是不确定的,因为每次运行程序时不一定以相同的顺序接收响应。这个特性会使调试并发程序变得非常困难。Erlang、F#异步工作流和 Scala 的Akka库可能是最有前途的高并发编程方法。
多核编程是并行编程的一个特例。并行编程涉及为提高吞吐量的特定目标而重叠的操作。通过使控制流具有确定性,可以避免并发编程的困难。通常,程序会生成并行运行的子任务集,并且父任务仅在每个子任务完成后才继续。这使得并行程序比并发程序更容易调试。并行编程的难点在于针对粒度和通信等问题的性能优化。后者在多核环境中仍然是一个问题,因为将数据从一个缓存传输到另一个缓存会产生相当大的成本。Cilk可能是在多核上进行高性能并行编程的最有前途的方法,它已被 Intel 的Threaded Building Blocks和 Microsoft 的Task Parallel Library(在 .NET 4 中)采用。
在高层次上,多核是计算机中处理器芯片的一个属性。多核意味着它有多个处理核心。有几种类型的多处理器计算机:具有数千台计算机通过以太网连接的老式超级计算机、具有多个处理器的系统(如 2 个 Pentium 4s)以及现代多核系统,其中每个处理器包都有多个处理核心 9like英特尔 i7)。第三种通常称为多核芯片多处理器(CMP)。
并发编程是软件的一个属性。并发编程是关于编写已拆分为多个任务的代码,如果处理器可用,这些任务可以并发执行。虽然并发程序确实利用了多核,但并发编程在两个方面更广泛:
因此,总结一下:
并发编程是关于可以使用多个处理器(如果可用)的软件。这些处理器可以位于同一芯片(多核或芯片多处理器)或不同芯片(通常称为 SMP)上。您可以拥有可以在同一系统中放置两个多核芯片的系统,使其同时成为 CMP 和 SMP。并发编程也适用于此。
您可以在只有一个 CPU 内核的机器上进行并发编程。操作系统提供了同时运行多个线程的错觉,它在它们之间快速来回切换。
由于两个线程可以同时在两个内核上运行,因此具有多个内核的机器只需要较少频繁地进行这种上下文切换。它只是有点特别,因为线程错误会使您的生活变得更加困难。两个线程同时尝试访问共享内存位置的几率要高得多。