一:并行与并发:
1.“并行”是指无论从微观还是宏观,二者都是一起执行的,就好像两个人各拿一把铁锨在挖坑,一小时后,每人一个大坑。
2.而“并发”在微观上不是同时执行的,只是把时间分成若干段,使多个进程快速交替的执行,从宏观外来看,好像是这些进程都在执行,这就好像两个人用同一把铁锨,轮流挖坑,一小时后,两个人各挖一个小一点的坑,要想挖两个大一点得坑,一定会用两个小时。
3.从以上本质不难看出,“并发”执行,在多个进程存在资源冲突时,并没有从根本提高执行效率。
1.posix中,并发的定义要求:延迟调用线程的函数不应该导致其它线程的无限期延迟;
2.并发操作之间科能相互交替,导致程序相互独立的运行(一个程序不必等到另一个程序结束后运行),但是并发并不意味着操作同时执行。
3.并行的补充含义是指事情在相同的方向上同时进行(没有交错)。真正的并行只能在多处理器系统中存在,而并发可以在单处理器和多处理器系统中都存在。
并发能够在单处理器系统中存在是因为并发是并行的假象,并行要求程序能够同时执行多个操作,而并发只是要求程序假装同时执行多个操作(每个小时间片执行一个操作,多个操作轮流执行)。
1.在多处理器系统中,线程模式可以让一个进程同时执行多个独立的运算。一个运行在双CPU上的计算密集型多线程程序几乎可以获得传统的
单线程程序两倍的性能。“几乎两倍”是基于以下的事实:创建额外的线程和执行线程间的同步会带来额外的开销。这种效果通常称为“可扩展性“。
2.“可扩展性“总是随着CPU数量的增加而下降,因为可能会有更多的锁操作和内存冲突。
3.多处理器系统中的硬件必须提供同步访问内存的机制。当每个处理器有自己的数据高速缓存时,其中的数据必须与其它处理器缓存的数据以及内存中的数据保持一致。
1.线程编程模式允许程序在等待如I/O之类的阻塞操作的时候继续其它计算。这对网络服务器和客户端是有用的,也是C/S系统使用线程的主要原因。
当一个线程在等待费时的网络I/O操作的时候,该线程被阻塞,而其它线程还可以独立的运行。某些系统支持异步I/O操作,可以具有类似的好处,但
大部分UNIX类系统不提供异步I/O操作,而且异步操作通常比线程更复杂。
注:UNIX系统支持“非阻塞式I/O“:允许程序推迟I/O操作,知道它能够不被中断的完成该操作。而异步I/O:能在程序执行其它操作的同时继续I/O。
二:多线程编程模型的优点:
1.在多处理器系统中提高开发程序的并行性。除并行性这一优点需要特殊硬件支持外(多CPU),其它优点对硬件不作要求。
2.在等待慢速外设I/O操作结束的同时,程序可以执行其它计算,为程序的并发提供更有效,更自然的开发方式。
3.一种模块化编程模型,能够清晰的表达程序中独立事件间的相互关系。