1.1 信息就是位 + 上下文
程序的生命周期从源程序开始——这是一个有着某种扩展名(比如C源程序的文件扩展名为.c,java源程序的文件扩展名为.java,c++源程序的扩展名为.cpp等等)的文本文件。这些文本文件由一个个文本字符构成,而每个文本字符又由8个bit来构成。
数据有不同的数据对象,即不同的由bit组成的“实体”。
1.2 程序被其他程序翻译成不同的格式
为了在(操作)系统上运行程序,每条源程序上的语句都被其他程序转化为机器语言指令。然后将这些指令以可执行目标程序的格式打好包,以二进制磁盘文件的形式存储。
在UNIX系统中,从源文件到目标文件的转化由编译器驱动程序完成。以C源程序为例,这个过程有四个阶段(注意:与C/C++不同,java编译器把java源程序翻译成字节码(class文件),运行该文件时首先会运行JVM,然后class文件被加载到JVM上运行。而编译和连接一个C/C++程序时,所获得的可执行二进制文件只能在指定的硬件平台和操作系统上运行,属于“本地”执行程序):
i. C源程序的开头都有预处理命令,此命令告诉预处理器(cpp)读取源程序的头文件并把这些文件直接插入到程序文本中形成新的文本文件,并以 .i 为文件扩展名。
ii. 编译器(ccl)将上一步的文本文件翻译成新的以 .s 为文件扩展名的文本文件,它包含一个汇编语言程序(不同的cpu,与其对应的汇编语言也会有所不同)。
iii.汇编器(as)将上一步的文件翻译成机器语言指令并将其打包成可重定位目标程序,其文件的扩展名为 .o。该文件是二进制文件,字节编码由机器语言来完成,故无法用文本编辑器来正确打开。
iv.若在源程序中有涉及到标准库的函数,则链接器(ld)将这些函数的以 .o 为扩展名的目标文件合并到上一步的文件中,最终,可执行目标文件完成。这种文件可被加载到内存中,由系统执行。
1.3 了解编译系统如何工作是大有益处的
同一个结果,不同的源程序指令会有不同的程序性能。这与机器代码和编译器将各种源程序语句转化为机器代码的方式有关。
1.4 处理器读并解释存储在存储器中的命令
通常我们所说的32位、64位的字长,其实就是总线传送定长的字节块信息的长度。
编译后的可执行文件在未执行前存储在磁盘上。
RAM是主存的主要组成部分。然而RAM又分为两种:SRAM和DRAM。SRAM用传统的触发器门电路(有0和1两个状态)来保存数据,因为是通过通电来保存数据,所以不需要像电容器那样来回刷新,故其速度快,但造价高。DRAM使用电容器,当其充电时状态为1,放电时为0,但因为电容器会随时间而漏掉一部分电,需要周期性地刷新才能保存数据,所以速度稍慢,但价格便宜(此书中主存的RAM指的是DRAM)。 ——资料来源《计算机科学导论》
指令集结构描述的是每条机器代码指令的效果,而微体系结构描述的是处理器是如何被实现的。
1.5 高速缓存至关重要
根据机械原理,较大的存储设备要比较小的存储设备运行得慢,但在造价上两者是相反的。
在运行速度上,磁盘驱动器 > 内存 > 寄存器。
缓存一般内嵌在cpu中,通过存放cpu近期可能会用到的数据来对内存和cpu在处理速度上的差异进折中。其中,一级缓存运行速度可与寄存器相当,而二级缓存通过总线与处理器连接,容量比一级缓存要高出不少,但在运行速度上比一级缓存稍慢。缓存通过SRAM的硬件技术来实现。
1.7 操作系统管理硬件
应用程序对硬件的操作都必须要经过操作系统。OS有两个功能:① 防止硬件被失控的应用程序滥用;② 向应用程序提供简单一致的机制来控制复杂的低级硬件设备。
进程是OS对一个正在运行的程序的抽象。OS可同时执行多个进程,即并发运行,指的是一个进程的指令和另一个进程的指令其实是在交错执行的。而实现这种交错执行的机制称为上下文切换。何为上下文?OS跟踪进程运行时所需的所有状态信息。
单处理器系统只能在同一时刻执行一个进程的代码。在进行上下文切换时,OS保存当前进程的上下文、恢复新进程的上下文,新进程获得控制权后就能在上次停止的地方开始运行。
一个进程由多个线程组成。每个线程都在该进程的上下文下运行,共享同样的代码和全局数据,且多线程之间的数据共享比多进程之间更容易。
无法理解这个章节中所讲到的虚拟存储器的有关内容。估计得在以后的章节中探索了。
文件可囊括计算机系统的所有I/O设备。
1.9 总结
并发:系统可同时执行多个进程。
并行:用并发使系统运行得更快。
多核处理器指的是将多个CPU(“核”)集成到一个集成电路芯片上,每个核都有自己的L1和L2缓存,但是它们共享更高层次的高速缓存以及到主存的接口。
超线程(即同时多线程)是一种允许一个CPU执行多个控制流(即线程)的技术。
指令级并行:处理器可以同时执行多条指令。这就用到了流水线技术,即其将每一条指令所需的活动分成不同的步骤,将CPU里的硬件组织成一系列的阶段,每个阶段执行一个步骤。这些阶段可以并行操作,用来处理不同指令的不同部分。
超标量处理器:执行速率达到一个周期一条指令以上。
单指令、多数据并行(SIMD并行):允许一条指令产生多个可以并行执行的操作,用于提高处理影像、声音和视频数据应用的执行速度。
线程级并发、指令级并行、以及SIMD并行是在不同的抽象层次上对系统并发和并行的阐述。
应用程序接口(API)的概念不仅用在面向对象的编程语言(例如java中类的声明)上,也用在面向过程的语言(例如C语言的函数原型)上。
指令级结构是对实际处理器硬件的抽象。
抽象让底层复杂的硬件执行与源程序的执行模型保持一致。