学习与总结《深入理解计算机系统》【硬件构成以及程序执行过程】

该文章转载自杨建勇的个人博客

计算机系统的底层硬件组成以及程序执行的过程

注:本文涉及到的概念以及内容摘自《深入理解计算系统》第三版

#程序最终要在硬件上执行,就有必要了解底层的硬件系统

1、基于Intel产品族的模型[图1-1]来了解一下硬件的组织结构

学习与总结《深入理解计算机系统》【硬件构成以及程序执行过程】
图1-1

系统的硬件组成包括了总线、I/O设备、主存、cpu处理器

1.1总线 贯穿整个系统的是一组电子管道,称作总线。它携带信息字节并负责在各个部件之间传递。具体的概念本文不做详细介绍
1.2 I/O设备 I/O (输入/输出)设备是系统与外部世界的联系通道。[图1-1]中的鼠标、键盘、显示器磁盘都是I/O设备。具体的鼠标/键盘/磁盘技术本文不做详细的介绍
1.3主存 主存是一个临时存储设备,在cpu处理器执行程序时,用来存放程序和程序处理的数据。从物理上讲,主存是由一组动态随机存取存储器芯片组成的。从逻辑上来讲,存储器是一个线性的字节字组,每个字节都有其唯一的地址,这些地址是从零开始的
1.4处理器 中央处理器(CPU),简称处理器,是解释或者执行存储在主存中指令的引擎。处理器的核心是一个大小为一个字的存储设备或者寄存器,简称程序计数器(PC)。在任何时刻,PC都指向主存中的某条机器语言指令(即含有该条指令的地址)。从系统通电到断电结束,处理器一直不断的执行程序计数器指向的指令,再更新程序计数器,使其指向下一条指令。这样的操作围绕着内存(主存),寄存器文件和ALU(算术/逻辑单元)进行。寄存器文件是一个小的存储设备,ALU计算新的数据和地址值。处理器的工作主要有以下4个
1.4.1加载 从主存复制一个字节或者一个字到寄存器,以覆盖寄存器原来的内容
1.4.2存储 从寄存器复制一个字节或者一个字到主存的某个位置,以覆盖这个位置上原来的内容
1.4.3操作 把两个寄存器的内容复制到ALU,ALU对这两个字做算术运算,并将结果存放到一个寄存器中,以覆盖该寄存器中原来的内容
1.4.4跳转 从指令本身抽取一个字,并将这个字复制到程序计数器(PC)中,以覆盖PC中原来的值
注:以上的流程操作【1.4.1 — 1.4.4】要结合 图1-1 去理解整个过程。对于咱们程序员中来说,所说的各种概念:进程/线程/协程,以及系统调度,异常捕获,性能优化等。要理解这些概念并做到如何开发出高性能的服务器,就必须了解整个硬件组织架构以及执行流程,才能知道在什么地方和怎么去优化

上面介绍了计算机系统底层的硬件组织已经处理器的主要工作,下面就从Hello World程序来讲解运行了一个程序到底发生了什么

#一个Hello World程序(c程序)到底在硬件上经历了什么

结合图1-1理解仔细理解以下执行过程

假设我们现在有一个可执行的 hello 文件(c文件)存放在磁盘上,
1、当我们使用键盘敲入 ./hello 字符后,系统的 shell 程序从 USB 控制器将 ./hello 字符经 I/O总线—系统总线逐一读入寄存器,再从寄存器经过系统总线—I/O桥—内存总线把他们存放到内存(主存)中
2、当我们在键盘上敲入回车键,shell程序就知道我们已经结束了命令的输入。然后shell执行一系列的指令来加载可执行的 hello 文件,这些指令将 hello 目标文件中的代码和数据从磁盘经过I/O总线—I/O桥—内存总线复制到内存(主存)
2.1 利用直接存储器存取(DMA)技术,数据可以不通过处理器直接从磁盘到达主存。该技术本文不做详细讲解
3、hello 文件中的代码和数据被加载到内存(主存),处理器就开始执行 hello 程序的 main 程序中的机器语言(c语言)指令。这些指令将 hello,world\n 字符串中的字节从内存(主存)经过内存总线—I/O桥—系统总线复制到寄存器,再从寄存器文件中经过系统总线—I/O桥—I/O总线复制到显示设备,最终显示到屏幕上

此处画重点!!!

对于咱们程序员来讲,咱们成天在说的开销(时间开销/系统开销)就是这些硬件把信息从一个地方复制到另外一个地方的工作过程所花的时间(以上步骤 1—4 的过程),系统主要的时间花在了复制上,而咱们最终的目的是让程序和数据在cpu(处理器)上计算然后得到我们想要的结果。
咱们程序员所有的工作都是围绕着这些复制能够尽快的完成,也就是减少时间开销。后面文章要讲到的进程/线程/协程/高速缓存/系统级IO/并行/并发/多核处理器/超线程等等技术都是为了这个目的而研发开发的