C#并行编程-相关概念

原文:C#并行编程-相关概念

菜鸟初步学习,不对的地方请大神指教,参考《C#并行编程高级教程.pdf》

背景

当今计算机至少都有一颗双核的微处理器,带有四核、八核的计算机非常常见,在单个处理器上具有多个内核的时代正在来临,现代微处理器提供了新型的多核架构,因此软件设计和编码能够充分发挥这些架构的功能是非常重要的事情,也要与时俱进。

多核微处理器

多核微处理器有很多种不同的复杂微架构,意在提供更强的并行执行能力,提升吞吐量,减少潜在的性能瓶颈,缩减电源消耗,并减少发热量,因此,现代很多的微处理器可以根据工作负载提升或降低每个内核的时钟频率,甚至可以将不在使用中的内核进入睡眠状态,等需要这些内核的时候,操作系统又会唤醒它们。

硬件线程与软件线程

多核处理器带有一个以上的物理内核,每个物理内核都可能会提供多个硬件线程,也称之为逻辑内核或者逻辑处理器。

Windows中每个运行的程序都是一个进程(process),每个进程都会创建并运行一个或者多个线程,也被称为软件线程(software thread),在一个进程当中只要有一个线程,这个线程我们称之为主线程(main thread)。

操作系统的调度器在所有要运行的进程和线程之间公平的分享可用的处理资源,给每一个软件线程分配处理时间,当Windows调度器运行在多核微处理器上时,调度器必须从物理内核支持的硬件线程中分配时间给一个需要运行指令的软件线程。

Windows将每一个硬件线程识别为一个可调度的逻辑处理器,每一个逻辑处理器可以运行软件线程代码,运行多个软件线程的进程可以充分发挥硬件线程和物理内核的优势,并行地运行指令。Windows会给每一个可用的硬件线程分配一块块的处理时间,并通过这种方式运行上百个千个软件线程。

基于任务的并行化设计规则

1.将每个问题分为很多子问题,不需要考虑子问题任务的执行顺序(能够以并行方式处理的数据,能够以某种复杂的并行化处理的数据流等)

2.考虑不用问题连接起来的必要性,需要避免任务与任务之间的依赖性。

3.减少任务与任务之间的临界区。

并行任务的利与弊

1.并行任务的运行和管理都是需要开销的,在程序中需要执行的任务越多,并行的效果越好。

2.并行任务中对于共享的资源或数据越多,对并行任务的执行性能损耗越大,如果每个任务的资源都是独立存在的,性能会好很多。

多线程

多线程是指从软件或者硬件上实现多个线程并发执行的技术,具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升处理能力。

多线程与并行计算区别  参考http://blog.csdn.net/delacroix_xu/article/details/5928121

本质上没有区别,多线程的作用不只是并行计算,还有其他的作用(如降低阻塞,在单核时代,多线程的这个消除阻塞的作用我们称之为“并发”,这和并行本质上是不同的 )

并行计算还可以通过其他的手段来获得,多线程只是其中一种方式(如多进程)

写的有点乱,大家稍微讲究着看下,主要是windows调度器,多核微处理器,硬件线程,软件线程之间的关系 以及 并行任务开发的良好的约束,不对的地方希望大家指正

 

作者:释迦苦僧 出处:http://www.cnblogs.com/woxpp/p/3924476.html
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。

时间: 2024-09-04 21:01:18

C#并行编程-相关概念的相关文章

Guava - 并行编程Futures

Guava为Java并行编程Future提供了很多有用扩展,其主要接口为ListenableFuture,并借助于Futures静态扩展. 继承至Future的ListenableFuture,允许我们添加回调函数在线程运算完成时返回值或者方法执行完成立即返回. 对ListenableFuture添加回调函数: Futures.addCallback(ListenableFuture<V>, FutureCallback<V>, Executor) 其中 FutureCallbac

利用F#在Silverlight中实现并行编程

随着.NET 4的发布,要在.NET平台之上进行并行编程可谓是易如反掌.实际上,微软为大家提供了三种并行编程的基础功能.第一种是提供给C++使用的并发运行时 (Concurrency Runtime);第二种是藉由.NET平台提供给托管语言的一组并行编程函数库(包括TPL.PLINQ和并行编程数据结构等);最后一种就是基于F# 本身的并行编程特性. 然而,由于考虑精简的缘故,当前的CoreCLR并未包含.NET 4中的并行函数库,从而在Silverlight(即使最新的Silverlight 4

用Hadoop进行分布式并行编程, 第1部分

Hadoop 是一个实现了 MapReduce 计算模型的开源分布式并行编程框架,借助于 Hadoop, 程序员可以轻松地编写分布式并行程序,将其运行于计算机集群上,完成海量数 据的计算.本文将介绍 MapReduce 计算模型,分布式并行计算等基本概念,以及 Hadoop 的安装部署和基本运行方法. Hadoop 简介 Hadoop 是一个开源的可运行于大规模集群上的分布式并行编程框架,由于分布式存储 对于分布式编程来说是必不可少的,这个框架中还包含了一个分布式文件系统 HDFS( Hadoo

模式转变:并行编程方面的设计注意事项

本文以 Visual Studio 工具的预发布版为基础.文中的所有信息均有可能发生变更. 本文将介绍以下内容: 并行计算 并发编程 性能提高 本文使用了以下技术: 多线程 从 1986到 2002 年,微处理器的性能每年提高了 52%.这一惊人的技术进步源自晶体管成本依据摩尔 法则不断地缩减,以及处理器厂商在工程方面的出色表现.微软的研究员 Jim Larus 将上述两种因素的 组合称为"摩尔红利",他解释了这一红利如何造就了现代软件业并使计算机得以广泛普及(请参阅 go.micro

深入理解并行编程-锁

锁 在过去几十年并发研究领域的出版物中,锁总是扮演着坏人的角色,锁背负的指控包括引起死锁.锁封护(luyang注:lock convoying,多个同优先级的线程重复竞争同一把锁,此时大量虽然被唤醒而得不到锁的线程被迫进行调度切换,这种频繁的调度切换相当影响系统性能).饥饿.不公平.data races以及其他许多并发带来的罪孽.有趣的是,在共享内存并行软件中真正承担重担的是--你猜对了--锁. 图1.1:锁:坏人还是懒汉? 这种截然不同的看法源于下面几个原因: 1. 很多因锁产生的问题大都有实

Guava - 并行编程Futures详解_java

Guava为Java并行编程Future提供了很多有用扩展,其主要接口为ListenableFuture,并借助于Futures静态扩展. 继承至Future的ListenableFuture,允许我们添加回调函数在线程运算完成时返回值或者方法执行完成立即返回. 对ListenableFuture添加回调函数: Futures.addCallback(ListenableFuture<V>, FutureCallback<V>, Executor) 其中 FutureCallbac

《深入理解并行编程》中文版

原文的下载地址:http://kernel.org/pub/linux/kernel/people/paulmck/perfbook/perfbook.html 中文版下载地址:深入理解并行编程V1.0 (4.1M) 本书是linux内核大牛paul的力作,和鲁阳同学一起,花了两个月时间进行翻译. 目前没有翻译问答部分,主要是时间不够,也担心不能将这部分翻译准确. 对内核深度发烧的同学可以看看. 本书目录 1. 简介----------------------------------- 14 1

并行编程中的内存回收Hazard Pointer

感谢同事[kevinlynx]在本站发表此文 接上篇使用RCU技术实现读写线程无锁,在没有GC机制的语言中,要实现Lock free的算法,就免不了要自己处理内存回收的问题. Hazard Pointer是另一种处理这个问题的算法,而且相比起来不但简单,功能也很强大.锁无关的数据结构与Hazard指针中讲得很好,Wikipedia Hazard pointer也描述得比较清楚,所以我这里就不讲那么细了. 一个简单的实现可以参考我的github haz_ptr.c   原理 基本原理无非也是读线程

深入理解并行编程-分割和同步设计(二)

双端队列是一种元素可以从两端插入或删除的数据结构[Knu73].据说实现一种基于锁的允许在双端队列的两端进行并发操作的方法非常困难[Gro07].本节将展示一种分割设计策略,能实现合理且简单的解决方案,请看下面的小节中的三种通用方法. 1.1. 右手锁和左手锁 图1.1:带有左手锁和右手锁的双端队列 右手锁和左手锁是一种看起来很直接的办法,为左手端的入列操作加一个左手锁,为右手端的出列操 作加一个右手锁,如图1.1所示.但是,这种办法的问题是当队列中的元素不足四个时,两个锁的范围会发生重叠.这种