本博客由个人对于 深入理解计算机系统(第三版) 一书的学习笔记整理而成
挺乱的,也挺简略,毕竟整理笔记也挺麻烦的(

计算机系统漫游

先看一段代码:

#include<stdio.h>

int main()
{
	printf("Hello, world\n");
	return 0;
}

让我们看看这段程序的组成,以及它是如何运行的

程序组成

深入理解计算机系统-学习笔记 (1)_机器语言

可以看到,这段程序是以字节序列的方式存储在文件中的,每个字节都有一个整数值,对应某些字符,这就是ASCII码

只由ASCII码组成的文件称为文本文件,其余文件称为二进制文件

程序编译过程

像hello.c这样的高级语言写出来的程序,虽然能让人看懂,但却无法在系统上直接运行。为了能让系统也读懂这段代码,需要对该代码进行多次转换

深入理解计算机系统-学习笔记 (1)_主存_02

  1. 预处理阶段

    预处理器(cpp)根据以字符#开头的命令,修改原始的C程序,主要是将读取的系统头文件stdio.h中的内容插入到程序文本中。所得的另一个C程序以.i作为文件扩展名

  2. 编译阶段

    编译器(cll)将hello.i程序翻译为汇编语言,翻译后的文件以.s作为文件扩展名。这里只放出main函数的汇编语言:

    汇编语言为不同的高级语言的不同编译器提供了通用的输出语言

  3. 汇编阶段

    汇编器(as)将hello.s程序翻译为机器语言指令,并将其打包成可重定位目标程序的格式,并将结果保存在hello.o中。这是一个二进制文件

  4. 链接阶段

    因为hello程序中调用了printf函数,这是标准C语言库中的一个函数,存在与一个名为printf.o的单独的预编译好了的文件中。为了调用此函数,就必须将这个文件以某种方式合并到我们的程序中,链接器(ld)就负责处理这种合并。最终得到的hello文件,就是一个可执行文件,可以被加载到内存中,由系统使用

系统的硬件组成

深入理解计算机系统-学习笔记 (1)_机器语言_03

  1. 总线

    贯穿整个系统的一组点句子管道,携带信息字节并负责在各个部位间传递。通常被设计为传送定长的字节块

  2. I/O 设备

    I/O(输入/输出)设备时系统与外部世界的联系通道,如作为输入设备的键盘鼠标,作为输出设备的显示器等。通过控制器与适配器与I/O总线相连

  3. 主存

    一个临时存储设备,用于存放程序和程序处理的数据

  4. 处理器

    中央处理单元(CPU)简称处理器,是解释(或执行)存储在主存中指令的引擎

    处理器的核心是一个大小为一个字的存储设备(或寄存器),称为程序计数器(PC)。PC会一直指向主存中的某条机器语言指令,并进行执行

    CPU执行指令的过程围绕着主存,寄存器文件(register file)和算术/逻辑单元(ALU)进行。寄存器文件是一个小的存储设备,由一些单个字长的寄存器组成,且每个寄存器都有唯一的名字。ALU则计算新的数据和地址值

    CPU大致能够执行以下一些操作:

    • 加载:从主存复制一个字节或者一个字到寄存器,覆盖寄存器原来的内容
    • 存储:从寄存器复制一个字节或者一个字到主存中的某个位置,覆盖该位置上原本的内容
    • 操作:把两个寄存器的内容复制到ALU,ALU对这两个字做算术运算 ,并将结果存放到一个寄存器中
    • 跳转:从指令本身中抽取一个字,将这个字辅助到PC中,覆盖PC原本的值

    等等

程序运行过程

接下来我们看看hello程序在运行过程中都发生了什么:

若我们要在Unix系统中执行hello程序,就需要将程序的文件名输入到一个名为shell的应用程序中

我们在键盘上输入"./hello"字符串后,shell程序将字符逐一读入寄存器,再将其存放到内存中

深入理解计算机系统-学习笔记 (1)_数据_04

当我们敲下回车键时,shell程序就知道我们已经结束了命令的输入,shell会执行一系列指令加载可执行的hello文件。这些指令将hello目标文件中的代码和数据从磁盘复制到主存。这里利用了直接存储器存取(DMA)技术,让数据可以不通过处理器而直接从磁盘到主存

深入理解计算机系统-学习笔记 (1)_机器语言_05

目标文件hello中的代码和数据被加载到主存后,处理器就开始执行hello程序的main函数中的机器语言指令。这些指令将"hello, world\n"字符串中的字节从主存复制到寄存器文件,再从寄存器文件中复制到显示设备,最终显示在屏幕上

深入理解计算机系统-学习笔记 (1)_机器语言_06

抽象

文件是对I/O设备的抽象,虚拟内存是对主存和I/O设备的抽象,进程是对处理器,主存和I/O设备的抽象

进程

程序运行时系统看上去总是只有这个程序在运行,就好像这个程序独占了CPU,主存和I/O设备。但运行程序的数量总比CPU数量多,这是由上下文切换实现的

在任何一个时刻,单处理器系统都只能执行一个进程的代码。当操作系统决定要吧控制权从当前进程转移到新进程时,就会发生上下文切换。CPU会不断切换正在执行的进程,给人CPU在并发地执行多个进程的感觉

线程

现代系统中,一个进程可以由多个称为线程的执行单元组成。每个线程都运行在进程的上下文中,并共享代码和全局数据

虚拟内存

虚拟内存提供了一个假象:每个进程都在独占地使用主存。每个进程看到的内存都是一致的,称为虚拟地址空间
每个进程看到的虚拟地址空间都由大量准确定义的区构成,每个区都有专门的功能。
深入理解计算机系统-学习笔记 (1)_机器语言_07

文件

文件就是字节序列,每个I/O设备,包括磁盘,键盘,显示器,甚至网络,都可以看成是文件。

文件向应用程序提供了一个统一的视图,来让程序可以在使用不同磁盘技术的不同系统上运行