《深入理解计算机系统》

一、计算机系统漫游学习笔记

//实例代码:
#include<stdio.h>
int main(){
    printf("hello ,world!
");
}

/*大多数的现代系统都使用ASCII标准来表示文本字符,自重方式实际上就是
 *用一个唯一的单字节大小的整数值来表示每个字符.表示如下:
 */

/* #    i       n      c     l       u      d      e     <sp>    <     s    .........
 * 35  105  110  99  108  117  100  101     32     60  115 .........
 *
 * ............
 *.........
 */

本章知识的讲解就是基于这样一个每位程序员学习的第一个程序“hello world”,作为主线,向我们主要介绍了计算机在执行一个程序的过程中所经历的从软件部分,到硬件处理器部分的一个概述总结。

1.1信息就是位+上下文

源程序:源程序就是一个由0/1组成的位序列.8个位被组成一组,成为字节.每个字节表示程序中某个文本字符.
文本文件:在编辑器中存储的文本,最终都会被存为以ascii 码形式的文本,仅以ascii 字符组成的文件称为文本文件,其他文件都成为二进制文件.
文本文件的表示:说明了一个思想方法,系统中所有的信息-------包括磁盘文件,存储器中的程序,存储器中存放的用户数据以及网络上传送的数据,都是由一串位表示.区分不同数据对象的唯一表示方法是我们读到的这些数据对象的上下文.比如在不同的上下文中,一个同样的字节序列可能表示一个整数,浮点数,字符串或者机器指令。

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

目标程序:每一条高级语言都必须被其他程序(编译器,解释器等)转化为一系列的低级机器语言指令.然后这些指令按照一种称为可执行目标程序的格式打好包,并以二进制磁盘文件的形式存放起来.目标程序也称为可执行目标文件.unix系统上,c源程序到目标文件的转化由编译器驱动程序完成,这个翻译过程可分为四个阶段完成,相对应四个阶段程序:预处理器,编译器,汇编器和连接器.这四个阶段程序构成了编译系统(compilation system).

  1. 预处理阶段(Preprocessing phase): 预处理器将(cpp)处理以" # "开头的命令.通过执行改命令,修改源程序.如#include<stdio.h>命令告诉预处理器,将系统头文件stdio.h中的内容插入到程序文本中,得到以" .i " 为后缀扩展名结尾的另一个c程序.
  2. 编译阶段(Compilation phase ):编译器(ccl)将文本文件" xxx.i " 翻译成文本文件" xxx.s".它是一个汇编语言程序.该汇编语言程序中的每条语句都以一种标准的文本格式确切的描述一条低级机器语言指令.
  3. 汇编阶段(Assembly phase):汇编器(as)将xxx.s翻译成机器语言指令,把这些指令打包成一种可重定位目标程序的格式,并将其结果保存在目标文件xxx.o中.xxx.o文件是一个二进制文件,它的字节编码是机器语言指令,而不是字符.
  4. 链接阶段(Linking phase):为了提高编译系统的效率.每个c编译器都会将一些标准的c库函数单独预编译好,放到对应的目标文件中.当我们在程序中调用这些标准函数时,就必须以某种方式将它们合并,并得到最终的一个可执行目标文件.连接器(ld)就负责处理这种合并.该目标文件可以被加载到内存中,又系统执行.

1.3 系统硬件组成

为了理解程序运行是在我们的计算机上发生了什么事情.我们先要对计算机硬件作简单的介绍.总的硬件组成如图所示:

1.总线
将系统各个部分连接起来的是一组电子管道,称作总线.它能携带信息字节并负责在各个部件间传递.总线由i/o总线,系统总线和存储总线三部分组成.
字(word):通常总线被设计为定长的字节块,也称为字(1字 = 2字节).
字长:字中的字节数(即字长),是系统的一个基本的参数.目前一般为4个字节机(32位)和8位字节机(64位).

2.i/o设备
输入/输出设别是系统与外部世界的联系通道.常见的i/o设备有:键盘,显示器,光驱中,鼠标,磁盘等.每个I/O设备都通过一个控制器或适配器与I/O总线相连.控制器与适配器之间的区别:主要在与它们的封装方式.控制器通常是置于I/O设备本身或者系统的主印制电路板(主板)上的芯片组,而适配器则是一快插在主板插槽上的卡.功能都是在I/O总线和I/O设备之间传递消息.

  1. 主存
    所谓的主存是一个临时存储设备,在处理器执行程序时,用来存放程序和程序处理的数据.从物理上来说,主存是由一组动态随机存取存储器(DRAM)芯片组成;逻辑上来说,存储器是一个闲闲的字节数组,每个字节都有唯一的地址(即数组索引),这些地址是从零开始的.一般来所,每条机器指令都由不同数量的字节构成.

  2. 处理器
    中央处理单元(cpu),简称处理器,是解释或执行存储在主存中指令的引擎.处理器的核心是一个字长的存储设备或寄存器,称为程序计数器(PC).程序计数器在任何时候都指向主存中的某条机器语言指令(即含有该条指令的地址.)从系统通电开始,知道系统断电.处理器一直从程序计数器指向的存储器处读取指令,解释指令中的位,执行该指令指示的简单操作,然后更新PC,使其指向下一条指令,而此指令并不一定与上一条指令相邻.

1.6 存储设备形成层次结构

计算机的存储结构也是了解计算机系统的重点知识,每个计算机系统中的存储设备都被组织成了一个存储器层次结构.如图示.在这个层次结构中,从上到下,设备变得访问速度越来越慢,容量越来越大,并且每字节的造价也越来越便宜.

存储器层次结构的主要思想是一层上的存储器作为低一层存储器的高速缓存。因此,寄存器文件就是 L1 的高速缓存,L1 是 L2 的高速缓存,L2 是 L3 的高速缓存,L3 是主存的高速缓存, 而主存又是磁盘的高速缓存。

二、学习问题及思考

这一章中出现了一个我首次听说到的词汇Amdahl定律,该定律的主要思想是,当我们对系统的某个部分加速时,其对整体性能的影响取决于该部分的重要性和加速程度。也就是说要加速整个系统,必须提升系统中大部分的速度。

问题:这个提速是指的硬件性能上的提升,还是操作系统算法上的优化,或是两个都能影响,谁起到的影响作用更大呢?
根据资料的查询了解到,Amdahl加速定律的基本出发点是:1.对于很多科学计算,实时性要求很高,即在此类应用中时间是个关键因素,而计算负载是固定不变的。为此在一定的计算负载下,为达到实时性可利用增加处理器数来提高计算速度;2.因为固定的计算负载是可分布在多个处理器上的,这样增加了处理器就加快了执行速度,从而达到了加速的目的。在此意义下,1967年Amdahl推导出了固定负载的加速公式。
由此可以看出如果从硬件的层面优化增多处理器的话可以提高该数值,但是如果从算法的角度提高运算效率的话,我认为也是可以达到提速的效果的。以上是我了解到的根据Amdahl定律了解到的关于优化计算机系统的方法。

原文地址:https://www.cnblogs.com/20179203li/p/7900280.html