深入理解计算机系统笔记
深入理解计算机系统
计算机系统漫游
计算机系统是由硬件和系统软件组成的,它们共同工作来运行应用程序。
信息
信息就是位+上下文
程序实际上就是一个由值0和1组成的位序列,其中8个位被组成一组,称为字节(Byte),每个字节表示程序中的某些文本字符。
-
大部分现代计算机系统都使用ASCII标准表示文本字符,这种方式实际上就是用一个唯一的单字节大小的整数值来表示每个字符。
-
通常来说,文件分为两类,只有
ASCII字符构成的文件称为_文本文件,所有其他文件都称为二进制文件_(包括图片、音视频等)
Hello,World!程序生命周期
对于一个hello.c程序:
#include <stdio.h>
int main() {
printf(“Hello,World!”);
return 0;
}
为了hello.c程序能够在系统上运行,每条C语句都必须被其他程序转化为一系列的低级机器语言指令,然后这些指令按照一种称为_可执行目标程序_的格式打好包,并以二进制磁盘文件的形式存放起来。目标程序也可以称为可执行目标。
在Unix系统上,源文件到目标文件的转化是由编译器驱动程序完成的:
gcc -o hello hello.c
此时,GCC编译器通过四个阶段将源文件hello.c 翻译成可执行目标文件hello,执行这四个阶段的程序(预处理器、编译器、汇编器和链接器)一起构成了编译系统(compilation system)。

- 编译阶段,
hello.s包含的即为汇编语言程序
系统的硬件组成

-
总线
-
贯穿整个系统的一组电子管道被称作总线。
-
总线携带信息字节并负责在各个部件间传递
-
总线通常被设计称传送定长的字节快,也就是字(word)
-
字中的字节数(即字长)是一个基本的系统总数(32位操作系统为4个字节,64位操作系统为8个字节)
-
-
I/O设备
-
I/O(输入/输出)设备是系统与外部世界的联系通道。
-
包括键盘、鼠标、显示器、磁盘等。
-
每个I/O设备都通过一个控制器或适配器与I/O总线相连。
-
适配器和控制器的功能是在I/O总线和I/O设备之间传递信息。
-
-
主存
-
主存(内存的一部分)是一个临时存储设备,在处理器执行程序时,用来存放程序和程序处理的数据。
-
物理上,主存是由一组**动态随机存取存储器(DRAM)**芯片组成的。
-
逻辑上,存储器是一个线性的字节数组,每个字节都有其唯一的地址(数组索引),这些地址是从零开始的。
-
-
处理器(CPU)
-
中央处理单元(CPU)简称处理器,是解释(或执行)存储在主存中指令的引擎。
-
处理器的核心是一个大小为一个字的存储设备(或寄存器),称为程序计数器(PC)。
-
在任何时刻,PC都指向主存中的某条机器语言指令(即含有该条指令的地址)。
-
寄存器文件(register file) 是一个很小的存储设备,由一些**单个字长的寄存器(register)**组成。
-
每个寄存器都有唯一的名字。
-
**算术/逻辑单元(ALU)**计算新的数据和地址值。
-
高速缓存
主存的工作效率远低于CPU的工作效率,这会导致性能瓶颈,为了减小这种瓶颈,设计了更小更快的存储设备高速缓存存储器(cache memory,简称为cache或高速缓存)。
高速缓存作为暂时的集结区域,存放处理近期可能会需要的信息。
高速缓存使用一种叫做**静态随机访问存储器(SRAM)**的硬件技术实现的。

计算机系统中的存储设备都被组织成了一个存储器层次结构。
存储器层次结构的主要思想是上一层的存储器作为低一层存储器的高速缓存。
硬件管理
操作系统是应用程序和硬件之间插入的一层软件,所有应用程序对硬件的操作尝试都必须通过操作系统。
操作系统功能
操作系统有两个基本功能:
-
防止硬件被失控的应用程序滥用。
-
向应用程序提供简单一致的机制来控制复杂而又通常大不相同的低级硬件设备。
操作系统通过几个基本的**抽象概念(进程、虚拟内存和文件)**来实现这两个功能。
.png)
文件是对I/O设备的抽象表示,虚拟内存是对主存和磁盘I/O设备的抽象表示,进程则是对处理器、主存和I/O设备的抽象表示。
同时,我们再增加一个新的抽象:虚拟机提供对整个计算机的抽象,包括操作系统、处理器和程序。
进程
进程是操作系统对一个正在运行的程序的一种抽象。
- 并发运行:指一个进程的指令和另一个进程的指令交错执行。
从一个进程到另一个进程的转换是由操作系统内核(kernel)管理的,内核是操作系统代码常驻主存的部分。
-
内核工作机制: 当应用程序需要操作系统的某些操作时,他就执行一条特殊的系统调用(system call)指令,将控制权传递给内核,然后内核执行被请求的操作并返回应用程序。
-
内核不是一个独立的进程,相反,它是系统管理全部进程所用代码和数据结构的集合。

- 线程: 一个进程实际上可以由多个称为线程的执行单元组成,每个线程都运行在进程的上下文中,并共享同样的代码和全局数据。
虚拟内存
虚拟内存是一个抽象概念,它为每个进程提供了一个假象,即每个进程都在独立地使用主存。
- 每个进程看到的内存都是一致的,称为虚拟地址空间。

- 图中的地址是从下往上增大的。