东南大学成贤学院计算机系
DESCRIPTION
多核结构与程序设计. 杨全胜 http://www.njyangqs.com/. 东南大学成贤学院计算机系. 进程、线程和并行程序设计. 内容 进程的概念 什么是线程 线程的设计 互斥与同步 并行程序设计的常见问题. 进程的概念. 现代操作系统以进程的形式来加载程序 进程是程序的一次动态执行 进程是资源的拥有者 进程是一个四元组 (P,C,D,S) P- 程序代码 C- 进程控制状态 D- 进程的数据 S- 进程的执行状态 进程的特征 资源特征,包括程序执行所必需的计算资源 执行特征,包括在进程执行过程中动态改变的特征. 进程的概念. - PowerPoint PPT PresentationTRANSCRIPT
多核结构与程序设计多核结构与程序设计
Southeast University
东 南 大 学 http://www.njyangqs.com/http://www.njyangqs.com/1
东南大学成贤学院计算机系
多核结构与程序设计多核结构与程序设计杨全胜杨全胜
http://www.njyangqs.com/http://www.njyangqs.com/
http://www.njyangqs.com/http://www.njyangqs.com/
多核结构与程序设计多核结构与程序设计
Southeast University
东 南 大 学2
进程、线程和并行程序设计进程、线程和并行程序设计
内容 进程的概念进程的概念 什么是线程什么是线程 线程的设计线程的设计 互斥与同步互斥与同步 并行程序设计的常见问题并行程序设计的常见问题
http://www.njyangqs.com/http://www.njyangqs.com/
多核结构与程序设计多核结构与程序设计
Southeast University
东 南 大 学3
进程的概念进程的概念 现代操作系统以进程的形式来加载程序
进程是程序的一次动态执行进程是程序的一次动态执行 进程是资源的拥有者进程是资源的拥有者
进程是一个四元组 (P,C,D,S) P-P- 程序代码程序代码 C-C- 进程控制状态进程控制状态 D-D- 进程的数据进程的数据 S-S- 进程的执行状态进程的执行状态
进程的特征 资源特征,包括程序执行所必需的计算资源资源特征,包括程序执行所必需的计算资源 执行特征,包括在进程执行过程中动态改变的特征执行特征,包括在进程执行过程中动态改变的特征
http://www.njyangqs.com/http://www.njyangqs.com/
多核结构与程序设计多核结构与程序设计
Southeast University
东 南 大 学4
进程的概念进程的概念 进程的状态
非存在状态
就绪状态
运行状态退出状态
挂起状态
http://www.njyangqs.com/http://www.njyangqs.com/
多核结构与程序设计多核结构与程序设计
Southeast University
东 南 大 学5
进程的概念进程的概念 进程间的通信
现代操作系统提供基本的系统调用函数,允许位于同现代操作系统提供基本的系统调用函数,允许位于同一台处理机或不同处理机的多个进程之间相互交流信一台处理机或不同处理机的多个进程之间相互交流信息息
表现形式表现形式 通信通信 同步同步 聚集(归约)聚集(归约)
实现方法实现方法 在共享存储模式下,通信可以通过操作系统读在共享存储模式下,通信可以通过操作系统读 // 写共享写共享
缓存来实现。缓存来实现。 在分布式存储模式下,通信要依赖网络。在分布式存储模式下,通信要依赖网络。
http://www.njyangqs.com/http://www.njyangqs.com/
多核结构与程序设计多核结构与程序设计
Southeast University
东 南 大 学6
进程、线程和并行程序设计进程、线程和并行程序设计
内容 进程的概念进程的概念 什么是线程什么是线程 线程的设计线程的设计 互斥与同步互斥与同步 并行程序设计的常见问题并行程序设计的常见问题
http://www.njyangqs.com/http://www.njyangqs.com/
多核结构与程序设计多核结构与程序设计
Southeast University
东 南 大 学7
什么是线程什么是线程 进程 (process) 与线程
(thread) 进程不适合细粒度的共享存储进程不适合细粒度的共享存储
并行程序设计并行程序设计 一个进程有一个主线程来初始一个进程有一个主线程来初始
化进程和开始执行指令。化进程和开始执行指令。 线程能在进程内创建其他线线程能在进程内创建其他线
程程 每个线程有它自己的堆栈每个线程有它自己的堆栈 进程内的所有的线程共享代进程内的所有的线程共享代
码和数据段码和数据段
http://www.njyangqs.com/http://www.njyangqs.com/
多核结构与程序设计多核结构与程序设计
Southeast University
东 南 大 学8
什么是线程什么是线程 线程是进程上下文中执行的代码序列,又称为轻量级
的进程。它是操作系统能够调度的最小单元它是操作系统能够调度的最小单元 进程中可以只有一个线程串行执行,也可以是多个线
程共享资源下并行执行。CODE DATA FILE
REG STACK
thread
CODE DATA FILE
REG
STACK
REG
STACK
REG
STACK
thread
http://www.njyangqs.com/http://www.njyangqs.com/
多核结构与程序设计多核结构与程序设计
Southeast University
东 南 大 学9
什么是线程什么是线程 使用线程优于进程的地方
创建一个线程比创建一个进程的代价要小创建一个线程比创建一个进程的代价要小 线程的切换比进程间的切换代价小 线程的切换比进程间的切换代价小 多线程可以充分利用多处理器 多线程可以充分利用多处理器 数据共享 数据共享
数据共享使得线程之间的通信比进程间的通信更高效 数据共享使得线程之间的通信比进程间的通信更高效 快速响应特性 快速响应特性
在系统繁忙的情况下,进程通过独立的线程及时响应用在系统繁忙的情况下,进程通过独立的线程及时响应用户的输入 户的输入
http://www.njyangqs.com/http://www.njyangqs.com/
多核结构与程序设计多核结构与程序设计
Southeast University
东 南 大 学10
什么是线程什么是线程 线程级别
用户级线程用户级线程 有关线程的所有管理工作都由在用户级实现的线有关线程的所有管理工作都由在用户级实现的线
程库来支持程库来支持 因操作系统调度进程而被同时调度因操作系统调度进程而被同时调度 由线程由线程 APIAPI 来创建和管理,无需内核参与,操来创建和管理,无需内核参与,操
作更快作更快•OpenMP, Pthreads, Windows thread API
进程中的所有线程将共享相同的时间片进程中的所有线程将共享相同的时间片 当一个线程被挂起,同一进程中的其他线程也会当一个线程被挂起,同一进程中的其他线程也会
被挂起,因此并行性不高被挂起,因此并行性不高
http://www.njyangqs.com/http://www.njyangqs.com/
多核结构与程序设计多核结构与程序设计
Southeast University
东 南 大 学11
什么是线程什么是线程 线程的级别
内核级线程内核级线程 内核级线程由操作系统内核调度与管理内核级线程由操作系统内核调度与管理 并行度高并行度高
• 当一个线程被挂起,同一进程的其他线程依然可以运行。
• 在进程中的不同内核线程能够运行在不同的 CPU或核中。
内核创建和管理内核级线程的代价高,但好于对进内核创建和管理内核级线程的代价高,但好于对进程的代价程的代价
http://www.njyangqs.com/http://www.njyangqs.com/
多核结构与程序设计多核结构与程序设计
Southeast University
东 南 大 学12
什么是线程什么是线程 线程的级别
硬件级线程硬件级线程 由硬件来调度由硬件来调度 SMT: SMT: 同时多线程同时多线程
•超线程技术 (intel的HT)•UltraSPARC (SUN)
CMT: CMT: 芯片多线程芯片多线程• 芯片多进程 + 多线程• 也许是简单核,但是多线程
– 多核多核– 众核众核
http://www.njyangqs.com/http://www.njyangqs.com/
多核结构与程序设计多核结构与程序设计
Southeast University
东 南 大 学
什么是线程什么是线程 多线程的映射模型
对于实现了用户级线程和内核级线程的操作系统,用对于实现了用户级线程和内核级线程的操作系统,用户级线程和内核级线程之间的可以有不同的映射方式户级线程和内核级线程之间的可以有不同的映射方式
多对一模型多对一模型把多个用户级线程映射到一个内核级线程把多个用户级线程映射到一个内核级线程 线程的管理在用户空间实现,所以效率高。线程的管理在用户空间实现,所以效率高。 当一个线程因调用系统调用被阻塞时,整个进程被阻塞当一个线程因调用系统调用被阻塞时,整个进程被阻塞
一对一模型一对一模型把每个用户级线程影射到一个内核级线程。把每个用户级线程影射到一个内核级线程。 当一个线程阻塞时,其他线程仍然可以运行。当一个线程阻塞时,其他线程仍然可以运行。
多对多模型多对多模型将将 mm 个用户级线程影射到个用户级线程影射到 nn 个内核级线程,个内核级线程, m≥nm≥n 用户可以创建所需要的用户级线程,通过分配适当数目用户可以创建所需要的用户级线程,通过分配适当数目
的内核级线程获得并发执行的优势并节省系统资源。的内核级线程获得并发执行的优势并节省系统资源。13
http://www.njyangqs.com/http://www.njyangqs.com/
多核结构与程序设计多核结构与程序设计
Southeast University
东 南 大 学
什么是线程什么是线程 线程的生命周期
线程的标识线程的标识 通常用一个整数来标识一个线程 通常用一个整数来标识一个线程
线程的创建线程的创建 自动创建从自动创建从mainmain 函数开始的主线程函数开始的主线程 调用函数库接口创建一个新的线程调用函数库接口创建一个新的线程
(pthread_create)(pthread_create) 线程的终止线程的终止
执行完毕,或者调用了执行完毕,或者调用了 pthread_exit pthread_exit 主线程退出导致整个进程会终止 主线程退出导致整个进程会终止
14
http://www.njyangqs.com/http://www.njyangqs.com/
多核结构与程序设计多核结构与程序设计
Southeast University
东 南 大 学
什么是线程什么是线程 线程的状态
就绪(就绪( readyready ):线程等待可用的处理器。):线程等待可用的处理器。 运行(运行( runningrunning ):线程正在被执行。):线程正在被执行。 阻塞(阻塞( blockedblocked ):线程正在等待某个事件的发):线程正在等待某个事件的发生(比如生(比如 I/OI/O 的完成,试图加锁一个被上锁的互的完成,试图加锁一个被上锁的互斥量)。斥量)。
终止(终止( terminatedterminated ):线程从起始函数中返回):线程从起始函数中返回或者调用或者调用 pthread_exitpthread_exit 。。
15
http://www.njyangqs.com/http://www.njyangqs.com/
多核结构与程序设计多核结构与程序设计
Southeast University
东 南 大 学
什么是线程什么是线程 线程状态的变迁
16
终止
运行
阻塞
就绪
调度
条件满足 等待资源切换
被创建
完成
http://www.njyangqs.com/http://www.njyangqs.com/
多核结构与程序设计多核结构与程序设计
Southeast University
东 南 大 学17
进程、线程和并行程序设计进程、线程和并行程序设计
内容 进程的概念进程的概念 什么是线程什么是线程 线程的设计线程的设计 互斥与同步互斥与同步 并行程序设计的常见问题并行程序设计的常见问题
http://www.njyangqs.com/http://www.njyangqs.com/
多核结构与程序设计多核结构与程序设计
Southeast University
东 南 大 学18
线程的设计线程的设计
为了功能而线程化 为了性能而线程化
为了节省周转时间而线程化为了节省周转时间而线程化 为了吞吐量提高而线程化为了吞吐量提高而线程化
分解工作 任务分解任务分解 数据分解数据分解
开发应用程序的时候进行线程化的最佳时机是设计阶段开发应用程序的时候进行线程化的最佳时机是设计阶段
http://www.njyangqs.com/http://www.njyangqs.com/
多核结构与程序设计多核结构与程序设计
Southeast University
东 南 大 学19
线程的设计线程的设计 为功能而线程化
分配不同的线程来完成应用程序的不同功能分配不同的线程来完成应用程序的不同功能这是最容易的方法,因为功能重叠的机会很罕见。这是最容易的方法,因为功能重叠的机会很罕见。 在一个应用程序中控制并发功能的执行是比较容易在一个应用程序中控制并发功能的执行是比较容易
的。的。即使在计算间没有直接的影响,功能之间的依赖性即使在计算间没有直接的影响,功能之间的依赖性还会维持。还会维持。
http://www.njyangqs.com/http://www.njyangqs.com/
多核结构与程序设计多核结构与程序设计
Southeast University
东 南 大 学20
线程的设计线程的设计 为功能而线程化
举例举例 :: 为了简化代码,为下列部分设计不同的线程为了简化代码,为下列部分设计不同的线程
• 输入、图形用户界面、计算和输出。 考虑在建一个房屋中的不同的人:考虑在建一个房屋中的不同的人:
•泥瓦匠 , 木匠 , 盖屋顶的人 , 水暖工和油漆匠。
http://www.njyangqs.com/http://www.njyangqs.com/
多核结构与程序设计多核结构与程序设计
Southeast University
东 南 大 学21
线程的设计线程的设计 为性能而线程化
通过将执行在并行环境下的大量的计算分解开来通过将执行在并行环境下的大量的计算分解开来进行应用程序的并行化,能够提高计算的性能。进行应用程序的并行化,能够提高计算的性能。
线程化是为了改善周转周期和吞吐量线程化是为了改善周转周期和吞吐量 比如:比如:
搜索太空实验室碎片搜索太空实验室碎片•把全部搜索区域分成多个分段,并安排一个工人去搜索一个分段
http://www.njyangqs.com/http://www.njyangqs.com/
多核结构与程序设计多核结构与程序设计
Southeast University
东 南 大 学22
线程的设计线程的设计 为缩短周转周期而线程化
用可能的最小的时间完成一个任务用可能的最小的时间完成一个任务 举例:安排一个饭桌时候的不同任务:举例:安排一个饭桌时候的不同任务:
一个侍者摆放盘子。一个侍者摆放盘子。 一个侍者折叠和放置餐巾。一个侍者折叠和放置餐巾。 一个侍者摆放花和蜡烛。一个侍者摆放花和蜡烛。 一个侍者摆放器皿一个侍者摆放器皿
•汤匙、刀子和叉子 一个侍者放玻璃杯一个侍者放玻璃杯
http://www.njyangqs.com/http://www.njyangqs.com/
多核结构与程序设计多核结构与程序设计
Southeast University
东 南 大 学23
线程的设计线程的设计 为了吞吐量而线程化
在固定的时间内完成最多的任务在固定的时间内完成最多的任务 举例:安排一个饭局时候的不同任务:举例:安排一个饭局时候的不同任务:
对多个侍者的安排:对多个侍者的安排:• 每个桌子安排一个侍者。• 一个侍者能摆放所有桌子的所有盘子;另一个可以摆放所有的玻璃杯;以此类推。
http://www.njyangqs.com/http://www.njyangqs.com/
多核结构与程序设计多核结构与程序设计
Southeast University
东 南 大 学24
线程的设计线程的设计 任务分解(客户 /服务器编程模式) 数据分解(工作组编程模式) 数据流分解(流水线编程模式)
分解 设计 评论
任务分解 不同的工作安排不同的线程
常见于有几个独立的功能的应用
数据分解 多个线程针对数据的不同部分执行相同的操作
常见于音频处理、图像处理和科学计算程序中
数据流分解 一个线程的输出是第二个线程的输入
特别注意需要消除启动和关闭延迟的情况
http://www.njyangqs.com/http://www.njyangqs.com/
多核结构与程序设计多核结构与程序设计
Southeast University
东 南 大 学25
线程的设计线程的设计 线程化的好处 :
提高性能提高性能 能够使用多核处理器能够使用多核处理器 线程共享数据会比较快,因为他们共享相同地址空线程共享数据会比较快,因为他们共享相同地址空
间。间。 在多核处理器中使用多线程,你可以用更少的时间在多核处理器中使用多线程,你可以用更少的时间完成更多的任务。完成更多的任务。
更好的资源利用更好的资源利用 线程甚至可以减少单核处理器的延迟。线程甚至可以减少单核处理器的延迟。
有效的数据共享有效的数据共享 使用共享存储来共享数据使用共享存储来共享数据
http://www.njyangqs.com/http://www.njyangqs.com/
多核结构与程序设计多核结构与程序设计
Southeast University
东 南 大 学26
线程的设计线程的设计 使用线程的难点
数据竞争数据竞争 死锁死锁 代码复杂性代码复杂性 可移植性问题可移植性问题 测试和调试的难度测试和调试的难度
http://www.njyangqs.com/http://www.njyangqs.com/
多核结构与程序设计多核结构与程序设计
Southeast University
东 南 大 学27
进程、线程和并行程序设计进程、线程和并行程序设计
内容 进程的概念进程的概念 什么是线程什么是线程 线程的设计线程的设计 互斥与同步互斥与同步 并行程序设计的常见问题并行程序设计的常见问题
http://www.njyangqs.com/http://www.njyangqs.com/
多核结构与程序设计多核结构与程序设计
Southeast University
东 南 大 学28
互斥与同步互斥与同步 竞争条件
为了使用共享资源,线程彼此竞争为了使用共享资源,线程彼此竞争 虽设定了执行顺序,但是不能保证就按照这个顺序执行,虽设定了执行顺序,但是不能保证就按照这个顺序执行,
而结果却由执行的顺序决定而结果却由执行的顺序决定 是并发程序中最常见的错误(与时间有关的错误)是并发程序中最常见的错误(与时间有关的错误) . .
数据竞争 指存储器访问冲突的情况指存储器访问冲突的情况 多个线程并发访问同一个存储单元时,至少有一个线程要多个线程并发访问同一个存储单元时,至少有一个线程要
改变那个单元的值,就会出现数据竞争改变那个单元的值,就会出现数据竞争 引发两种可能的冲突 :
读读 // 写冲突写冲突 写写 // 写冲突写冲突
http://www.njyangqs.com/http://www.njyangqs.com/
多核结构与程序设计多核结构与程序设计
Southeast University
东 南 大 学29
互斥与同步互斥与同步 数据竞争
线程线程 11 线程线程 22
t=xx=t+1
u=xx=u+2
如果一开始如果一开始 x=0x=0 ,那么,那么结束的时候结束的时候 x=?x=?
线程线程 11 线程线程 22
x+=1 x+=2
a[i]+=1 a[j]+=1
*p+=1 *q+=1
Foo(1) Foo(2)add [edi],1
add [edi],2
注意注意 : x+=1 : x+=1 编译成编译成t=x; x=t+1t=x; x=t+1
隐含的数据竞争
http://www.njyangqs.com/http://www.njyangqs.com/
多核结构与程序设计多核结构与程序设计
Southeast University
东 南 大 学30
互斥与同步互斥与同步 互斥
临界区临界区 是代码中访问(读和写)共享变量的那部分代码是代码中访问(读和写)共享变量的那部分代码 多个线程访问同一个临界区的原则:多个线程访问同一个临界区的原则:
• 一次最多只能一个线程停留在临界区内• 不能让一个线程无限地停留在临界区内,否则其他线程
将不能进入该临界区 互斥互斥
线程互斥线程互斥是指对于共享资源,在各线程访问时的排是指对于共享资源,在各线程访问时的排它性它性
举例:银行的保管箱举例:银行的保管箱维护人员确保互斥维护人员确保互斥
进入区
退出区
临界区
http://www.njyangqs.com/http://www.njyangqs.com/
多核结构与程序设计多核结构与程序设计
Southeast University
东 南 大 学31
互斥与同步互斥与同步 同步
线程同步线程同步是指线程之间所具有的一种制约关系,一个是指线程之间所具有的一种制约关系,一个线程的执行依赖另一线程的消息,当它没有得到另一线程的执行依赖另一线程的消息,当它没有得到另一个线程的消息时应该等待,直到消息到达时才被唤醒个线程的消息时应该等待,直到消息到达时才被唤醒
使用同步对象来确保互斥使用同步对象来确保互斥 :: 信号量、互斥量、条件变量、读信号量、互斥量、条件变量、读 // 写锁、事件和栅障。写锁、事件和栅障。
• 一个线程获得同步对象,其他线程必须等待• 当获得同步对象的线程完成,释放对象,将对象给等待
的线程。 举例举例 : : 图书馆图书馆
一个顾客借了一本书一个顾客借了一本书 其他人必须等着书被还回来其他人必须等着书被还回来
http://www.njyangqs.com/http://www.njyangqs.com/
多核结构与程序设计多核结构与程序设计
Southeast University
东 南 大 学32
互斥与同步互斥与同步 栅障同步
如果多个线程在继续向下执行前,需要完成各自如果多个线程在继续向下执行前,需要完成各自任务并达到某个新起点,则在此点设置栅障任务并达到某个新起点,则在此点设置栅障
是用来确保在栅障之前代码段做的修改在线程要是用来确保在栅障之前代码段做的修改在线程要越过栅障继续执行前全部完成。越过栅障继续执行前全部完成。
线程在栅障的地方暂停线程在栅障的地方暂停 当所有的线程到达栅障的时候,所有线程被释放继当所有的线程到达栅障的时候,所有线程被释放继续执行续执行
举例:跑步举例:跑步
http://www.njyangqs.com/http://www.njyangqs.com/
多核结构与程序设计多核结构与程序设计
Southeast University
东 南 大 学33
互斥与同步互斥与同步 死锁
当两个线程因为互相等待被对方拥有并且不会释当两个线程因为互相等待被对方拥有并且不会释放的资源而被阻塞的时候,会发生死锁。放的资源而被阻塞的时候,会发生死锁。
产生死锁的原因主要是:产生死锁的原因主要是: 因为系统资源不足。因为系统资源不足。 进程运行推进的顺序不合适。进程运行推进的顺序不合适。 资源分配不当等。资源分配不当等。
死锁的四个必要条件死锁的四个必要条件 : : 互斥条件互斥条件请求与保持条件请求与保持条件 不可剥夺条件不可剥夺条件循环等待条件循环等待条件
http://www.njyangqs.com/http://www.njyangqs.com/
多核结构与程序设计多核结构与程序设计
Southeast University
东 南 大 学34
互斥与同步互斥与同步 死锁
死锁的预防死锁的预防破坏破坏“互斥”条件 “互斥”条件
• 在系统里取消互斥。但一般来说“互斥”条件是无法破坏的。
破坏“请求与保持”条件 破坏“请求与保持”条件 • 不允许进程在已获得某种资源的情况下,申请其他资源。
– 创建进程时,要求它申请所需的全部资源。 创建进程时,要求它申请所需的全部资源。 – 要求每个进程提出新的资源申请前,释放它所占有的资源。要求每个进程提出新的资源申请前,释放它所占有的资源。
破坏“不可抢占”条件 破坏“不可抢占”条件 • 允许对资源实行抢夺。
破坏“循环等待”条件 破坏“循环等待”条件 • 将系统中的所有资源统一编号,进程可在任何时刻提出资
源申请,但所有申请必须按照资源的编号顺序(升序)提出。
http://www.njyangqs.com/http://www.njyangqs.com/
多核结构与程序设计多核结构与程序设计
Southeast University
东 南 大 学35
互斥与同步互斥与同步 死锁
死锁的避免死锁的避免 一个进程序列一个进程序列 {P1,…Pn}{P1,…Pn} 是安全的是安全的 ,, 如果对于其中每一个进如果对于其中每一个进程程 Pi(1<=i<=n),Pi(1<=i<=n), 它以后尚需要的资源量不超过系统当前剩它以后尚需要的资源量不超过系统当前剩余资源量与所有进程余资源量与所有进程 Pj(j<i)Pj(j<i) 当前占有资源量之和当前占有资源量之和
• 现有 12 个资源供 3 个进程共享 ,进程 P1总共需要 9 个资源 ,但第一次先申请 2 个 ; 进程 P2总共需要 10 个资源 .第一次申请 5个 ; 进程 P3总共需要 4 个资源 ,第一次请求 2 个, 1 )这样请求后,系统安全吗?2 )如果接着 P1第二次申请 1 个,能给它吗?
银行家算法银行家算法• (1) 当一个顾客对资金的最大需求量不超过银行家现有的资金时就
可接纳该顾客 ;• (2) 顾客可以分期贷款 ,但贷款的总数不能超过最大需求量 ;• (3) 当银行家现有的资金不能满足顾客尚需的贷款数额时 ,对顾客
的贷款可推迟支付 ,但总能使顾客在有限的时间里得到贷款 ;• (4) 当顾客得到所需的全部资金后 ,一定能在有限的时间里归还所
有的资金 .
http://www.njyangqs.com/http://www.njyangqs.com/
多核结构与程序设计多核结构与程序设计
Southeast University
东 南 大 学36
互斥与同步互斥与同步 饿死
当一个线程正在等一个资源而该资源被其他线程拥有,但当一个线程正在等一个资源而该资源被其他线程拥有,但由于某种原因这个资源永远不能被这个线程使用的时候,由于某种原因这个资源永远不能被这个线程使用的时候,发生发生饥饿饥饿(但没死锁)。如果等待是永久的,那就是(但没死锁)。如果等待是永久的,那就是饿死饿死。。
举例举例 在使用小文件优先的打印系统中一个大文件请求打印。在使用小文件优先的打印系统中一个大文件请求打印。
活锁 忙等待的时候发生的饥饿忙等待的时候发生的饥饿
锁的粒度 锁的粒度是上锁后保护的共享数据的多少 锁的粒度是上锁后保护的共享数据的多少 减小锁的粒度可以提高对共享数据访问的并行性减小锁的粒度可以提高对共享数据访问的并行性
http://www.njyangqs.com/http://www.njyangqs.com/
多核结构与程序设计多核结构与程序设计
Southeast University
东 南 大 学37
互斥与同步互斥与同步 同步原语
信号量信号量 信号量可以表示为一个整数,并且被两个基本原语操作信号量可以表示为一个整数,并且被两个基本原语操作
所界定所界定 ::• P: Proberen ,意味着测试。
– 如果信号量的值大于如果信号量的值大于 00 ,, PP 操作把信号量的值减操作把信号量的值减 11 并返并返回;如果当前信号量的值为非正数则回;如果当前信号量的值为非正数则 PP 会等待。会等待。
• V: Verhogen ,意味着增加– VV 操作对信号量的值加操作对信号量的值加 11 ,并唤醒那些等待的进线程,并唤醒那些等待的进线程
信号量的物理含义信号量的物理含义• 当信号量 S.value>0 时,表示有 S.value 个可用资源• 当信号量 S.value=0 时,表示所有资源被用,但无线
程等待• 当信号量 S.value<0 时,表示所有资源被用,且还有 |
S.value| 个线程在等待资源
P(mutex); P(mutex); sum++;sum++;V(mutex);V(mutex);
P(S) { // P 操作的定义 S.value--; if(S.value<0) { 加本线程到 S.L; Block(); }}
V(S) { //V 操作的定义 S.value++; if(S.value<=0) { 从 S.L 中删除某线程P; Wakeup(P); }}
http://www.njyangqs.com/http://www.njyangqs.com/
多核结构与程序设计多核结构与程序设计
Southeast University
东 南 大 学38
互斥与同步互斥与同步 同步原语
信号量信号量 信号量用于互斥信号量用于互斥
• 一个单向的独木桥,一次只能走一个人,若用进程表示每个人,用 P 、 V 操作给出各人的过桥过程
• 一个售票厅只能容纳 300人,当少于 300人时可以进入,否则,需在外等候,若将每一个购票者作为一个进程,请用 P 、 V 操作表示该购票过程。
http://www.njyangqs.com/http://www.njyangqs.com/
多核结构与程序设计多核结构与程序设计
Southeast University
东 南 大 学39
互斥与同步互斥与同步 同步原语
信号量信号量 信号量用于同步信号量用于同步
•生产者 -消费者问题(缓冲区为空,消费者不能再消费,缓冲区为满,生产者不能再生产)
– 一个生产者,一个消费者,公用一个缓冲区一个生产者,一个消费者,公用一个缓冲区– 一个生产者,一个消费者,公用一个生产者,一个消费者,公用 nn 个环形缓冲区个环形缓冲区– 多个生产者,多个消费者,公用多个生产者,多个消费者,公用 nn 个环形缓冲区个环形缓冲区
•桌上有一空盘,允许存放一只水果。爸爸可向盘中放苹果或者桔子,儿子专等吃盘中的桔子,女儿专等吃盘中的苹果。规定当盘空时一次只能放一只水果供吃者取用,请用 P 、 V 操作实现爸爸、儿子、女儿三个并发进程的同步。
http://www.njyangqs.com/http://www.njyangqs.com/
多核结构与程序设计多核结构与程序设计
Southeast University
东 南 大 学40
互斥与同步互斥与同步 同步原语
互斥量(锁)互斥量(锁)锁类似于信号量,但在一个实例中只有一个线程能锁类似于信号量,但在一个实例中只有一个线程能
操作锁。也就是说锁实际上是特殊的信号量,其资操作锁。也就是说锁实际上是特殊的信号量,其资源只有源只有 11 个。个。
锁上的两个基本的原子操作锁上的两个基本的原子操作 ::•Acquire()或 lock(): 以原子形式等待锁状态到“开锁”,等到后进临界区操作,并设置锁状态为“上锁”。
•Release()或 unlock(): 以原子状态改变锁状态从“上锁”到“开锁”。
Thread AThread A…………mutex lock(); mutex lock(); sum=sun+1;sum=sun+1;mutex unlock();mutex unlock();
Thread BThread B…………mutex lock(); mutex lock(); sum=sun*2;sum=sun*2;mutex unlock();mutex unlock();
http://www.njyangqs.com/http://www.njyangqs.com/
多核结构与程序设计多核结构与程序设计
Southeast University
东 南 大 学
互斥与同步互斥与同步 同步原语
事件事件事件事件 (Event)(Event)是是WIN32WIN32 提供的最灵活的线程间提供的最灵活的线程间
同步方式。同步方式。事件存在两种状态:事件存在两种状态:
•激发状态 (signaled or true)•未激发状态 (unsignal or false)
事件可分为两类:事件可分为两类:•人工重置:这种对象只能用程序来手动设置,在需
要该事件或者事件发生时,采用 SetEvent及ResetEvent 来进行设置。
• 自动重置:一旦事件发生并被处理后,自动恢复到没有事件状态,不需要再次设置。
41
http://www.njyangqs.com/http://www.njyangqs.com/
多核结构与程序设计多核结构与程序设计
Southeast University
东 南 大 学42
进程、线程和并行程序设计进程、线程和并行程序设计
内容 进程的概念进程的概念 什么是线程什么是线程 线程的设计线程的设计 互斥与同步互斥与同步 并行程序设计的常见问题并行程序设计的常见问题
http://www.njyangqs.com/http://www.njyangqs.com/
多核结构与程序设计多核结构与程序设计
Southeast University
东 南 大 学43
并行程序设计的常见问题并行程序设计的常见问题 更多的线程意味着更高的性能吗?
Penti um D 3. 0GHZ *221. 156
10. 8437
10. 8177
10. 8177
10. 87
10. 89
10. 979
0
5
10
15
20
25
1 2 4 8 10 20 50线程数
秒Penti um Dual - core 2160 1. 8GHZ *2
22. 484
11. 359
11. 546
12. 062
11. 803
11. 453
11. 609
0
5
10
15
20
25
1 2 4 8 10 20 50
线程数
秒Xeon 5110 1. 60GHZ *2 *2
29. 703
6. 25 6. 359 6. 562 6. 312
24. 781
6. 40614. 657 6. 25 6. 359 6. 562 6. 312
24. 781
6. 406
0
5
10
15
20
25
30
35
1 2 4 8 10 20 50
线程数
秒Xeon E5310 1. 60GHZ *4 *2
24. 76524. 765
12. 734
3. 6563. 9534. 0463. 75
12. 703
3. 6563. 9534. 0463. 756. 39
12. 703
0
5
10
15
20
25
30
1 2 4 8 10 20 50
线程数
秒
http://www.njyangqs.com/http://www.njyangqs.com/
多核结构与程序设计多核结构与程序设计
Southeast University
东 南 大 学44
并行程序设计的常见问题并行程序设计的常见问题 更多的线程意味着更高的性能吗?
原因原因 :: 线程启动和终止的代价掩盖了有用的工作线程启动和终止的代价掩盖了有用的工作 共享固有硬件资源的开销共享固有硬件资源的开销
•频繁切换进程或线程容易引起 Cache颠簸• 切换线程本身有代价
有用的尝试有用的尝试 运行的线程数量最好低于等于硬件线程数运行的线程数量最好低于等于硬件线程数用用 OpenMPOpenMP 来做工作来做工作 使用线程池使用线程池任务窃取任务窃取
http://www.njyangqs.com/http://www.njyangqs.com/
多核结构与程序设计多核结构与程序设计
Southeast University
东 南 大 学45
并行程序设计的常见问题并行程序设计的常见问题 竞争激烈的锁
优先级倒置优先级倒置如果不是资源抢占式优先级,则有可能一个低优先级的如果不是资源抢占式优先级,则有可能一个低优先级的
线程占用了锁,而高优先级的线程等待并可能错过临界线程占用了锁,而高优先级的线程等待并可能错过临界期限。期限。
优先级倒置的解决办法优先级倒置的解决办法• 优先级继承• 优先级顶置
竞争激烈的锁的解决方法竞争激烈的锁的解决方法 资源复制资源复制 将资源分区,并用一个独立的锁来保护每个分区将资源分区,并用一个独立的锁来保护每个分区
• 细粒度锁 读者读者 -- 写者锁写者锁
• 同一时刻只有一个写者可以获得锁,但多个读者可以同时获得锁,注意可能造成写者被饿死
http://www.njyangqs.com/http://www.njyangqs.com/
多核结构与程序设计多核结构与程序设计
Southeast University
东 南 大 学46
并行程序设计的常见问题并行程序设计的常见问题 非阻塞算法
非阻塞算法具有的特征非阻塞算法具有的特征 无阻塞:只要没竞争,线程就可以持续执行无阻塞:只要没竞争,线程就可以持续执行 无锁:系统整体持续执行无锁:系统整体持续执行 无等待:每个线程都可以持续执行,哪怕遇到竞争无等待:每个线程都可以持续执行,哪怕遇到竞争
比较并交换比较并交换 CASCAS 原语操作原语操作
• 内存位置 V•预期原值 A•新值 B
Public class NonblockingCounter { private AtomicInteger Value; Public int getValue() {return value.get()}; public int increment() { int v; do {
v=value.get(); } while(!value.compareAndSet(v,v+1)); return v+1; }}
http://www.njyangqs.com/http://www.njyangqs.com/
多核结构与程序设计多核结构与程序设计
Southeast University
东 南 大 学47
并行程序设计的常见问题并行程序设计的常见问题 非阻塞算法
ABAABA 问题问题 CASCAS 原语操作的时候,如果有一个线程将该数字原语操作的时候,如果有一个线程将该数字从从 AA 改到改到 BB 又改回又改回 AA ,其他线程可能就感知不到,其他线程可能就感知不到这一变化,从而引起混乱。这一变化,从而引起混乱。
不要重用不要重用 AA• 可以利用加值的版本号等方法来解决
CacheCache 行乒乓效应行乒乓效应 由于由于 cachecache 行没有锁,所以多核线程使用同一行行没有锁,所以多核线程使用同一行
的话会引起强烈颠簸的话会引起强烈颠簸
http://www.njyangqs.com/http://www.njyangqs.com/
多核结构与程序设计多核结构与程序设计
Southeast University
东 南 大 学48
并行程序设计的常见问题并行程序设计的常见问题 非阻塞算法
内存回收问题内存回收问题 比如比如 CC 语言的一个线程在回收一个指针的时候不知语言的一个线程在回收一个指针的时候不知道是否有别的线程在用(因为没有锁)道是否有别的线程在用(因为没有锁)
一些建议一些建议直接使用原子增和原子减一般来说是安全的直接使用原子增和原子减一般来说是安全的 对链状结构构造非阻塞算法要使用公认正确的算法对链状结构构造非阻塞算法要使用公认正确的算法
http://www.njyangqs.com/http://www.njyangqs.com/
多核结构与程序设计多核结构与程序设计
Southeast University
东 南 大 学
并行程序设计的常见问题并行程序设计的常见问题 可重入函数
一个函数可能会被多个执行流并发访问,因此该函数需要一个函数可能会被多个执行流并发访问,因此该函数需要是可重入的。是可重入的。
一个可重入函数在执行中一个可重入函数在执行中不使用静态数据不使用静态数据,,不返回指不返回指向静态数据的指针向静态数据的指针。所有使用到的数据都有函数的调。所有使用到的数据都有函数的调用者提供。用者提供。
对于返回指向静态数据的指针的非可重入函数的改造对于返回指向静态数据的指针的非可重入函数的改造•返回指向动态分配空间的指针,调用者负责释放资源,
函数的参数不用修改,但这样不安全,所以不推荐。• 使用由调用者提供的存储空间(推荐使用),要修改函
数的参数 在连续的调用之间(由函数)保存信息的改造在连续的调用之间(由函数)保存信息的改造
• 由调用者负责保存49
http://www.njyangqs.com/http://www.njyangqs.com/
多核结构与程序设计多核结构与程序设计
Southeast University
东 南 大 学
并行程序设计的常见问题并行程序设计的常见问题 可重入函数
50
char *strtoupper(char *string){ static char buffer[MAX_STRING_SIZE]; int index; for(index=0;string[index];index++) buffer[index]=toupper(string[index]); buffer[index]=0; return buffer;}
char *strtoupper_r( char *in_str, char *out_str ){ int index; for(index=0;in_str[index];index++) out_str[index]=toupper(in_str[index]); out_str[index]=0; return out_str;}
不可重入函数
可重入函数
http://www.njyangqs.com/http://www.njyangqs.com/
多核结构与程序设计多核结构与程序设计
Southeast University
东 南 大 学
并行程序设计的常见问题并行程序设计的常见问题 线程安全的函数与函数库
一个线程安全的函数一个线程安全的函数通过加锁的方式通过加锁的方式来实现多线程对来实现多线程对共享数据的安全访问共享数据的安全访问
为共享资源加锁为共享资源加锁 使用非线程安全函数库的解决方法使用非线程安全函数库的解决方法
• 使用作用于整个函数库的锁,在每次使用该函数库的时候加锁
• 使用作用于单个库组件或是一组组件的锁•在Windows 下,要动态链接线程安全版本的运行库,
就需要使用编译选项 /MD ,如果要调试程序,编译选项是 /MDd
51
http://www.njyangqs.com/http://www.njyangqs.com/
多核结构与程序设计多核结构与程序设计
Southeast University
东 南 大 学52
并行程序设计的常见问题并行程序设计的常见问题 内存问题
带宽带宽 使用更紧密的压缩(使用更紧密的压缩( packpack )数据)数据
• 使用整数时,根据实际情况选择够用且长度最短的整数类型
• 用一位表示一个布尔值减少核间移动数据的频繁度减少核间移动数据的频繁度
CacheCache 的利用的利用 最小化数据移动最小化数据移动
•Cache遗忘分块技术 -将整个问题递归地划分成更小的子问题,最终每个子问题变的非常小能够放到cache 中。
重组代码的顺序重组代码的顺序
http://www.njyangqs.com/http://www.njyangqs.com/
多核结构与程序设计多核结构与程序设计
Southeast University
东 南 大 学53
并行程序设计的常见问题并行程序设计的常见问题 Cache 相关的问题
伪共享(多个核操作同一伪共享(多个核操作同一 CacheCache 行的不同部分)行的不同部分) CacheCache 行乒乓效用带来较低的性能行乒乓效用带来较低的性能 解决办法解决办法
•尽可能采用专用数据• 利用编译器的优化功能来制定存储数据的边界对齐
存储一致性(对存储器操作的顺序要确定)存储一致性(对存储器操作的顺序要确定) 对同步变量的访问满足一致性要求对同步变量的访问满足一致性要求 对同步变量的访问,只有在以前的写操作在各处都对同步变量的访问,只有在以前的写操作在各处都完成之后才能完成完成之后才能完成
对数据的读或写,只有在以前的对同步变量的操作对数据的读或写,只有在以前的对同步变量的操作完成之后才能完成完成之后才能完成