Linux 线程级并行与进程级并行

Linux 线程级并行与进程级并行,linux,multithreading,parallel-processing,Linux,Multithreading,Parallel Processing,我对线程和进程有一个基本的了解,我想知道为什么每本教科书都讨论线程级并行,进程级并行是否存在?线程级并行比进程级并行有什么优势?简短回答:性能和编程容易 长答覆: 首先,必须考虑两种不同的并行性:基于任务的并行性(或“宏并行性”)(例如任务A修改一些数据并将结果传递给任务B)和数据级并行性(或“微并行性”)(例如,处理大矩阵或向量的负载在多个并行代理之间传播)。 其次,当考虑并行性时,不同的代理需要交换信息。对于线程级并行,所有线程都可以访问相同的地址空间,而通信只是内存访问。 相反,进程级并行

我对线程和进程有一个基本的了解,我想知道为什么每本教科书都讨论线程级并行,进程级并行是否存在?线程级并行比进程级并行有什么优势?

简短回答:性能和编程容易

长答覆:

首先,必须考虑两种不同的并行性:基于任务的并行性(或“宏并行性”)(例如任务A修改一些数据并将结果传递给任务B)和数据级并行性(或“微并行性”)(例如,处理大矩阵或向量的负载在多个并行代理之间传播)。 其次,当考虑并行性时,不同的代理需要交换信息。对于线程级并行,所有线程都可以访问相同的地址空间,而通信只是内存访问。 相反,进程级并行需要进程间通信(IPC)的特定方式,以允许进程交换数据。存在几种IPC方法(管道、共享mem、套接字等)(参见示例)

问题是这些方法通常具有重要的开销,并且通信可能需要几个耗时的数据副本。这就是为什么它们目前很少在单个进程中使用的主要原因。但当考虑运行在不同且可能相距遥远的处理器上的进程时,通常使用进程级并行。例如,客户机-服务器应用程序是进程级并行

在单处理器上,进程级并行目前也用于shell脚本,作为重用现有程序的简单方法。 例如,在unix上,“sort 1) 通过共享内存实现简单快速的通信机制

2) 能够很好地适应任务级并行或数据级并行

3) 易于编程

第2)点和第3)点可能是最重要的。虽然线程级并行可以基于独立的任务,但速度通常受到限制,并且大多数现有应用程序依赖于数据级并行,线程对此有很好的适应性。公共内存空间使得通信开销非常有限(考虑锁时除外),并且存在非常高效且易于使用的并行化工具(例如OpenMP)


在独立进程上实现这种并行也是可能的。甚至在考虑使用大型计算器进行高性能计算时,这种情况也经常发生。存在一些(粗糙的)工具(例如“消息传递接口”),但实现远比线程级并行更复杂、更容易出错、效率更低

存在进程级并行

但是,Linux内核不知道线程或进程。它只知道任务

有一种是由进程或线程执行的

线程是与父任务共享大部分资源(地址空间、MMAP、管道、打开的文件处理程序、套接字等)的任务。并行性不可避免的问题是资源共享

还有Linux API来控制线程之间共享或不共享多少资源,这提供了更大的灵活性


这就是为什么线程级并行更受欢迎的原因,特别是在为数据库等商业服务器编写的应用程序中。

IMHO,线程级并行的最大优点是线程共享相同的地址空间。这使得在线程之间共享数据变得更简单。这也是最大的缺点,因为它使调试变得困难-哪个线程改变了这一点?谁先到这里?