.Net多线程编程—预备知识

1 基本概念

共享内存的多核架构:一个单独的封装包内封装了多个互相连接的未处理器,且所有内核都可以访问主内存。共享内存的多核系统的一些微架构,例如内核暂停功能,超频。

内核暂停功能:当使用内核不多的时候,操作系统会使剩下的内核进入休眠状态,当需要使用这些内核时,操作系统会唤醒这些睡眠的内核。

超频:提升一个内核频率的过程。当内核工作繁重时,使内核以更高的频率工作。

分布式内存系统:由多个处理器(CPU)组成,每个处理器可以位于不同的计算机上,计算机之间可以有不同类型的通信信道,并且都有自己私有的内存。

物理内核:物理内核是真正独立的处理单元。

硬件线程(逻辑内核\逻辑处理器):每个物理内核可能会提供多个逻辑内核。

软件线程(一般称作线程):程序执行流的最小单元,有时被称为轻量级进程(Lightweight Process,LWP)。每一个软件线程与其父进程分享一个私有的唯一的内存空间,但每一个软件线程有自己的栈、寄存器和私有局部存储区域。

进程:是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。Windows中每个运行的程序都是一个进程。

主线程:当一个程序启动时,就有一个进程被操作系统(OS)创建,与此同时一个线程也立刻运行,该线程通常叫做程序的主线程。一个进程至少有一个主线程。

超额申请:应用程序使用的并发线程数多于逻辑内核数时发生超额申请。

负载均衡:不同的任务分配到的工作量差不多,以便有效利用处理器资源。

负载失衡:不同的任务分配到的工作量不同,以致有些任务无事可做,没有有效地利用处理器资源。

并发:多条指令在同一时间段执行。

并行:当系统有一个以上CPU空闲可用时,两个线程互不抢占CPU资源,可以同时进行,这种方式称之为并行。

交错并发:一次执行一个线程的指令,两个线程的指令交错执行。

竞争:计算结果依赖于语句执行的顺序,而执行的顺序没有被控制或同步。

竞争条件:竞争出现的条件。

死锁:是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。

活锁:与死锁相似,不同之处在于活锁中的线程状态不断地在两个状态之间切换且线程没有被阻塞。

锁争用:多个线程竞争同一个锁。

锁封护:当多个优先级相同的线程反复争用同一个锁时会发生锁封护。与死锁和活锁的情况不同,处于锁封护中的线程仍会前进;但是线程每次企图获取锁并且失败时,它会让出剩余的调度量并强制上下文切换。

临界区:两个并行部分之间需要顺序执行的串行时间段称为临界区。

.NET Framework 4引入的TPL:.NET Framework 4引入了新的TPL(任务并行库,Task Parallel Library),使用新型轻量级并发模型。新的TPL支持数据并行,任务并行和流水线。

1)数据并行:针对大量需要处理的数据,每一份数据执行同样的操作。

2)任务并行:并发运行不同的操作。

3)流水线:数据并行与任务并行的结合体,要对多个并发的任务进行协调。

2 概念辨析

1)并发、交错并发

图1 为并发示意图,其中有两个线程,编号分别为0和1。每个线程有两个指令,0-0表示第一个线程的第一条指令,0-1表示第一个线程的第二条指令,其他依次类推。

图2 为交错并发的示意图,其中有两个线程,编号分别为0和1。每个线程有两个指令,0-0表示第一个线程的第一条指令,0-1表示第一个线程的第二条指令,其他依次类推。从图中可看出,两个线程的指令交替执行,一次只执行一条指令。

 

图1 并发

 

图2 交错并发

2)物理内核、硬件线程

Intel Core i5-3470 Processor 有四个物理内核,每个内核有一个硬件线程。

Intel Xeon Processor E7-8893 v4 有四个物理内核,每个内核有两个硬件线程。

可见一个Processor的物理内核个数不一定等于硬件线程数。

图3 Intel Core i5-3470 Processor

图4 Intel Xeon Processor E7-8893 v4

3 Amdahl法则与Gustafson法则

Amdahl法则

功能:预测多处理器系统的最大理论性能提升(加速比,speedup)

公式:最大加速比(倍数)= 1/((1-P)+(P/N))

其中:P表示能够完全并行运行的代码比例

N表示可用的计算机单元(处理器或物理内核数)

法则缺陷

只考虑了物理内核数的变化,并未考虑可以在既有应用程序中添加新功能以充分利用增加的并行处理能力。

只考虑了硬件的变化,并未考虑待处理的问题规模的变化。

未考虑并行所带来的开销。

未考虑将串行部分转换为充分利用并行化的算法。

Gustafson法则

功能:通过问题的大小来预测在固定时间内可执行的工作量

公式:工作总量(单元数)=S+N*P

其中:S表示一次顺序执行完成的工作单元数

P表示每一部分能够完全并行执行的工作单元数

N表示可用的执行单元数(处理器数或物理内核数)

法则缺陷

未考虑并行所带来的开销。

未考虑将串行部分转换为充分利用并行化的算法。

推出编程指导原则:

当程序串行部分消耗时间和问题大小有关时,调整问题大小以获得更好的加速比。

当可并行处理的数据量有限时,可添加新功能,以充分利用现代硬件的并行处理能力。

尽量减少临界区。

4.多核并行程序设计原则

(1)按照并行的方式思考

(2)使用抽象功能,充分利用.NET Framework 4中的TPL(Task Parallel Library)所提供的新功能

(3)按照任务(事情)编程,而不是按照线程(CPU内核)编程,关注任务而非底层线程

(4)设计的时候考虑关闭并发的情形,考虑程序在单核处理器也可运行

(5)避免使用锁

(6)利用为了帮助并发而设计的工具和库

(7)使用可扩展的内存分配器

(8)设计的时候要考虑随增长的工作负载而扩展

参考材料:

1)C#并行编程高级教程(中文版)(美)希拉里著,郑思遥/房佩慈译,清华大学出版社出版

2)设计模式.NET并行编程(中文版)

3)https://en.wikipedia.org/wiki/Lock_convoy

4)https://en.wikipedia.org/wiki/Deadlock#Livelock

5)https://en.wikipedia.org/wiki/Concurrent_computing

6)https://en.wikipedia.org/wiki/Parallel_computing

7)http://ark.intel.com/products/68316/Intel-Core-i5-3470-Processor-6M-Cache-up-to-3_60-GHz

8)http://ark.intel.com/products/93791/Intel-Xeon-Processor-E7-8893-v4-60M-Cache-3_20-GHz

-----------------------------------------------------------------------------------------

转载与引用请注明出处。

时间仓促,水平有限,如有不当之处,欢迎指正。

时间: 2024-10-10 17:55:36

.Net多线程编程—预备知识的相关文章

多线程编程基础知识

多线程编程基础知识 http://www.cnblogs.com/cy163/archive/2006/11/02/547428.html 当前流行的Windows操作系统能同时运行几个程序(独立运行的程序又称之为进程),对于同一个程序,它又可以分成若干个独立的执行流,我们称之为线程,线程提供了多任务处理的能力.用进程和线程的观点来研究软件是当今普遍采用的方法,进程和线程的概念的出现,对提高软件的并行性有着重要的意义.现在的大型应用软件无一不是多线程多任务处理,单线程的软件是不可想象的.因此掌握

iOS多线程编程的知识梳理

多线程编程也称之为并发编程,由于其作用大,有比较多的理论知识,因此在面试中也是受到面试官的青睐.在日常项目开发中,至少网络请求上是需要使用到多线程知识的,虽然使用第三方的框架比如AFNetworking进行网络请求比较简单,但是也是需要开发人员对多线程.block等知识有比较清晰的思路,才能在遇到问题的时候,能够有条理的找出问题并解决好. 本篇文章的定位是梳理下在iOS开发中多线程的知识,也算是一个提纲,一来可以在学习或者是回顾多线程知识时候有个导向,二来也可以作为自己对多线程知识的一个检测,看

.Net 多线程编程由浅入深知识梳理

1.Using System.Threading;     多线程就是一个包工头,让手底下的十个工人去搬砖头的事儿.     ------------不带任何传入参数的Thread2.ThreadStart ts = new ThreadStart(某线程A的Func);   Thread th = new Thread(ts);   th.Start();      public void 某线程A的Func()   {        Console.WriteLine("线程A把事情做好了!

13._C编程预备计算机专业知识

C语言编程预备知识 1.CPU 内存条 硬盘 显卡 主板 显示器  之间的关系 2.HelloWorld程序如何运行起来的 编译—>链接—>运行 3.什么是数据类型 基本类型数据 整数 整型   int   四字节 1 # include <stdio.h> 2 3 int main(void) 4 { 5 int i = 10; //表示i变量是整型变量,所谓整型变量就是指i只能存放整数. 6 7 printf("%d\n", i); 8 9 return 0

C++多线程编程入门之经典实例

多线程在编程中有相当重要的地位,我们在实际开发时或者找工作面试时总能遇到多线程的问题,对多线程的理解程度从一个侧面反映了程序员的编程水平. 其实C++语言本身并没有提供多线程机制,但Windows系统为我们提供了相关API,我们可以使用它们来进行多线程编程.本文就以实例的形式讲解多线程编程的知识. 创建线程的API函数 C++代码 HANDLE CreateThread( __in   SEC_ATTRS SecurityAttributes, __in   ULONG StackSize,  

你必须掌握的多线程编程

1.多线程编程必备知识 1.1 进程与线程的概念 当我们打开一个应用程序后,操作系统就会为该应用程序分配一个进程ID,例如打开QQ,你将在任务管理器的进程选项卡看到QQ.exe进程,如下图: 进程可以理解为一块包含了某些资源的内存区域,操作系统通过进程这一方式把它的工作划分为不同的单元.一个应用程序可以对应于多个进程. 线程是进程中的独立执行单元,对于操作系统而言,它通过调度线程来使应用程序工作,一个进程中至少包含一个线程,我们把该线程成为主线程.线程与进程之间的关系可以理解为:线程是进程的执行

浅析C++多线程编程理论与实践

写这篇博客之前,由于对多线程也不是很了解,一直觉得多线程是个很神奇的东西,但项目中又需要用到,所以借此机会学习了一下,也算做个入门总结吧,写下来总是好的!言归正传,首先介绍几个多线程相关的基本概念: 并发.并行.同步.异步.多线程的区别 1.并发:在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行.其中两种并发关系分别是同步和互斥. 2.并行:在单处理器中多道程序设计系统中,进程被交替执行,表现出一种并发的外部特征:在多处理器系统中,进程

.NET多线程编程

在.NET多线程编程这个系列我们讲一起来探讨多线程编程的各个方面.首先我将在本篇文章的开始向大家介绍多线程的有关概念以及多线程编程的基础知识;在接下来的文章中,我将逐一讲述.NET平台上多线程编程的知识,诸如System.Threading命名空间的重要类以及方法,并就一些例子程序来作说明. 引言 早期的计算硬件十分复杂,但是操作系统执行的功能确十分的简单.那个时候的操作系统在任一时间点只能执行一个任务,也就是同一时间只能执行一个程序.多个任务的执行必须得轮流执行,在系统里面进行排队等候.由于计

多线程的基础知识

多线程编程基础知识 当前流行的Windows操作系统能同时运行几个程序(独立运行的程序又称之为进程),对于同一个程序,它又可以分成若干个独立的执行流,我们称之为线程,线程提供了多任务处理的能力.用进程和线程的观点来研究软件是当今普遍采用的方法,进程和线程的概念的出现,对提高软件的并行性有着重要的意义.现在的大型应用软件无一不是多线程多任务处理,单线程的软件是不可想象的.因此掌握多线程多任务设计方法对每个程序员都是必需要掌握的.本实例针对多线程技术在应用中经常遇到的问题,如线程间的通信.同步等,分