多核多线程
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
多核多线程复习资料
1. 什么是CMP
单芯片多处理器(Chip Multiprocessors,简称CMP),将大规模并行处理器中的SMP (对称多处理器)集成到同一芯片内,各个理器并行执行不同的进程。
2 .并行计算的菲林分类
单指令流单数据流(Si ngle In struction stream Si ngle Data stream, SISD) 单指令流多数据流(Single Instruction stream Multiple Data stream, SIMD ) 多指令流单数据流( Multiple Instruction stream Single Data stream, MISD ) 多指令流多数据流( Multiple In struction stream Multiple Data stream, MIMD )
3•进程和线程的区别
进程是正在被执行的程序,是系统进行资源分配和调度的一个独立单位,是一个动态的概念。线程是程序的有序控制流,是被执行的指令序列。
线程属于进程,线程运行在进程空间内。
4•线程的特点
线程因创建而产生,因调度而处于运行状态,因等待资源或事件而处于阻塞状态。
5•分解模式
1•任务分解---园丁修理草坪2•数据分解---矩阵相乘&园丁修理草坪
3•数据流分解---园丁修理草坪
将一个复杂的过程划分成多个任务,这些任务按照某种顺序执行,这种分解方式成为数据流
分解。
---要求:理解,分析,举例
总结:任务分解下分工工作,相互配合;数据分解模式下分工明确,互不干扰;数据流分解模式下前一个工作是后一个工作开始的前提。
6 •理解处理任务之间的数据依赖关系的战略有什么?
变量本地化:最简单的解决方案就是创建,初始化,并使用局部变量
改造变量(把共享变量改造成不共享的变量)
规约:创建线程1和线程2的局部变量suml和sum2,然后suml初始化,并计算循环的奇数迭代,sum2初始化和计算循环的偶数迭代。每个线程都独立计算其迭代。在循环结束时,主线程可以组合规约变量的总和( sum1+ sum2 )。
7 •常用的同步机制
1•临界区:每个进程有一个代码段,称为临界区,在那儿共享数据被访问,在任意时刻只
允许一个线程对这些资源进行访问。
2. 信号量:包含两个操作:wait (),signal(),wait操作信号量减1,signal操作信号量加1.
3. 互斥量:线程互斥是线程之间所发生的一种间接性相互作用,这种相互作用是进程本身不希望的,也是运行线程感觉不到的。线程互斥可能发生在相关线程之间,也可能发生在不相关进程之间。互斥量(Mutex)作为一种互斥设备,有两个状态,上锁和空闲。同一时刻只能有一个线程能够对互斥量加锁。对于一个已经被加锁的互斥量,当另外一个线程试图对它
加锁时,该线程会被阻塞,直到该互斥量被释放。
4. 栅梯:所有线程必须全部完成某段代码之后才能开始下一步的同步方式操作称为barrier。栅障同步又称为等待同步。
8. 重点理解互斥量两个状态:上锁和空闲
互斥量是一种锁,线程对共享资源进行访问之前必须先获得锁,否则,线程保持等待状态,直到锁可用,只有其他线程都不占有它时,一个线程才可以占有它。占有锁的过程叫做锁定或者获得互斥量。
9. 理解死锁和活锁
如果两个线程都各自加锁了一个互斥量,然后申请加锁对方的互斥量,这样会陷入阻塞,这样的话,这两个线程永远不会从阻塞中恢复,此时,这两个线程处于死锁状态。
所谓死锁:是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待
的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。
活锁:指的是任务或者执行者没有被阻塞,由于某些条件没有满足,导致一直重复尝试,失
败,尝试,失败。活锁的发生是指线程之间不断冲突,不断退避
活锁和死锁的区别在于,处于活锁的实体是在不断的改变状态,所谓的“活”,而处于死锁的实体表现为等待;活锁有可能自行解开,死锁则不能。
10. Inter设计的并行开发流程的4个阶段
DESIGN (设计)CODE & DEBUG (编码,调试)VERIFY(验证)TUNE (调试)
理解每个Parallel studio组件对应在那个阶段使用
Design ---- A dvisor CODE & DEBUG——Composer Verify ------ In spector
TUNE ------ Amplifier
并行开发流程四个组件:设计,编码调试,检查,优化
并行开发流程的阶段:顾问,设计开发,检查,优化
11. 内核对象有线程对象,有互斥量;临界区不是内核对象。
内核对象是由操作系统内核分配的,只能由内核访问的一个内存块,用来供系统和应用程序
使用和管理各种系统资源。
内核对象包括存取符号对象、事件对象、文件对象、作业对象、互斥量、管道对象、进程对象、信标对象、线程对象和等待计数器对象等。
不同的内核对象拥有不同的数据结构。
内核对象只能被内核程序访问,应用程序无法在内存中找到这些数据结构并直接改变它们的内容。
句柄是一种指向指针的指针。Windows中的句柄实际上是一个唯一的数字,它引用一个Windows对象,例如窗口、图标等。
Windows内存管理器在移动对象在内存中的位置后,把对象新的地址告知句柄地址来保
存。这样只需记住句柄地址就可以间接知道对象具体在内存中的哪个位置。
句柄地址(稳定记载着对象在内存中的地址T对象在内存中的地址(不稳定实际对
象
Windows提供了一组函数,访问并操作内核对象。当调用一个用于创建内核对象的函数
时,该函数就返回一个用于标识该对象的句柄。
句柄可以被视为一个不透明的值,进程中的任何线程都可以使用这个值,将这个句柄传
递给Windows的各个函数,这样系统就能知道要操作哪个内核对象。
12. W IN32 多线程AP:
CreateThread closeThread waitforSi ngleobject createMutex releaseMutex En tercriticalSect ion leavecriticalSect ion
waitforSi ngleObject WaitForMultipleObjects (线程之间的等待、互斥量加锁) createMutex、releaseMutex 互斥量
EnterCriticalsection、LeaveCriticalsection 临界区
Win32线程同步的实现
全局变量(global variable )事件(Event)互斥量(Mutex)临界区(Critical section)信号量(Semaphore) 互斥量:
Mutex对象在不被任何线程拥有时才有信号,而当被拥有时则无信号。该对象适合用来
协调多个线程对共享资源的互斥访问。
1建立互斥体对象,得到句柄:
HANDLE CreateMutex(LPSECURITY_ATTRIBUTESpMutexAttributes , BOOL bInitialOwner , LPCTSTR IpName;
2在线程可能产生冲突的区域前(即访问共享资源之前) ,将互斥量句柄传给函数:WaitForSingleObject(hMutex, dwMilliseconds),请求占用互斥对象。
3共享资源访问结束,释放对互斥体对象的占用:
ReleaseMutex(hMutex);
4关闭互斥量对象句柄:
CloseHa ndle(hMutex);
互斥对象在同一时刻只能被一个线程占用。
互斥对象属于内核对象,它能够确保线程拥有对单个资源的互斥访问权。
互斥对象包含一个使用数量,一个线程ID和一个计数器。
ID用于标识系统中的哪个线程当前拥有互斥对象,计数器用于指明该线程拥有互斥对象的次数。
临界区critical_setion initialize enter leave delete
定义临界区对象,通常为全局变量,方便多个线程对其引用: