深入理解计算机系统(1.4)---并发与并行、浅谈抽象
引言
并发与并行一直是IT界炙手可热的词汇,相信各位猿友都不会陌生。在计算机系统这本书当中,对并发与并行的解释是,并发是指一个同时具有多个活动的系统,而并行则是指的用并发使得一个系统运行的更快。
这与LZ之前的理解应该是不冲突的,在LZ之前看来,并发是一种模式,而并行是实现这种模式的手段之一。
线程级并发
在进程的抽象概念下引入了线程,而线程级并发的概念,就是指的多个线程在同一时间(并非是绝对同时的)活动。
操作系统从单处理器,直到现在多核多处理器系统,乃至超线程技术,已经经历了很大的变化。这也使得针对多线程编程变得更加重要,否则就无法利用多处理器带来的好处。
针对多处理器系统来说,比较好理解,其实就是物理上将多个CPU集中在一个集成电路的芯片上。而对于超线程技术来说,则是利用N个物理内核,模拟出2N个逻辑内核的技术。在硬件上来讲,超线程需要CPU的某些部分有多个备份,比如寄存器和程序计数器,但是其它部分只有一份,比如ALU。
指令级并行
在书中,对指令级并行的解释是,如果处理器可以同时执行多条指令,则称这种属性为指令级并行。其实指令级并行就是利用了指令的执行过程中会有不同的阶段,或者更精确的说,是在同一时间只会利用部分CPU的硬件,因此可以利用这一点做到多个指令并行执行。
更好的情况下,现代的很多处理器能够做到执行一条指令的平均时间尚且不到一个周期,这种处理器就称为超标量处理器。
单指令、多数据并行
单指令、多数据的概念是指一条指令可以产生多个并行执行的操作的方式。当今的一些处理器中配备了特殊的硬件,可以达到这个效果。由于产生了多个并行执行的操作,因此就会涉及到多个数据,通俗的讲也可以理解为,一条指令操作多个数据。比如书中所提到的例子,一些处理器具有并行地对4对单精度浮点数做加法的指令。
简谈抽象
抽象的重要性就不需要再强调了,它在计算机科学领域有着不言而喻的地位。抽象可以使得一些具体的实现变的更加易于描述,而且也可以针对一些实现的方式作出规定。
举个简单的例子,就JAVA中的类来说,它其实是通过编译器和JVM来实现的,而JVM本身又是一个抽象的概念,它也会有具体的实现。倘若针对我们平时使用的hotspot虚拟机来说,类的实现是将类的信息存放在永久代,而后将实例存放在堆中,并且在每一个实例中,都会存放一个类信息的引用。从而我们在操作这个实例的时候,会通过类信息确定我们所做的操作并执行它。
以上是LZ对类实现的个人理解,对JVM不太熟悉的猿友们可能对这个描述比较迷惑。但是没关系,你只需要知道class可以声明一个类,并且在你创建了一个实例之后,使用实例名.方法名可以调用它的方法,实例名.变量名可以取得它的属性值就可以了(在此简单起见,忽略访问权限限制)。这就使得我们操作类的时候变的简单,也正是抽象的意义之一,也是上面对抽象描述的第一句话的解释。
对于后面一句就比较好理解了,JAVA虚拟机是一种抽象,有了这个抽象,我们就可以针对JAVA虚拟机制定规范,也就是JAVA虚拟机规范。
文章小结
本次我们简单了解了一下并发和并行的概念,以及抽象对于计算机科学的重要意义。
下一章LZ将和各位猿友一起进入一个崭新的世界,那里有很多1和0的数字,有很多定理与证明,因此这部分可能比较枯燥。如果LZ的解释不能让各位猿友更好的理解这本书的内容,各位猿友也可以看书中的原版内容,或者拿着书和LZ的文章对照着看都可以。不过LZ还是希望各位不要半途而废,毕竟实践虽然重要,但还是需要理论的支撑的。