1.1并发简史
早期的冯丶诺依曼型计算机的主要特点是:1.数字计算机的数制采用二进制;2.计算机应该按照程序顺序执行。之后伴随着操作系统的诞生,使得计算机每次可以运行多个程序,每个程序运行在单独的进程中。早期的分时系统中,每一个进程相当于一台虚拟的冯丶诺依曼型计算机。进程是操作系统分配资源的最小单位。
在计算机中加入操作系统实现多个程序同时执行的原因:1.资源利用率:在一个程序的等待时间,执行另一个程序;2.公平性:不同的程序对于计算机上的资源有同等的使用权;3.便利性:比如,在计算多个任务的时候,编写多个程序,之间相互通信,往往要比编写一个单独的程序实现起来要简单很多。
这些因素同样促使了线程的出现,线程会共享进程的资源,一个进程可以有多个线程,线程是cpu调度的基本单位。
1.2线程的优势
a.发挥多处理器的强大能力:多线程程序可以同时在多个处理器上运行,提高处理器资源的利用率来提升系统的吞吐率。比如,如果程序只有一个线程,那么最多只能在一个处理器上运行,在双处理器系统上,单线程的程序只能使用一半的cpu资源,而在拥有100个处理器的系统上,将有99%的资源无法使用。
b.建模的简单性:包含多种不同类型任务的程序往往比单个类型任务的程序要难以编写,多线程可以将每种类型的任务都分配一个专门的线程。
c.异步事件的简化处理:在单线程的io操作中,如果读操作阻塞,不仅意味处理请求的过程将停顿,而且对其他所有的请求处理都将停顿,所有单线程有nio。但是如果我们为每个请求分配一个线程,那么某个请求的阻塞将不会影响到其他的线程。
d.响应更灵敏的用户界面
1.3线程的风险
a.安全性问题(结果是不是我们想要的正确结果)
在没有充足同步的情况下,多个线程中的操作执行顺序是不可预测(可能有指令重排序)。这是一种常见的并发安全问题,称为竞态条件:运行结果取决于运行时对线程中操作的交替执行方式。
b.活跃性问题(线程能不能执行下去)
当某个操作无法执行下去时,就会发生活跃性问题。例如:线程a一直等待线程b释放其持有的资源,而线程b一直不释放资源,那么a将永久地等待下去。
c.性能问题(执行时间长不长)
性能问题包含多个方面,在设计良好的并发应用程序中,线程可以提升性能,但是线程也会带来开销。1)线程调度器在切换线程的时候,会频繁地出现上下文切换的操作,这种操作会带来极大的开销:保存和恢复执行上下文,丢失局部性,cpu时间花在线程调度而不是线程运行。2)当线程共享数据时,必须使用同步机制,而这些机制往往会抑制某些编译器优化,使缓存区中的数据无效,以及增加共享内存总线的同步流量。