深入理解计算机系统 第一章 计算机系统漫游 第二遍

 

《深入理解计算机系统》 第三版

 

第二遍读这本书,每周花两到三小时时间,能读多少读多少(这次看了 1 ~ 9 页)

第一遍对应笔记链接 https://www.cnblogs.com/stone94/p/9787261.html

 

信息就是位 + 上下文,即位和上下文环境可确定信息的内容,位不能脱离上下文环境而表示某种确切的信息。

 

编译系统由预处理器、编译器、汇编器和链接器组成

我觉得可以重点记忆编译器和汇编器的作用

编译器将源程序转化为汇编程序

汇编器将汇编程序转化为二进制的可执行程序

即,汇编程序作为中间结果而存在

为什么需要汇编程序的存在呢?书中给出的解释如下:

“汇编语言是非常有用的,因为它为不同高级语言的不同编译器提供了通用的输出语句。”

结合实际工作中的项目情况来看,其实就是封装和解耦,比如,我们有一套系统给客户使用,如果这个系统颇为复杂,那么针对每个客户都重新开发的话,会造成很多不必要的浪费

所以我们需要将其分为几个部分,一般是在数据的来源和目标之间设置一个或多个中间结果,与客户对接的那一部分代码是定制化代码,根据每个客户不同的情况进行定制化开发,这部分定制化开发的目标就是生成固定格式的中间结果,然后由系统中很少变化的部分读取中间结果进行处理产生最终结果,但是不管客户是谁,后面这部分代码都不用重复开发了,它只要独立地进行版本的升级、迭代即可

 

“了解编译器是如何工作是大有益处的”

这里可以类比于实际工作中使用框架,对于框架源码中的细节可以不了解,但是我们得大致知道它是如何工作的,这样我们使用它的时候,就能够更高效地利用它,让他为我们提供更好的服务

 

字长的概念

硬件系统中的总线,通常被设计成传送定长的字节块,也就是字(word),字中的字节数(即字长)是一个基本的系统参数,各个系统中都不尽相同。

我们常说的 32 和 64 位操作系统,分别对应 4 和 8 个字长。

 

重要的局部性原理

程序具有访问局部区域里的数据和代码的趋势,这个思想对于缓存来说非常重要

 

处理器、主存与磁盘之间巨大的速度差异

由于这种差异的存在,再结合局部性原理的理论基础,就引出了缓存的概念

1、处理器与主存之间差异的解决:

ps:“处理器从寄存器文件中读数据比从主存中读取几乎要快 100 倍”

于是有了 L1、L2、L3 等分级的高速缓存(L1 与 寄存器速度差不多,L1 比 L2 快 5 倍,L2 比 主存快 5~10 倍)

2、主存与磁盘之间差异的解决:

ps:“对于处理器而言,从磁盘驱动器上读取一个字的时间开销要比从主存中读取的开销大 1000 万倍”

由于磁盘 I/O 太过消耗时间,所以,在程序中处理大量数据时,应该尽量避免磁盘 I/O,实在避免不了,也要想办法减少磁盘 I/O 的次数

于是出现了数据库的索引技术(尽量少的磁盘 I/O),以及用 Redis 等对 Mysql 做一层缓存(能避免磁盘 I/O 就避免)

 

疑问:

1、Java 中的字节码程序跟这里的汇编程序有什么区别?

2、JVM 中有没有链接器之类的东西?

3、控制器与适配器的区别?

4、内存和磁盘 I/O 时,不需要 CPU 的参与,是因为有这个直接存储器存取(DMA)技术(书中第 8 页提到了这个技术)吗?

 

posted @ 2019-09-01 12:46  stoneBlog  阅读(157)  评论(0编辑  收藏  举报