我对线程和进程有基本的理解,我想知道为什么每一本教科书都谈到线程级并行性,进程级并行性是否存在?与进程级并行相比,线程级并行的优点是什么?
发布于 2019-01-17 13:24:37
简单回答:性能和编程方便
较长的答覆:
首先,必须考虑两种不同的并行性:基于任务的并行(或“宏并行”)(例如,任务A修改一些数据并将结果传递给任务B)和数据级并行(或“微并行”)(例如,处理大型矩阵或向量的负载分布在多个并行代理中)。
第二,当考虑并行性时,不同的代理需要交换信息。对于线程级的并行性,所有线程都可以访问相同的地址空间,通信只是内存访问。相反,进程级并行需要特定的方法来实现进程间通信(IPC),以允许进程交换数据。有几种IPC方法(管道、共享-mem、套接字等)(例如,请参见沟通)。
问题是,这些方法通常具有重要的开销,通信可能需要几个耗时的数据副本。这就是为什么它们目前很少在一个过程中使用的主要原因。但是,当考虑进程在不同的和潜在的远程处理器上运行时,进程级的并行性被广泛使用。例如,客户机-服务器应用程序是进程级并行。
在单个处理器上,进程级并行目前也用于shell脚本,作为重用现有程序的一种简单方法。例如,在unix上,像“排序< a_large_file \ uniq”这样的脚本是进程级并行性。可能不是实现此操作的最有效方法(就性能而言),但如果考虑编程时间,则完全是无与伦比的。
此外,线程级并行的最大优点是:
1)通过共享内存实现简单快速的通信机制
2)能够很好地适应任务级并行或数据级并行。
3)易于编程
第二和第三点可能是最重要的。虽然线程级并行可以基于独立的任务,但是速度通常是有限的,大多数现有的应用程序依赖于数据级别的并行性,而线程是很好地适应这种并行性的。公共内存空间使得通信开销非常有限(除非考虑锁),而且存在非常高效和易于使用的并行化工具(例如open-MP)。
在独立进程上实现这种并行也是可能的。在考虑大型计算机进行高性能计算时,甚至经常发生这种情况。有些工具(例如“消息传递接口”)是存在的,但与线程级的并行性相比,实现要复杂得多,容易出错,效率也低。
发布于 2019-08-03 22:55:25
进程级并行性存在。
但是,Linux内核不知道线程或进程。它只知道任务。
有由进程或线程执行的平行性。
线程是与父任务共享大部分资源(地址空间、mmap、管道、打开的文件处理程序、套接字等)的任务。并行性不可避免的问题是资源共享。
还有Linux来控制线程之间共享或不共享多少资源,这提供了更多的灵活性。
这就是为什么线程级的并行性更流行的原因,特别是在为商业服务器(如数据库)编写的应用程序中。
https://stackoverflow.com/questions/54231481
复制相似问题