From:《并行程序设计导论》
2.1.1 Von Neumann 结构
经典的Von Neumann结构包括主存,CPU,以及主存与CPU之间的互连结构。
Von Neumann瓶颈:主存与CPU之间的分离(互连结构)。
瓶颈的原因:互连结构的分离限制了指令和数据访问的速度。
2.1.2 进程、多任务以及线程
操作系统(Operating System )是一种用来管理硬件和软件资源的主要软件。
进程是运行着的程序的一个实例。当用户运行一个程序时,操作系统创建一个进程。
单核系统也可以多任务,提供对同时运行多个程序的支持。原因:每个进程只运行一个时间片(时间片是规定好的一小段时间,有几毫秒)。在一个程序执行一个时间片后,OS就切换执行其他程序。
阻塞:某一个过程停止运行以等待所需资源。一个多任务操作系统中,如果一个进程需要等待某个资源,例如需要从外部的存储器中读取数据,它会阻塞。
线程为程序员提供一种机制,将程序分为多个大致独立的任务。当某个任务阻塞时能执行其他任务。
线程包含在进程中,所有线程可以使用相同的可执行代码,共享相同的内存和相同的I/O设备。实际上,当两个线程同属于一个进程时,他们共享进程的大多数资源,两者之间最大的差异是各自需要一个私有的程序计数器和函数调用栈,使它们能够独立运行。
2.2 对Von Neumann模型的改进
介绍三种改进措施:缓存(caching)、虚拟内存、低层次并行。
2.2.1 Cache基础知识
本书中谈到Cache,一般指的是CPU cache。
CPU cache是一组相比于主存,CPU能更快速访问的内存区域。 CPU cache位于与CPU同一块的芯片或者位于其他芯片上,但比普通的内存芯片能更快地访问。
cache里存放什么样的数据:程序接下来可能会用到的指令和数据与最近访问过的指令和数据在物理上是临近存放的。在执行完一条指令后,程序通常会执行下一条指令。同样,当程序访问一个内存区域后,同城会访问物理位置靠近的下一个区域。——局部性原理。
改进1:为了利用局部性原理,系统使用更宽的互连结构来访问数据和指令。即:一次内存访问能存取一整快代码和数据。而不只是单条指令和单条数据。这些块称为高速缓存块或者高速缓存行。一个典型的高速缓存行能存储 8~16 倍单个内存区域的信息。比如一个高速缓存行可以存放16个浮点数。
CPU cache不是单一结构。cache分为不同的层(level)。第一层(L1)最小但是最快,更高层(L2,L3...)更大但是相对较慢。cache通常是用来存储速度较慢的存储器中信息的副本,可以认为低层是高层cache的cache。所以,一个变量存储在L1 cache中,也会存储在L2 cache中。但是,有些多层cache不会复制已经在其他层cache中存在的