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


本章通过C语言编写的 h e l l o hello hello程序来向读者介绍,在运行该程序时,系统大致发生了什么以及为什么会这样。(尽管 h e l l o hello hello程序非常简单,但是为了让它实现运行,系统的每个主要组成部分都需要协调工作。为了验证一个语言的编译,调试,运行调试环境是通顺的,我们常常写这样一个最简单的程序去测试整个编码流程可用。)

#include <stdio.h>

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

1.1 信息就是位+上下文

h e l l o hello hello程序的生命周期是从一个源程序(或者是源文件) h e l l o . c hello.c hello.c开始的。
源程序实际上就是一个由值0和1组成的位(又称为比特)序列,8个位被组织成一组,称为字节。每个字节表示程序中的某些文本字符。
根据ASCII标准,每个字节都对应一个整数值。(只由ASCII字符构成的文件称为文本文件,所有其他文件都称为二进制文件。)

系统中的所有信息都是由一串比特表示的,区分不同数据对象的唯一方法是我们读到这些数据对象时的上下文。

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

GCC编译器驱动程序读取源程序文件 h e l l o . c hello.c hello.c,并把它翻译成一个可执行目标文件 h e l l o hello hello。这个翻译过程可分为四个阶段完成。执行这四个阶段的程序(预处理器、编译器、汇编器和链接器)一起构成了编译系统(compilation system)。
编译系统

  • 预处理阶段。预处理器(cpp)根据以字符#开头的命令,修改原始的C程序,得到 h e l l o . i hello.i hello.i
  • 编译阶段。编译器(ccl)将文本文件 h e l l o . i hello.i hello.i翻译成文本文件 h e l l o . s hello.s hello.s,它包含一个汇编语言程序(汇编语言为不同高级语言的不同编译器提供了通用的输出语言)。
  • 汇编阶段。汇编器(as)将 h e l l o . s hello.s hello.s翻译成机器语言指令,把这些指令打包成可重定位目标程序(relocatable object program)的格式,保存在目标文件 h e l l o . o hello.o hello.o中。
  • 链接阶段。链接器(ld)将被调用 p r i n t f printf printf函数所在的 p r i n t f . o printf.o printf.o合并到 h e l l o . o hello.o hello.o中,得到 h e l l o hello hello文件,它是一个可执行目标文件(简称为可执行文件),可以被加载到内存中,由系统执行。

1.3 了解编译系统如何工作是大有益处的

  • 优化程序性能
  • 理解链接时出现的错误
  • 避免安全漏洞(eg:缓冲区溢出)

学习安全编程的第一步就是理解数据和控制信息存储在程序栈上的方式会引起的后果。

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

shell(命令行解释器)

1.4.1 系统的硬件组成

典型系统的硬件组成

该结构称为冯诺依曼结构(Von Neumann architecture)/普林斯顿结构(Princeton architecture)

  • 计算机硬件由运算器(ALU)、控制器(Controller)、存储设备(Memory)、输入设备(Input Devices)、输出设备(Output Devices)五大部分组成。
  • 采用二进制形式表示数据和指令顺序执行程序
  • 指令的执行通常是顺序的
  1. 总线:贯穿整个系统的是一组电子管道,称为总线,它携带信息字节并负责在各个部件间传递。通常总线被设计成传送定长的字节块,也就是字(word)。字长:32位机器为4个字节,64位机器为8个字节。
  2. I/O设备:I/O(输入/输出)设备是系统与外界的联系通道(图中包括鼠标、键盘、显示器、磁盘)。每个I/O设备都通过一个控制器或适配器(区别在于封装方式)与I/O总线相连。
  3. 主存:主存是一个临时存储设备,用来存放程序和程序处理的数据。物理上:主存是由一组动态随机存取存储器(DRAM)芯片组成的。逻辑上:存储器是一个线性的字节数组。
  4. 处理器:中央处理单元(CPU),简称处理器,是解释(或执行)存储在主存中指令的引擎。处理器的核心是一个大小为一个字的存储设备(或寄存器),称为程序计数器(PC)。在任何时刻,PC都指向主存中的某条机器语言指令。

围绕着主存、寄存器文件和算数/逻辑单元进行的简单操作:

  • 加载
  • 存储
  • 操作
  • 跳转

其它概念:

  1. 中央处理器(Central Processing Unit)
  • 运算器和控制器
  1. 总线(Bus)
  • 传送信息的公共通道
  • 系统总线包括:地址总线、数据总线和控制总线
  1. 字长(Word Size)
  • 计算机系统的基本参数,典型值为:4个字节(32位)或8个字节(64位)
  1. 寄存器(Register)
  • 一种存储设备
  1. 寄存器文件(Register Files)
  • CPU内部存储数据的一组字长大小的寄存器集合,每个寄存器都有一个唯一的标识名称
  1. 指令(Instruction)
  • 给机器下达的完成一项基本操作的指令
  1. 程序(Program)
  • 完成一项任务所需的并按照一定顺序排列起来的一系列指令

1.4.2 运行hello程序

从键盘上读取hello命令
从磁盘加载可执行文件到主存

上图中是利用了直接存储器存取(DMA)技术,使得数据可以不通过处理器而直接从磁盘到达主存。

将输出字符串从储存器写到显示器

1.5 高速缓存至关重要

主存的工作速率远低于CPU的工作速率,并且这种处理器与主存之间的差距还在持续增大这会导致性能瓶颈。需要采用更小更快的存储设备,称为高速缓存存储器(cache memory, 简称为cache或高速缓存),用于缓冲主存中被频繁访问的区域。这样可以显著提升系统的性能,解决数据传输中的性能瓶颈。

缓存机制是一种重要的系统设计思想(计算机存储系统是基于缓存机制所构成的一系列存储器的集合)。

高速缓存存储器

1.6 存储设备形成层次结构

常见的存储器层次结构
存储器层次结构的主要思想:上一层的存储器作为低一层存储器的高速缓存。

1.7 操作系统管理硬件

操作系统为应用程序提供接口来调用硬件。
操作系统基本功能:管理硬件资源/为应用程序提供统一的访问接口。
计算机系统的分层视图

1.7.1 进程

进程是操作系统对一个正在运行的程序的一种抽象。
进程的上下文切换
在单核处理器中,这种进程并发运行的情况实则是通过处理器在进程间切换来实现的,是一种宏观上的并行,是一种伪并行,称为多道程序设计(Multiprogramming)。(我们在学习现代操作系统一书中将具体提到)

1.7.2 线程

一个进程实际上可以由多个称为线程的执行单元组成。
多线程之间比多进程之间更容易共享数据,线程一般来说比进程更高效。

1.7.3 虚拟内存

虚拟内存是一个抽象概念,它为每个进程提供了一个假象,即每个进程都在独占地使用主存。
每个进程看到的内存都是一致的,称为虚拟地址空间。
进程的虚拟地址空间

1.7.4 文件

文件就是字节序列。

1.8 系统之间利用网络通信

1.9 重要主题

1.9.1 Amdahl定律

当我们对系统的某个部分加速时,其对系统整体性能的影响取决于该部分的重要性和加速程度。
S = 1 ( 1 − α ) + α k S = \cfrac{1}{(1 - α) + \cfrac{α}{k}} S=(1α)+kα1
式中 α α α为系统某部分所需执行时间与原执行时间的比例, k k k为该部分性能提升比例。

想要显著加速整个系统,必须提升全系统中相当大的部分的速度。

1.9.2 并发和并行

并发(concurrency):同时具有多个活动的系统。
并行(parallelism):用并发来使一个系统运行得更快。

  • 线程级并发
  • 指令级并行
  • 单指令、多数据并行

1.9.3 计算机系统中抽象的重要性

使用抽象的一些例子:

  1. API
  2. 学习操作系统时的三个抽象:文件是对I/O设备的抽象,虚拟内存是对程序存储器的抽象、进程是对一个正在运行的程序的抽象。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kirin-dev

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值