导语:本文介绍了CSAPP书籍中的第一章知识点的一些总结

第一章的标题为:计算机系统漫游

这里可以引导出一个问题:何为系统漫游?
个人理解:其实我认为这里的漫游,就是从总体去了解计算机系统的底层知识,在本章只会做一个概述,并且在下面去详细的讲解,目录确实也证明了这个猜想
CSAPP目录结构
既然知道本章写了什么内容以后,我们带着目录上面的疑问,去对每一个知识点进行一个概述总结

  1. 信息就是位+上下文
    这一小节讲的,其实主要就是两个内容,整个计算机系统中,所有能看到的东西(包括但不限于文本,音乐,游戏等等等) 都是由0和1两个数字去组成的,其实也就是我们熟知的二进制,可以总结为一句话,计算机系统,所有文件都以二进制的方式存储,这里读者会不会存在一个疑问,既然所有文件都是二进制存储的,那为什么我把图片的后缀修改为exe,这张图片就无法打开了呢,难道说exe在操作系统中不是二进制么? 错! 在这里我们就可以引出上下文的概念。

    什么是上下文?
    我们常常听见spring的上下文 tomcat的上下文,这里也提出来了上下文的概念,那么到底什么是上下文呢?首先引出百度的概念,如下图所示百度百科 上下文
    看了这个解释,是不是还是懵懵懂懂的,我个人总结为:上下文就是当前所运行的环境,所有的二进制 0101 在不同的人眼里是有不同含义的,比如说小孩去看0和1 只是两个数字,没有特殊含义,但是在程序员眼里这个 0 和 1 代表的是二进制,所以单独拿两个数字出来看是没有任何意义的,要将事物放到具体的场景中,才会有特定含义,这个场景就是上下文! 也就解释了,为什么我把png的文件格式修改为了exe,就无法运行了! 因为图片的二进制代码编译的时候 遵守了png的上下文格式,软件呢 遵守了exe的上下文格式,两个上下文格式不匹配,所以无法表达相同的含义,所以无法解析。

  2. 程序被其他程序翻译成不同的格式
    本小节本人认为他想要讲解的,是偏向于计算机发展的历史,由一个C语言的helloworld的例子,去阐述了我们所写的代码,是如何被转化为汇编指令,又如何从汇编指令转化为机器指令的过程,首先我们第一节说明了 计算机只认识0和1,我们程序员所写的代码,是0和1么?比如说我想写一个a,我有遵守ASCII编码 先想到a对应的是97 然后再去转化为二进制么,很明显,这个过程不是这样子的,那么我们是不是就要去考虑,谁替我们当了这个“翻译官”,将我们输入的a,转化为了计算机所能识别的二进制字节? 在这里我擅自做一个结论,大家先方便理解一下。

    首先我们写的代码会变成汇编指令(具体什么是汇编指令在后面再讲,大概就是因为人们写0101太复杂了,所以发明了一个汇编器,去用一些简单的指令 如sub mov等等 去代表一些特定的二进制)然后汇编指令会被汇编器编译为二进制代码,最后被CPU去执行(目前举例的是C语言的编译流程,大家也可以认为Java其实也没差多少,所谓的jvm 无非就是可以理解为解析.class文件的一个操作系统嘛,但是大家想一下 jvm是由什么编写的? c语言吧 c语言咋解析? 对吧 又回到了编译器 汇编器上面)

  3. 了解编译器如何工作(这里就是为下文做了个铺垫,没有具体内容,下面到具体章节在讲)

  4. 处理器读并且解释在内存中的指令
    该条目其实重点讲的并不是处理器如何处理指令,而是侧重于介绍计算机中的设备,这里引用一张书中的原图,并且侧重介绍处理器,内存,硬盘之间的关系
    在这里插入图片描述
    我们这里不应该存在疑问的一个点就是 我们所编写的所有代码,必须是存在硬盘上的,因为内存掉电会丢失数据,所以我们不能把程序代码存储在内存中,但是CPU可以直接和硬盘交互么?(其实也不是不可以,但是考虑到效率,所以引用了内存)
    很明显这个是不行的 CPU的效率特别高,如果直接让CPU和硬盘交互,那么会导致计算机的性能大幅下降,所以在中途引用了一个叫做内存的东西,这部分区域的特性就是运行速度快,空间较小,无 持久化功能,主要的功能就是运行我们所写的代码,然后和CPU进行交互,让CPU从内存读取指令(这里先不引出CPU多级缓存的概念 后续会讲到),然后对指令进行处理。
    CPU的作用就是相当于人的大脑,负责所有指令的一个处理。
    只要了解这些之后,这小节自认为就可以过啦!

  5. 高速缓存至关重要
    上一小节中提到过一句CPU多级缓存,这个多级缓存,指的就是高速缓存,高速缓存解决了一个什么样的问题呢? 主要是解决了两个问题,内存的速度和CPU速度严重不匹配,减少多次复制操作。
    第一点没有什么疑问,CPU运行的效率最高,内存运行的速度和CPU相比还是慢很多,那么可否在内存和CPU寄存器之间(记住这个寄存器 要考的!),再加一层呢,速度介于内存和寄存器之间,这样的话是否就解决了速度不匹配的情况(突然想到了我一把过的科三 速档匹配 骄傲的一批!!)。
    至于第二点是什么意思呢,上一小节说到了程序运行过程,需要将硬盘中的文件复制到内存中,然后CPU执行的过程之前其实还有一步,就是将内存的数据再复制到寄存器中才可以执行,这种多次频繁的复制,是不是一种性能浪费呢?自己想一下就明白这个缓存解决了什么问题哈。

  6. 存储设备结构层次
    这里直接引用一张书上的贴图就可以了,没有什么太多讲的,合理的利用存储结构,可以提高计算机运行的效率,记住一个准则,越快的存储设备空间越小 单位造价越贵,反之相反。
    在这里插入图片描述

  7. 操作系统管理硬件
    本小节要阐述的概念:我们程序员 所有的操作,并没有直接操作CPU以及内存硬盘等硬件,所有对于硬件的操作,都是操作系统去做的,也就是常见的一个金字塔结构 硬件–> 操作系统 --> 软件 程序员要做的就是上层的软件。
    并且本小节中带出来了一些概念

    1. 进程:其实就是一个软件运行的实例,后续会根据进程引出CPU分时处理,上下文切换等概念,后续再讲
    2. 线程:目前这个阶段 我们讨论在Linux等开源系统中,线程和进程是同种东西,只不过线程共享了进程的空间。
    3. 虚拟内存:看书中描述就可以,很详细
    4. 文件:就是你们想的文件
  8. 操作系统之间利用网络通信
    以上前七节的所有内容,计算机都在自己和自己玩,没有和其他的机器有任何的交互,本章所阐述的内容就是,计算机之间的交互,需要使用到网络通信,其实网络通信也可以理解为是一个IO,只不过遵守了某种协议,如TCP/IP等。


总结:这里引用书中的总结以及加上一些自己的理解,计算机是由软件和硬件共同组成的,他们可以共同的协作,从而运行程序,计算机内部表示最基础的单位是一堆bit,在不同的上下文中,一组组的bit发挥不同的功能,一组组被翻译过的bit存储在硬盘中,在系统运行程序的时候,经过翻译的文件就会被读取到内存中,然后被被读取到CPU的高速缓存中,寄存器直接从高速缓存中读取数据,进行处理指令,从而实现程序的运行。


各位可以期待一下后续的内容,后续将会详细写每一块的具体知识哈~
一直想进大厂的小菜鸡~~

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐