迄今为止所讨论的进程模型暗示:每个进程是一个只能进行运行单个 线程(thread)的程序。例如,如果一个进程运行一个字处理程序,那么只能执行单个指令线程。这种单一控制线程使得进程一次只能执行一个任务。例如,用户不能在同一进程内,同时输入字符和拼写检查。现代许多操作系统扩展了进程的概念,以便支持一次能够执行多个线程。
多核多线程
在计算机设计早期,为了响应更多计算性能的需要,单处理器系统发展成为多处理器系统。更现代的、类似的系统设计趋势是将多个计算核心放到单个芯片。无论多个计算核心是在多个CPU芯片还是在单个CPU芯片上,我们称之为 多核(multicore) 或 多处理器(multiprocessor)系统。多线程编程提供机制,以便更有效地使用这些多个计算核和改进的并发性。考虑一个应用,它有4个线程。对于单核系统,并发仅仅意味着线程随着事件推移交错执行,因为处理器只能同一时间执行单个线程。不过,对于多核系统,并发表示线程能够并行运行,因为系统可以为每个核分配一个单独线程。
注意这里讨论的 并行性(parallelism) 和 并发性(concurrency)的区别。并行系统可以同时执行多个任务,相比之下,并发系统执行多个任务,允许所有任务都能取得进展,而异步恰恰是并发的一种方式。因此,没有并行,并发也是可能的。在SMP和多核架构出现之前,大多数计算机系统只有单个处理器。CPU调度器通过快速切换系统内的进程,以便允许每个进程取得进展,从而提供并行假象。这些进程并发运行,而非并行运行。
随着系统线程数量从几十个到几千上万个,CPU设计人员通过增加硬件来改善线程性能的提高系统性能。现代Intel CPU的每个核经常支持两个线程,而Oracle T4 CPU的每个核支持8个线程。这种支持意味着,可以将多个线程加载到处理核以便快速切换。毫无疑问,多核计算机将继续增加多核数量核硬件线程支持。
并行类型
通常,由两种类型的并行:数据并行和任务并行。数据并行(data parallelism)注重将数据分布于多个计算核上,并在每个核上执行相同操作。例如,考虑一下对大小为N的数组的内容进行求和。对于单核系统,一个线程只能简单相加元素[0]…[N-1]。不过,对于双核系统,线程A,运行在核0上,相加元素[0]…[N/2-1];而线程B,运行在核1上,相加元素[N/2]…[N-1]。这两个线程可并行运行在各自的计算核上。
任务并行(task parallelism)设计将任务(线程)而不是数据分配到多个计算核。 每个线程都执行一个独特的操作。不同线程可以操作相同的数据,或者也可以操作不同的数据。再考虑刚才的例子。与那个情况相反,一个并行任务的例子可能设计两个线程,每个线程对元素数组执行一个唯一的统计操作。再次,线程在单独计算核上并行操作,但是每个执行一个独特操作。
从根本上说,数据并行涉及分布数据到多个核,而任务并行分布多个任务到多个核。然而,在实践中,应用程序很少严格遵循数据或任务并行。在大多数情况下,应用程序混合使用这两个策略。
原创文章,作者:huoxiaoqiang,如若转载,请注明出处:https://www.huoxiaoqiang.com/linux/os/11632.html