一  计算机系统漫游

1.1 信息就是位+上下文

  C语言源程序是以字节序列的方式存储在文件中的,每个字节对应一个ASCⅡ编码,例如第一个字节整数值位35,对应字符 '#'

  一个基本思想:系统中的所有信息,包括磁盘文件,内存中的程序,用户数据,网络上传输的数据都是比特流。区分不同数据对象的唯一方法是读到这些数据对象时的上下文,根据不同的上下文,某个字节的信息可能表示机器指令或者是数值数据。

1.2 程序被其他程序翻译成不同格式

  程序的编译流程:

 

 

 

 

  预处理阶段:预处理器(cpp)根据#include<stdio.h>读取系统头文件stdio.h的内容,并将它直接插入程序文本中,得到另一个C程序,通常以.i为拓展名

  编译阶段:编译器(ccl)将文本文件hello.i翻译成文本文件hello.s,hello.s为汇编指令文本

  汇编阶段:汇编器(as)将hello.s翻译为机器指令,把这些指令打包为可重定位目标程序的格式,保存至hello.o(二进制)中

  链接阶段:hello.c程序调用了printf函数,printf函数存在于一个名为printf.o的单独预编译好了的目标文件中,连接器便负责将hello.o和printf.o合并,成为可执行文件hello

1.4 处理器读取并解释存储在内存中的指令

  通过shell可执行刚才生成的可执行文件hello

  1.4.1 系统的硬件组成

  系统主要由四个部分组成:总线、IO设备、主存、处理器

  总线通常被设计成传送定长的字节块(字),IO设备通常包含键盘鼠标、显示器、磁盘驱动器、打印机等。主存是一个临时存储设备,由一组动态随机存取存储器芯片组成,从逻辑上来说,可以将存储器理解为线性的数组。中央处理单元CPU是执行主存中指令的引擎,处理器组成包括:寄存器文件、算术逻辑单元、cache、总线接口等

  1.4.2 运行hello程序

  在shell中执行./hello命令后,shell执行一系列指令将hello目标文件中的二进制指令从磁盘复制到主存,利用直接存储器存取(DMA)技术,数据可以不通过处理器而直接从磁盘到达主存。当目标文件hello被加载到主存中,处理器开始执行main程序中的机器语言指令,将“hello,world\n”字符串的字节从主存复制到寄存器文件,再从寄存器文件中复制到显示设备,最终输出在屏幕上。

1.5 高速缓存

  由于从主存到处理器、主存到磁盘的数据加载会花费大量的时间,由此设计出了高度缓存cache,集成在处理器中

  L1高速缓存:通常容量达到数万字节,访问速度几乎和访问寄存器文件一样快

  L2高速缓存:容量达到数十万到百万字节,访问L2缓存的速度比L1更慢,但仍比访问主存快

  将一些可能经常访问的数据缓存在cache中,能够大大提升性能

1.6 存储设备形成层次结构

  

 

 

   从上至下,访问速度越来越慢,容量越来越大。上一层存储器作为下一层存储器的高速缓存。

1.7 操作系统

  1.7.1 进程

  进程是操作系统对一个正在运行的程序的一种抽象。

  并发:一个进程的指令和另一个进程的指令是交错执行的,但在某一时刻,单核处理器只能运行一个进程。操作系统实现并发执行的机制称为上下文切换。

  并行:多核处理器能够同时运行多个进程。

  上下文:操作系统保持跟踪进程所需的所有状态信息,这种状态称为上下文,包含PC值、寄存器文件、主存内容等。

  1.7.3 虚拟内存 

  操作系统为每个进程提供的假象,好像每个进程都在独占的使用主存,成为虚拟内存空间。每个进程都对应着拥有下图所示的虚拟地址空间。