1.1、线程、进程、程序

1.1.1、进程与程序之间的关系

进程(process)是程序的运行实例。进程与程序之间的关系就好比播放中的视频(如《摩登时代》这部电影)与相应的视频文件(如MP4文件)之间的关系,前者从动态的角度刻画事务而后者从静态的角度刻画事物。运行一个Java程序的实质是启动一个Java虚拟机进程,也就是说一个运行的Java程序就是一个Java虚拟机进程。(Javaweb应用例外。一个Java web服务器是一个进程,它可以同时运行多个Java web应用。)

1.1.2、进程与线程之间的关系

进程 是系统进行资源分配和调度的基本单位。操作系统在进行资源分配时是把资源分配给进程的,但是CPU资源比较特殊,它是被分配到线程的,因为真正要占用CPU运行的是线程,所以也说线程是CPU分配的基本单位。

1.2、同步(Synchronous)和 异步(Asynchronous)

同步和异步通常用来形容一次方法调用。

1.3、串行(serialization)并行(Parallelism)并发(concurrency)

串行、并行、并发通常用来形容线程之间的执行方式。

1.4、阻塞blocking 和 非阻塞Non - Blocking

阻塞和非阻塞通常用来形容多线程间的相互影响。

1.5、临界区 (百度百科)

临界区指的是一个访问共用资源(例如:共用设备或是共用存储器)的程序片段,而这些共用资源又无法同时被多个线程访问的特性。当有线程进入临界区段时,其他线程或是进程必须等待(例如:bounded waiting 等待法),有一些同步的机制必须在临界区段的进入点与离开点实现,以确保这些共用资源是被互斥获得使用,例如:semaphore。只能被单一线程访问的设备,例如:打印机
每个进程中访问临界资源的那段代码称为临界区(Critical Section)(临界资源是一次仅允许一个进程使用的共享资源)。每次只准许一个进程进入临界区,进入后不允许其他进程进入。不论是硬件临界资源,还是软件临界资源,多个进程必须互斥地对它进行访问。
多个进程中涉及到同一个临界资源的临界区称为相关临界区

程序调度法则

进程进入临界区的调度原则是:
1、如果有若干进程要求进入空闲的临界区,一次仅允许一个进程进入。
2、任何时候,处于临界区内的进程不可多于一个。如已有进程进入自己的临界区,则其它所有试图进入临界区的进程必须等待。
3、进入临界区的进程要在有限时间内退出,以便其它进程能及时进入自己的临界区。
4、如果进程不能进入自己的临界区,则应让出CPU,避免进程出现“忙等”现象。

1.6、有关并行的两个重要定律

有关为什么要使用并行程序的问题前面已经讨论过。总体来说最重要的出于两个目的,第一,为了获得更好的性能;第二,由于业务模型的需要,确实需要多个执行实体。在这里更佳关注第一种性能问题。将串行程序改造为并发程序,一般来说可以提高程序的整体性能,但是究竟能提高多少,甚至说究竟是否真的可以提高,还是一个需要研究的问题。目前主要由下面两个定律进行解答

1.6.1、Amdahl定律

1.6.2、Gustafson定律

1.7、处理器缓存 和 缓存同步| 冲刷处理器缓存|刷新处理器缓存

1.7.1、处理器缓存

处理器并不是直接与主内存(RAM)打交道而执行内存的读、写操作,而是通过寄存器(Register)、高速缓存(Cache)、写缓冲器(StoreBuffer,也称为Writer Buffer)和无效化队列(Invalidate Queue)等部件执行内存的读、写操作的。从这个角度看,这些部件相当于主内存的副本,因此本书为了叙述方便将这些统称为处理器对主内存的缓存,简称处理器缓存。

1.7.2、缓存同步 | 冲刷处理器缓存 | 刷新处理器缓存

虽然一个处理器的高速缓存中的内容不能被另外一个处理器直接读取,但是一个处理器可以通过缓存一致性协议(Cache Coherence Protocol)来读取其他处理器的高速缓存中的数据,并将读的数据更新到该处理器的高速缓存中。这种一个处理器从其自身处理器缓存以外的其他存储部件中读取数据并将其更新到自身的高速缓存中的过程。称为 缓存同步(指的是高速缓存与高速缓存或主内存之间共享变量数据同步,不是指写缓冲器中的)。相应地,我们称这些存储部件的内容是可同步的,这些存储部件包括处理器的高速缓存、主内存。
缓存同步使得一个处理器(上运行的线程)可以读取到另外一个处理器(上运行的线程)对共享变量所做的更新,即保障了可见性。因此为了保障可见性,我们必须使一个处理器对共享变量所做的更新最终被写入该处理器的高速缓冲区或者主内存中(而不是始终停留在其写缓冲器中),这个过程被称为 “冲刷处理器缓存”。
(简单理解:就是将CPU处理器中的写缓冲器中的数据 刷新到高速缓存或者主内存中,这个过程称为“冲刷处理器缓存”)
并且,一个处理器在读取共享变量的时候,如果其他处理器在此之前已经更新了该变量,那么该处理器必须从其他处理器的高速缓存或者主存储器中对 相应的变量进行缓存同步。这个过程称为“刷新处理器缓存”。
(简单理解:两个处理器执行缓存同步保持数据一致,“冲刷处理器缓存”。)
因此,可见性的保障是通过使更新共享变量的处理器执行 ”冲刷处理器缓存”的动作,并使读取共享变量的处理器执行刷新处理器缓存的动作来实现的。