中等规模的并发
程序设计 温绍锦
多核时代来临
?硬件的多核时代已经来临
–2007年4核,2008年8核,2010年16核,2011年32核
?硬件促使
软件发生变化
–更好的并发程序设计框架(executor、future、blockingqueue)–更易用的算法、数据结构(lock-freedatastructure)–并发程序设计将会变得简单而且逐步普及,按HerbSutter的预测,这个过程为2007年~2012年–我们幸运处于这个变革中
?旧时王谢堂前燕,飞入寻常百姓家
线程(一)
?用户线程、内核线程、轻量级进程?三种映射模型
–1:1、N:1、M:N三种映射模型–
Java线程在Windows和内核线程一对一影射(_beginthread)–Java在Linux下使用pthread实现。Phtread在
linux下有两种实现,linux2.6内核缺省使用NPTL。也是一对一影射。–Java在Solaris下使用多对多映射。(Solaris、HP-UX、True64UNIX等操作
系统本身支持M:N模型)
线程(二)
?操作系统线程标准
–POSIXThread(PThread)
?这是应用最广泛的线程库,在各个版本的unix、linux下均有实现。Linux早期的版本并不完全符合PThread标准,Linux2.6内核缺省集成NPTL,完全符合PThread标准。
–Win32和OS/2Threads
?Win32Threads提供大量线程通讯API,功能强大。
–SolarisThreads–DCEThreads
同步原语(一)
?线程特定存储
–ThreadLocal,又称为TLS、TSS、TSD等,在各
文档中名称混乱。每个线程有唯一的标识,关联线程相关的特定数据,就是线程特定存储。
?Monitor
–中文翻译为管程。synchronized、Object.wait()、Object.notify()的底层实现。但是java原生提供的monitor不完整,因为没有提供Condition,Object本身隐含提供一个Condition。
同步原语(二)
?条件变量(Condition)
–这是并发基本概念,在各种线程库中均有提供。Object对象隐含一个条件变量。–条件变量都提供三个原子操作wait、signal、br
oadcast。在java.util.concurrent.Condition中,对应的是await、signal、signalAll–wait必须在signal之前,否则会导致信号丢失的
问题 同步原语(三)
?上下文切换
–保存和恢复寄存器状态–保存和恢复线程Cache状态的开销。各线程在运行时彼此淘汰对方的cache数据。(CPU的缓存)–线程太多,会导致频繁的上下文切换,导致过多无谓的开销。–在阻塞等待的线程不参与调度,不会导致上下文切换–减少上下文开销的一个办法就是使用用户线程(纯java无法实现)。Oracle、MSSQLServer都是用用户线程,并宣称从用户线程中获得更好的性能。
同步原语(四)
?死锁
–ABA问题容易导致死锁–锁的粒度大,竞争严重,锁的粒度小,容易死锁,乃取舍问题–注意锁的顺序–需要考虑外部的锁,例如数据库的锁–死锁的解决办法
?通过协议预防死锁的发生?允许系统进入死锁状态,然后检测恢复?忽视它的存在