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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010772289/article/details/83628706

第1章 计算机系统漫游

1. 信息

源程序是由0和1组成的位(bit)序列,8个位组成一个字节。大部分现代系统都用ASCII标准来表示文本字符。

  • 文本文件
  • 二进制文件

2. 编译过程

为运行hello.c程序,每条C语句都需要转化为一系列低级机器语言指令。这些指令按照可执行目标程序的格式打好包,并以二进制磁盘文件的形式存放,目标程序也称为可执行目标文件。

unix> gcc -o hello hello.c
编译系统包括四个阶段:

  • 预处理阶段:如hello.c中#include <stdio.h>命令告诉预处理器读取系统头文件stdio.h的内容,并将它直接插入到程序文本中
  • 编译阶段:编译器将文本文件hello.i翻译成文本文件hello.s,它包含一个汇编语言程序。
  • 汇编阶段:汇编器将hello.s翻译成机器语言指令,把这些程玲打包在可重定位目标程序,并将结果保存在目标文件hello.o中。
  • 链接阶段:hello程序调用了printf函数。printf函数存在于一个名为printf.o的单独的预编译好了的目标文件中,而这个文件必须合并到我们的hello.o程序中。链接器负责这种合并,得到hello文件,它是可执行目标文件,可以被加载到内存中,由系统执行。
    编译系统

3.处理器读并解释存储在存储器中的指令

hello.c经过编译得到可执行文件hello后。在unix系统中运行它,需要将它输入到shell中,shell会加载并运行这个文件。

3.1 系统硬件组成

  • 总线:通常被设计为传送定长的字节块(也就是字);
  • I/O设备
  • 主存:是一个临时存储设备,在处理器执行程序时,用来存放程序和程序处理的数据。逻辑上讲,存储器是一个线性的字节数组,每个字节都有其唯一的地址,这些地址是从零开始;
  • 处理器(CPU):其核心是一个字长的存储设备(或寄存器),称为程序计数器(PC)。PC指向主存中的某条机器语言指令(即含有该指令的地址)。处理器不断执行程序计数器指向的指令,在更新程序计数器,使其指向下一条指令。

除以上外,通常还包括高速缓存。

个典型系统的硬件组成

3.2 运行hello程序

unix> ./hello

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

3.3 存储设备层次结构

寄存器文件在层次结构中位于最顶部,记为L0。寄存器文件是L1的高速缓存,L1是L2的高速缓存,…,L3是主存的高速缓存,而主存又是磁盘的高速缓存。
一个存储器层次结构的示例

4. 操作系统管理硬件

操作系统可看成应用程序和硬件之间插入的一层软件,所有应用程序对硬件的操作都需要通过操作系统。操作系统的几个基本的抽象概念:进程,虚拟存储器和文件。

4.1 进程

进程就是一个正在运行的程序。在一个系统上可以同时运行多个进程,每个进程都好像独占使用硬件。并发运行,是指一个进程的指令和两一个进程的指令是交错执行的。
在单核或多核系统中,一个CPU看上去都像是在并发地执行多个进程,这是通过处理器在进程间切换来实现的。操作系统实现这种交错执行的机制称为上下文切换
操作系统保持跟踪进程所需的所有状态信息(也就是上下文),它包括很多信息,例如PC和寄存器文件的当前值,以及主存的内容。单处理器只能执行一个进程的代码。当操作系统要把控制权从当前进程切换到新进程时,就会进行上下文切换,即保存当前进程的上下文、恢复新进程的上下文,然后将控制权传递到新进程,新进程就会从上次停止的地方开始。
进程的上下文切换

4.2 线程

每个线程都运行在进程的上下文中,并共享同样的代码和全局数据。多线程比多进程更容易共享数据,线程一般也比进程更高效。

4.3 虚拟存储器

虚拟存储器为每个进程提供了一个假象,即每个进程都在独占地使用主存。每个进程看到的是一致的存储器,称为虚拟地址空间。下图是Linux进程的虚拟地址空间。图中地址从下往上增大。
进程的虚拟地址空间

虚拟地址从低往上:

  • 程序代码和数据:对所有进程来说,代码是从同一固定地址开始,紧接着是和C全局变量相对应的数据位置。代码和数据区是按照可执行文件的内容初始化的。
  • :代码和数据区是进程一开始运行时就被规定了大小,而当调用malloc或free函数时,堆可以在运行时动态地扩展和收缩。
  • 共享库:存放像C标准库和数学库这样共享库的代码和数据。
  • :编译器用栈来实现函数调用。栈在程序执行期间也可以动态扩展和收缩。当调用一个函数时,栈就会增长,从一个函数返回时,栈就会收缩。
  • 内核虚拟存储器:地址空间顶部视为内核保留的。

每台计算机都有一个字长。因虚拟地址是以这样的一个字来编码的,所以字长决定了虚拟地址空间的最大大小。对一个字长为w位的机器而言,虚拟地址的范围是0~2w-1,程序最多访问2w个字节。32位计算机的虚拟地址空间为4GB。

程序存储器用虚拟地址来寻址。操作系统负责管理虚拟地址空间,将虚拟地址翻译成实际处理器存储中的物理地址。

4.4 文件

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

5. 系统之间通过网络通信

网络可视为一个I/O设备。

猜你喜欢

转载自blog.csdn.net/u010772289/article/details/83628706