深入理解计算机系统 第 1 章 计算机系统漫游

一、hello 程序

1.编写程序

    #include 

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

源程序实际上就是一个由 0 和 1 组成的位(比特)序列,8个位为一组,称为字节。上述代码的 ASCII 文本如图 1 所示

深入理解计算机系统 第 1 章 计算机系统漫游_第1张图片
图 1

2.编译程序

linux> gcc -o hello hello.c

在 Unix 系统上,通过编译器驱动程序(GCC)完成源文件到目标文件的转化,这个过程分为四个阶段,执行这四个阶段的程序(预处理器 cpp 、编译器 ccl、汇编器 as、链接器 ld)一起组成了编译系统(compilation system)。翻译过程如图 2 所示

深入理解计算机系统 第 1 章 计算机系统漫游_第2张图片
图 2

  1. 预处理器阶段:cpp 根据字符 # 开头的命令读取系统头文件 stdio.h 的内容,直接插入程序文本得到 hello.i 文件。
  2. 编译阶段:ccl 将 hello.i 翻译为文本文件 hello.s,该文件中包含以一个汇编语言程序。
  3. 汇编阶段:as 将 hello.s 翻译为机器语言指令 hello.o
  4. 链接阶段:hello 程序中调用 printf 函数。ld 需要链接 printf.o 和 hello.o 并合并。

3.运行程序

通过 shell 命令行解释器运行程序

    linux> ./hello
    hello, world
    linux>

系统的硬件组成:

  1. 总线:贯穿整个系统的电子管道,携带信息字节并负责在各个部件间传递(系统总线、I/O 总线、内存总线)。
  2. I/O 设备:与外部世界的联系通道,在 I/O 总线和 I/O 设备之间传递信息,每一个 I/O 设备通过一个控制器或iu适配器与 I/O 总线相连。
  3. 主存:临时存储设备,在处理器执行程序时,用来存放程序和程序处理的数据。
  4. 处理器:CPU,用于接解释或执行存储在主存中指令的引擎,核心是一个大小为一个字的寄存器,称为程序计数器(PC)。

运行步骤:

  1. shell 将我们从键盘输入的 “./hello” 逐一读取寄存器,再放入到内存中。如图 3 所示。
深入理解计算机系统 第 1 章 计算机系统漫游_第3张图片
图 3

  1. shell 通过一系列指令加载可执行的 hello 文件,这些指令将 hello 目标文件中的代码和数据从磁盘复制到主存(直接存储器存取 DMA 技术)。如图 4 所示。
深入理解计算机系统 第 1 章 计算机系统漫游_第4张图片
图 4

  1. 处理器执行 hello 中 main 函数中的机器语言指令,这些指令将 “hello, world\n” 字符串中的字节从主存复制到寄存器中,再从寄存器复制到显示设备,最终显示在屏幕上。如图 5 所示。
深入理解计算机系统 第 1 章 计算机系统漫游_第5张图片
图 5

二、存储设备

高速缓存

当程序加载时,指令复制到主存,当处理器运行程序时,指令又从主存复制到处理器,这些类似的复制操作减慢了程序的的速度。又由于处理器与主存间的差距过大,因此系统设计者采用了更小更快的存储设备,称为高速缓存存储器(cache memory, 简称为 cache 或高速缓存)暂时存放处理器近期可能会需要的信息。

存储器层次结构如图 6 所示,从上往下,设备访问速度越来越慢、容量越来越大,每字节的造价也更便宜。寄存器在 L0,高速缓存 L1 - L3 分别位于 L1 - L3 层,主存在 L4 层。上一层的存储器作为下一层存储器的高速缓存。

深入理解计算机系统 第 1 章 计算机系统漫游_第6张图片
图 6

三、操作系统管理硬件

在运行 hello 程序时,通过操作系统来间接访问键盘、显示器、磁盘或主存。操作系统的两个基本功能:

  • 防止硬件被失控的应用程序滥用。
  • 向应用程序提供简单一致的机制来控制复杂而又大不相同的低级硬件设备。

操作系统通过进程、虚拟内存和文件的抽象来实现这两个功能。

  • 文件是对 I/O 设备的抽象表示
  • 虚拟内存是对主存和磁盘 I/O 设备的抽象表示
  • 进程是对处理器、主存和 I/O 设备的抽象表示。

进程:进程是操作系统对一个正在运行的程序的一种抽象。处理器通过快速的交错执行不同进程的指令使得看上去就像不间断地并发执行程序中的指令。

线程:一个进程可以由多个线程组成,每个线程都运行在进程的上下文中,并共享同样的代码和全局数据。

虚拟内存:虚拟内存为进程提供一个假想:每个进程都在独占地使用主存,每个进程看到的内存都是一致的。

文件:文件就是字节序列,I/O 设备、磁盘、键盘、显示器、网络等都可以看成是文件。

你可能感兴趣的:(操作系统)