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


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

    第二遍读这本书,每周花两到三小时时间,能读多少读多少(这次看了 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 页提到了这个技术)吗?

  • 相关阅读:
    Java中会存在内存泄漏吗,请简单描述。
    什么是类加载器
    通俗易懂 索引、单列索引、复合索引、主键、唯一索引、聚簇索引、非聚簇索引、唯一聚簇索引 的区别与联系
    Redis真的那么好用吗
    java中public,private,protected和default的区别
    聚集和非聚集索引
    我以为我对Mysql索引很了解,直到我遇到了阿里的面试官(转)
    Java中存储金额用什么数据类型
    InnoDB在MySQL默认隔离级别下解决幻读
    android应用程序第一次启动时显示引导界面
  • 原文地址:https://www.cnblogs.com/stone94/p/11441993.html
Copyright © 2020-2023  润新知