第一章 计算机系统漫游
2014-10-19
预处理、编译器、汇编器和链接器 一起构成了编译系统。
汇编语言是非常有用的,因为它为不同高级语言的不同编译器提供了通用的输出语言。例如,C编译器和Fortran编译器产生的输出文件用的都是一样的汇编语言。
作为程序员,必须知道编译系统是如何工作的,因为:
- 优化程序性能
- 一个switch语句是否总是比一系列得if-then-else语句高效?
- while循环比for循环更有效么?
- 指针引用比数组索引更有效么?
- 一个函数调用的开销有多大?
- 指针引用比数组索引更有效么?
- 我们将循环就和的结果放到一个本地变量中,与将其放到一个通过引用传递过来的参数中相比,运行速度要快很多呢?
- 为什么我们只是简单地重新排列一下一个算术表达式中的括号就能让一个函数运行的更快?
- 理解链接时出现得错误
- 避免安全漏洞
- 学习安全编程的第一步就是理解数据和控制信息存储在程序栈上的方式会引起的后果。
系统的硬件组成
- 总线
总线通常被设计为传送定长的字节块,也就是字(word)。现在的大多数机器字长有的是4个字节(32位),有的是8个字节(64位)。 - I/O设备
- 主存
- 处理器
处理器的核心是一个字长的存储设备(或寄存器),称为程序计数器(PC)。在任何时刻,PC都指向主存中的某条机器语言指令(即含有该条指令的地址)。
指令集结构描述的是每条机器代码指令的效果;而微体系结构描述的是处理器实际上事如何实现的。
ALU -- 算术逻辑单元
DMA -- 直接存储器存取,数据可以不通过处理器儿直接从磁盘到达内存。
意识到高速缓存的应用程序员可以利用高速缓存将他们程序的性能提高一个数量级。
操作系统管理硬件
操作系统有两个基本功能:
- 防止硬件被失控的应用程序滥用。
- 向应用程序提供简单移植的机制来控制复杂而通常大相径庭的低级硬件设备。
操作系统通过几个基本抽象概念(进程、虚拟存储器和文件)来实现这两个功能。
文件是对I/O设备的抽象表示。
虚拟存储器是对主存和磁盘I/O设备的抽象表示。
进程则是对处理器、主存和I/O设备的抽象表示。
Posix标准涵盖了UNIX系统调用的C语言接口、外壳程序和工具、线程及网络编程。
进程--进程是计算机科学中最重要和最成功得概念之一。
进程是操作系统对一个正在运行的程序的一种抽象。
在一个系统上可以同时运行多个进程,而每个进程都好像在独占的使用硬件。
无论在单核还是在多核系统中,一个CPU看上去都像事在并发的执行多个进程,这是通过处理器在进程间切换来是实现的。操作系统实现这种交错执行的机制称为“上下文切换”。
由于网络服务器对并行处理的需求,线程成为越来越重要的编程模型,因为多线程之间比多进程之间更容易共享数据,也以为线程一般来说都比进程更高效。
虚拟存储器
虚拟存储器是一个抽象概念,它为每个进程提供了一个假象,即每个进程都在独占的使用主存。每个进程看到的是一致的存储器,称为虚拟地址空间。
在Linux中,地址空间最上面的区域是为了操作系统中的代码和数据保留的,这对所有进程来说都是一样的。p12
编译器用栈来实现函数调用。
虚拟存储器的基本思想是把一个进程虚拟存储器的内容存储在磁盘上,然后用主存作为磁盘的高速缓存。
并发和并行
并发--是一个通用的概念,指一个同时具有多个活动的系统;
并行--指的是用并发使一个系统运行的更快。并行可以在计算机系统的多个抽象层次上运行。
- 线程级并发
- 指令集并行
如果处理器可以达到比一个周期一条指令更快的执行速率,就称为超标量处理器,大多数现代处理器都支持超标量操作。 - 单指令、多数据并行