这是我参与8月更文挑战的第15天,活动详情查看:8月更文挑战
并发与并行
并发性与并行性主要是多线程的概念。表面上看起来二者概念类似,实际上是代表不同的内容。
并发
并发意味着在多个任务上取得进展,至少表面上看起来同时。如果计算机只有一个cpu,则应用程序可能不会同一时间处理多个任务。为了处理多个任务,cpu会在不同任务间进行切换。
并行执行
并行主要指计算机具有多个cpu或内核,并且同时在多个cpu上取得进展。但并行执行又与并行性属于不同的概念。
并行并发执行
并行并发执行主要是利用程序分布在多个cpu上进行执行。在同一cpu上的线程执行是并发的,而在不同cpu上的执行是并行的。
并行性
并行性意味着将一个任务拆分为更小的子任务,而子任务可以并行执行。因此,并行性与并行并发执行还有着本质的区别。
- 要实现真正的并行性,应用程序必须运行多个线程,每个线程在单独的cpu或内核上执行。
- 将任务分解为与cpu数目相同的子任务并不总是十分容易的。通常将任务分解为适合分解数目的子任务,再由线程调度程序在cpu间调度,来达到最优性能。
并发与并行组合
概括的说,并发是指单个cpu如何在多个任务上取得进展,并行则于如何将任务拆分为多个子任务并行执行有关。
并发非并行
一个应用程序可以是并发的,但不能是并行的。这意味着它似乎同时(同时)在多个任务上取得进展,但应用程序在每个任务上取得进展之间切换 - 直到任务完成。在并行线程/CPU 中没有真正并行执行任务。
并行非并发
应用程序也可以是并行的,但不能是并发的。这意味着应用程序一次只能处理一个任务,并且该任务被分解为可以并行处理的子任务。但是,每个任务(子任务)在下一个任务被拆分并并行执行之前完成。
既不并发也不并行
这意味着它一次只处理一个任务,并且该任务永远不会分解为并行执行的子任务。对于小型命令行应用程序来说可能就是这种情况,因为它只有一个太小而无法并行化的作业。
后记
- 千古兴亡多少事?悠悠。不尽长江滚滚流。