微软用户-(编辑修改稿)内容摘要:

彼此竞争  虽设定了执行顺序,但是不能保证就按照这个顺序执行,而结果却由执行的顺序决定  是并发程序中最常见的错误(与时间有关的错误) .  数据竞争  指存储器访问冲突的情况  多个线程并发访问同一个存储单元时,至少有一个线程要改变那个单元的值,就会出现数据竞争  引发两种可能的冲突 :  读 /写冲突  写 /写冲突 多核结构与程序设计 Southeast University 东 南 大 学 29 互斥与同步  数据竞争 线程 1 线程 2 t=x x=t+1 u=x x=u+2 如果一开始 x=0,那么结束的时候 x=? 线程 1 线程 2 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 编译成 t=x。 x=t+1 隐含的数据竞争 多核结构与程序设计 Southeast University 东 南 大 学 30 互斥与同步  互斥 临界区 是代码中访问(读和写)共享变量的那部分代码 多个线程访问同一个临界区的原则: • 一次最多只能一个线程停留在临界区内 • 不能让一个线程无限地停留在临界区内,否则其他线程将不能进入该临界区 互斥 线程互斥 是指对于共享资源,在各线程访问时的排它性 举例:银行的保管箱 维护人员确保互斥 进入区 退出区 临界区 多核结构与程序设计 Southeast University 东 南 大 学 31 互斥与同步  同步 线程同步 是指线程之间所具有的一种制约关系,一个线程的执行依赖另一线程的消息,当它没有得到另一个线程的消息时应该等待,直到消息到达时才被唤醒 使用同步对象来确保互斥 : 信号量、互斥量、条件变量、读 /写锁、事件和栅障。 • 一个线程获得同步对象,其他线程必须等待 • 当获得同步对象的线程完成,释放对象,将对象给等待的线程。 举例 : 图书馆 一个顾客借了一本书 其他人必须等着书被还回来 多核结构与程序设计 Southeast University 东 南 大 学 32 互斥与同步  栅障同步 如果多个线程在继续向下执行前,需要完成各自任务并达到某个新起点,则在此点设置栅障 是用来确保在栅障之前代码段做的修改在线程要越过栅障继续执行前全部完成。 线程在栅障的地方暂停 当所有的线程到达栅障的时候,所有线程被释放继续执行 举例:跑步 多核结构与程序设计 Southeast University 东 南 大 学 33 互斥与同步  死锁 当两个线程因为互相等待被对方拥有并且不会释放的资源而被阻塞的时候,会发生死锁。 产生死锁的原因主要是: 因为系统资源不足。 进程运行推进的顺序不合适。 资源分配不当等。 死锁的四个必要条件 : 互斥条件 请求与保持条件 不可剥夺条件 循环等待条件 多核结构与程序设计 Southeast University 东 南 大 学 34 互斥与同步  死锁 死锁的预防 破坏 “互斥”条件 • 在系统里取消互斥。 但一般来说“互斥”条件是无法破坏的。 破坏“请求与保持”条件 • 不允许进程在已获得某种资源的情况下,申请其他资源。 – 创建进程时,要求它申请所需的全部资源。 – 要求每个进程提出新的资源申请前,释放它所占有的资源。 破坏“不可抢占”条件 • 允许对资源实行抢夺。 破坏“循环等待”条件 • 将系统中的所有资源统一编号,进程可在任何时刻提出资源申请,但所有申请必须按照资源的编号顺序(升序)提出。 多核结构与程序设计 Southeast University 东 南 大 学 35 互斥与同步  死锁  死锁的避免 一个进程序列 {P1,…Pn}是安全的 ,如果对于其中每一个进程Pi(1=i=n),它以后尚需要的资源量不超过系统当前剩余资源量与所有进程 Pj(ji)当前占有资源量之和 • 现有 12个资源供 3个进程共享 ,进程 P1总共需要 9个资源 ,但第一次先申请 2个。 进程 P2总共需要 10个资源 .第一次申请 5个。 进程P3总共需要 4个资源 ,第一次请求 2个, 1)这样请求后,系统安全吗。 2)如果接着 P1第二次申请 1个,能给它吗。 银行家算法 • (1)当一个顾客对资金的最大需求量不超过银行家现有的资金时就可接纳该顾客。 • (2) 顾客可以分期贷款 ,但贷款的总数不能超过最大需求量。 • (3)当银行家现有的资金不能满足顾客尚需的贷款数额时 ,对顾客的贷款可推迟支付 ,但总能使顾客在有限的时间里得到贷款。 • (4) 当顾客得到所需的全部资金后 ,一定能在有限的时间里归还所有的资金 . 多核结构与程序设计 Southeast University 东 南 大 学 36 互斥与同步  饿死  当一个线程正在等一个资源而该资源被其他线程拥有,但由于某种原因这个资源永远不能被这个线程使用的时候,发生 饥饿 (但没死锁)。 如果等待是永久的,那就是 饿死。  举例 在使用小文件优先的打印系统中一个大文件请求打印。  活锁  忙等待的时候发生的饥饿  锁的粒度  锁的粒度是上锁后保护的共享数据的多少  减小锁的粒度可以提高对共享数据访问的并行性 多核结构与程序设计 Southeast University 东 南 大 学 37 互斥与同步  同步原语 信号量 信号量可以表示为一个整数,并且被两个基本原语操。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。