Linux 线程级并行与进程级并行
我对线程和进程有一个基本的了解,我想知道为什么每本教科书都讨论线程级并行,进程级并行是否存在?线程级并行比进程级并行有什么优势?简短回答:性能和编程容易 长答覆:Linux 线程级并行与进程级并行,linux,multithreading,parallel-processing,Linux,Multithreading,Parallel Processing,我对线程和进程有一个基本的了解,我想知道为什么每本教科书都讨论线程级并行,进程级并行是否存在?线程级并行比进程级并行有什么优势?简短回答:性能和编程容易 长答覆: 首先,必须考虑两种不同的并行性:基于任务的并行性(或“宏并行性”)(例如任务A修改一些数据并将结果传递给任务B)和数据级并行性(或“微并行性”)(例如,处理大矩阵或向量的负载在多个并行代理之间传播)。 其次,当考虑并行性时,不同的代理需要交换信息。对于线程级并行,所有线程都可以访问相同的地址空间,而通信只是内存访问。 相反,进程级并行
首先,必须考虑两种不同的并行性:基于任务的并行性(或“宏并行性”)(例如任务A修改一些数据并将结果传递给任务B)和数据级并行性(或“微并行性”)(例如,处理大矩阵或向量的负载在多个并行代理之间传播)。 其次,当考虑并行性时,不同的代理需要交换信息。对于线程级并行,所有线程都可以访问相同的地址空间,而通信只是内存访问。 相反,进程级并行需要进程间通信(IPC)的特定方式,以允许进程交换数据。存在几种IPC方法(管道、共享mem、套接字等)(参见示例)
问题是这些方法通常具有重要的开销,并且通信可能需要几个耗时的数据副本。这就是为什么它们目前很少在单个进程中使用的主要原因。但当考虑运行在不同且可能相距遥远的处理器上的进程时,通常使用进程级并行。例如,客户机-服务器应用程序是进程级并行 在单处理器上,进程级并行目前也用于shell脚本,作为重用现有程序的简单方法。 例如,在unix上,“sort在独立进程上实现这种并行也是可能的。甚至在考虑使用大型计算器进行高性能计算时,这种情况也经常发生。存在一些(粗糙的)工具(例如“消息传递接口”),但实现远比线程级并行更复杂、更容易出错、效率更低 存在进程级并行 但是,Linux内核不知道线程或进程。它只知道任务 有一种是由进程或线程执行的 线程是与父任务共享大部分资源(地址空间、MMAP、管道、打开的文件处理程序、套接字等)的任务。并行性不可避免的问题是资源共享 还有Linux API来控制线程之间共享或不共享多少资源,这提供了更大的灵活性
这就是为什么线程级并行更受欢迎的原因,特别是在为数据库等商业服务器编写的应用程序中。IMHO,线程级并行的最大优点是线程共享相同的地址空间。这使得在线程之间共享数据变得更简单。这也是最大的缺点,因为它使调试变得困难-哪个线程改变了这一点?谁先到这里?