同步通常是使用硬件提供的有关同步指令通过用户级软课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《同步通常是使用硬件提供的有关同步指令通过用户级软课件.ppt》由用户(晟晟文业)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 同步 通常 使用 硬件 提供 有关 指令 通过 用户 课件
- 资源描述:
-
1、7.5 同 步 通常是使用硬件提供的有关同步指令,通过用户级软件例程建立的。7.5.1 基本硬件原语 在多处理器同步中,主要功能是一组能自动读出后并进行写存储单元的硬件原语。它们能够自动读修改单元。通常情况下,用户不直接使用基本的硬件原语,原语主要供系统程序员用来编制同步库函数。第章 多处理机 功能:将一个存储单元的值和一个寄存器的值 进行交换。建立一个锁,锁值为“0”表示开锁,为“1”表示上锁。处理器加锁时,将对应于该锁的存储单元的值 交换为某个寄存器的值“1”。如果返回值为“0”,存储单元的值此时已置换为“1”,防止了别的进 程竞争该锁。实现同步的关键:操作的原子性1.典型操作:原子交换(
2、atomic exchange)7.5 同 步2.测试并置定(test_and_set)先测试一个值,如果符合条件则修改其值。先测试一个值,如果符合条件则修改其值。3.读取并加1(fetch_and_increment)它返回存储单元的值并自动增加该值。它返回存储单元的值并自动增加该值。4.使用指令对q LL(load linked LL(load linked或或load locked)load locked)的取指令的取指令q SC(store conditional)SC(store conditional)的特殊存指令的特殊存指令7.5 同 步例例实现对由实现对由R1R1指出的存储单元
3、进行原子交换操作指出的存储单元进行原子交换操作 try try:mov R3,R4 mov R3,R4 ;送交换值;送交换值 ll R2,0(R1)ll R2,0(R1);load linkedload linked sc R3,0(R1)sc R3,0(R1);store conditionalstore conditional beqz R3,try beqz R3,try ;存失败转移;存失败转移 mov R4,R2 mov R4,R2 ;将取的值送往;将取的值送往R4R4 最终最终R4R4和由和由R1R1指向的单元值进行原子交换,在指向的单元值进行原子交换,在llll和和scsc之间如
4、有别的处理器插入并修改了存储单元的值,之间如有别的处理器插入并修改了存储单元的值,scsc将返回将返回“0”“0”并存入并存入R3R3中,从而使指令序列再重新循环。中,从而使指令序列再重新循环。7.5 同 步 llsc机制的一个优点:可用来构造别的同步原语 例如:例如:原子的原子的fetch-and-incrementfetch-and-increment try try:ll R2,0(R1)ll R2,0(R1);load linkedload linked addi R2,R2,addi R2,R2,1 1 ;增加;增加 sc R2,0(R1)sc R2,0(R1);store cond
5、itionalstore conditional beqz R2,try beqz R2,try ;存失败转移;存失败转移 指令对的实现必须跟踪地址 由由llll指令指定一个寄存器,该寄存器存放着一个指令指定一个寄存器,该寄存器存放着一个 单元地址,这个寄存器常称为单元地址,这个寄存器常称为连接寄存器连接寄存器。7.5 同 步7.5.2 用一致性实现锁 采用多处理机的一致性机制来实现旋转锁。旋转锁 处理器环绕一个锁不停地旋转而请求获得该锁。处理器环绕一个锁不停地旋转而请求获得该锁。1.无Cache一致性机制 在存储器中保存锁变量,处理器可以不断地通在存储器中保存锁变量,处理器可以不断地通 过一
6、个原子操作请求加锁,比如先交换,再测试返过一个原子操作请求加锁,比如先交换,再测试返 回值从而知道锁的状况。释放锁的时候,处理器可回值从而知道锁的状况。释放锁的时候,处理器可 简单地将锁置为简单地将锁置为“0”“0”。7.5 同 步 li R2 li R2,1 1lockitlockit:exch R2,0(R1)exch R2,0(R1);原子交换;原子交换 bnez R2 bnez R2,lockit lockit ;是否已加锁;是否已加锁?2.机器支持Cache一致性 将锁缓冲进入将锁缓冲进入CacheCache,并通过一致性机制使锁值保,并通过一致性机制使锁值保 持一致。持一致。7.5
7、 同 步 优点q 可使可使“环绕环绕”的进程对本地的进程对本地CacheCache块进行操作;块进行操作;q 可利用锁访问的局部性,即处理器最近使用过可利用锁访问的局部性,即处理器最近使用过 的锁不久又会使用。的锁不久又会使用。改进旋转锁(获得第一条好处)使其环绕过程仅对本地Cache中锁的拷贝进行读,直到它返回“0”确认锁可用,然后再进行加锁交换操 作。使用锁完毕后新竞争又开始进行。7.5 同 步 lockitlockit:lw R2lw R2,0(R1)0(R1);取锁值;取锁值 bnez R2 bnez R2,lockit lockit ;锁不可用;锁不可用 li R2 li R2,1
8、1 ;存入锁值;存入锁值 exch R2 exch R2,0(R1)0(R1);交换;交换 bnez R2 bnez R2,lockit ;lockit ;如锁不为如锁不为0 0转移转移 上面给出了对于三个处理器竞争锁的操作。一旦上面给出了对于三个处理器竞争锁的操作。一旦处理器存入处理器存入“0”“0”释放锁,所有别的释放锁,所有别的CacheCache对应块均被对应块均被作废,必须取新的值来更新它们锁的拷贝。作废,必须取新的值来更新它们锁的拷贝。一个处理器一个处理器CacheCache会先获得未加锁值并执行交换会先获得未加锁值并执行交换操作,当别的操作,当别的CacheCache失效处理完后
9、,它们会发现已被失效处理完后,它们会发现已被加锁,所以又必须不停地测试环绕。加锁,所以又必须不停地测试环绕。7.5 同 步表表7.5 7.5 三个处理机对锁的使用三个处理机对锁的使用步骤步骤 处理器处理器P0处理器处理器P1处理器处理器P2锁状态锁状态总线总线/目录操作目录操作1占有锁占有锁环绕测试环绕测试lock=0环绕测试环绕测试lock=0Shared无无2将锁置为将锁置为0(收到作废命令)(收到作废命令)(收到作废命令收到作废命令)ExclusiveP0发锁变量作废消息发锁变量作废消息3 Cache失效失效Cache失效失效Shared总线总线/目录处理目录处理P2 Cache失效失效
10、,锁从锁从P0写回写回4 总线总线/目录忙则等目录忙则等待待Lock=0SharedP2 Cache失效处理失效处理5 Lock=0执行交换,导执行交换,导致致 Cache失效失效SharedP1Cache失效处理失效处理6 执行交换,导致执行交换,导致 Cache失效失效 交换完毕,返交换完毕,返回回0置置lock=1Exclusive总线总线/目录处理目录处理P2 Cache失效失效,发作废消息发作废消息7 交换完毕,返回交换完毕,返回1进入关键处理进入关键处理段段Shared总线总线/目录处理目录处理P2 Cache失效,写回失效,写回8 环绕测试环绕测试lock=0 无无7.5 同 步
11、 llsc原语的另一个状态:读写操作明显分开。Ll不产生总线数据传送,这使下面代码与使用经不产生总线数据传送,这使下面代码与使用经 过优化交换的代码具有相同的特点:过优化交换的代码具有相同的特点:lockit lockit:ll R2 ll R2,0(R1)0(R1);load-linked bnez R2 bnez R2,lockit lockit ;锁无效;锁无效 li R2,li R2,,1 1 ;加锁值;加锁值 sc R2 sc R2,0(R1)0(R1);存;存 beqz R2 beqz R2,lockit lockit ;如存失败转移;如存失败转移 第一个分支形成环绕的循环体,第二
12、个分支解决了两第一个分支形成环绕的循环体,第二个分支解决了两个同时请求锁的处理器竞争问题。尽管旋转锁机制简单并个同时请求锁的处理器竞争问题。尽管旋转锁机制简单并且具有强制性,但难以将它扩展到处理器数量很多的情况。且具有强制性,但难以将它扩展到处理器数量很多的情况。7.5 同 步7.5.3 同步性能问题q 简单旋转锁不能很好地适应可伸缩性。大规模机器 中所有的处理器会产生出大量的竞争问题。例例7.37.3:设总线上有设总线上有1010个处理器同时准备对同一个处理器同时准备对同一变量加锁。假设每个总线事务处理变量加锁。假设每个总线事务处理(读失效或写失效读失效或写失效)是是100100个时钟周期,
13、忽略实际的个时钟周期,忽略实际的CacheCache块锁的读写时间块锁的读写时间以及加锁的时间,求以及加锁的时间,求1010个处理器请求加锁所需的总线个处理器请求加锁所需的总线事务数目。设时间为事务数目。设时间为0 0时锁已释放并且所有处理器在时锁已释放并且所有处理器在旋转,求处理这旋转,求处理这1010个请求时间为多长个请求时间为多长?假设总线在新假设总线在新的请求到达之前已服务完挂起的所有请求,并且处理的请求到达之前已服务完挂起的所有请求,并且处理器速度相同。器速度相同。7.5 同 步解解 当当i i个处理器竞争锁的时候,他们完成下列操个处理器竞争锁的时候,他们完成下列操作序列,每一个操作
14、产生一个总线事务:作序列,每一个操作产生一个总线事务:访问该锁的访问该锁的i i个个LLLL指令操作;指令操作;试图锁住该锁的试图锁住该锁的i i个个SCSC指令操作;指令操作;1 1个释放锁的存操作指令。个释放锁的存操作指令。因此对因此对n n个处理器,总线事务的总和为:个处理器,总线事务的总和为:n n (2i+1)=n(n+1)+n=n2+2n (2i+1)=n(n+1)+n=n2+2n i=1 i=1对于对于1010个处理器有个处理器有120120个总线事务,需要个总线事务,需要1200012000个时个时钟周期。钟周期。7.5 同 步 本例中本例中问题的根源问题的根源是锁的竞争、存储
15、器中锁访问是锁的竞争、存储器中锁访问的串行性以及总线访问的延迟。的串行性以及总线访问的延迟。旋转锁的旋转锁的主要优点主要优点:对于总线或网络开销较低对于总线或网络开销较低7.5 同 步q 并行循环的程序中另一个常用的同步操作:栅栏 栅栏强制所有到达的进程进行等待,直到全部的栅栏强制所有到达的进程进行等待,直到全部的 进程到达栅栏,然后释放全部的进程,从而形成同步。进程到达栅栏,然后释放全部的进程,从而形成同步。栅栏的典型实现 用两个旋转锁用两个旋转锁 (1)(1)用来记录到达栅栏的进程数用来记录到达栅栏的进程数 (2)(2)用来封锁进程直至最后一个进程到达栅栏用来封锁进程直至最后一个进程到达栅
16、栏 栅栏的实现要不停地探测指定的变量,栅栏的实现要不停地探测指定的变量,直到它满足规定的条件。直到它满足规定的条件。一种典型的实现,其中lock和unlock提供基本的 旋转锁,total是要到达栅栏的进程总数。7.5 同 步Lock(counterlock)Lock(counterlock);*确保更新的原子性确保更新的原子性*if(count=0)release=0if(count=0)release=0;*第一个进程则重置第一个进程则重置releaserelease*count=count+1count=count+1;*到达进程记数到达进程记数*unlock(counterlock)u
17、nlock(counterlock);*释放锁释放锁*if(count=total)if(count=total)*进程全部到达进程全部到达*count=0 count=0;*重置计数器重置计数器*release=1 release=1;*释放进程释放进程*else else *还有进程未到达还有进程未到达*spin(release=1)spin(release=1);*等待别的进程到达等待别的进程到达*7.5 同 步 对对counterlockcounterlock加锁保证增量操作的原子性,变加锁保证增量操作的原子性,变 量量 count count记录着已到达栅栏的进程数,变量记录着已到达
18、栅栏的进程数,变量 release release用来封锁进程直到最后一个进程到达栅栏。用来封锁进程直到最后一个进程到达栅栏。实际情况中会出现的问题 可能反复使用一个栅栏,栅栏释放的进程运行可能反复使用一个栅栏,栅栏释放的进程运行 一段后又会再次返回栅栏,这样有可能出现某个进一段后又会再次返回栅栏,这样有可能出现某个进 程永远离不开栅栏的状况程永远离不开栅栏的状况(它停在旋转操作上它停在旋转操作上)。7.5 同 步 例如:例如:OSOS调度进程,可能一个进程速度较快,调度进程,可能一个进程速度较快,当它第二次到达栅栏时,第一次的进程还挂在栅栏当它第二次到达栅栏时,第一次的进程还挂在栅栏中未能离
19、开。这样所有的进程在这个栅栏的第二次中未能离开。这样所有的进程在这个栅栏的第二次使用中都处于无限等待状态,因为进程的数目永达使用中都处于无限等待状态,因为进程的数目永达不到不到totaltotal。7.5 同 步q 一种解决方法一种解决方法 当进程离开栅栏时进行计数,在上次栅栏使用中当进程离开栅栏时进行计数,在上次栅栏使用中 的所有进程离开之前不允许任何进程重用并初始化本的所有进程离开之前不允许任何进程重用并初始化本 栅栏。栅栏。q 另一种解决办法另一种解决办法 sense_reversingsense_reversing栅栏,每个进程均使用一个私栅栏,每个进程均使用一个私 有变量有变量loc
展开阅读全文