CSAPP学习笔记(一)—— 第一章 计算机系统漫游

前言

    之所以开始记录学习CSAPP的笔记,是因为刚开始接触这么课的时候发现这门课实在是太有意思了。之前一直听说CSAPP这本书非常有意思,现在开始了之后发现确实能够对整个计算机系统有一个深刻的理解,非常有助于程序员的程序编写。同时,因为今年我们研一开设了这么课程,老师上课讲的也非常有意思,因此结合这本书和老师的上课笔记进行一个总结,希望有兴趣的同学可以一起来学习。再次强调,《深入理解计算机系统》(简称CSAPP)这本书非常有意思,没看过的赶紧看一下,能学到很多东西。 

第一章 计算机系统漫游

1.1信息=位+上下文

  源程序是以0和1组成的位序列构成的,其每个字符都对应一个ASCII字符,。一个ASCII字符是以唯一的单字节大小的整数值来表示每个文本字符,每个字节由8bit组成,因此源程序里面的所有信息都是一串位来表示的。我们可以理解为我们看到的C语言程序最终都是0、1组合的形式告诉计算机。那么同样的一段数据有可能有不同的含义,这就需要结合上下文来进行理解。

1.2编译的工作原理

  以hello.c源文件来举例子:

  hello.c  --> 预处理器  -->  编译器  -->  汇编器  --> 链接器 --> 目标文件

  首先,hello.c源文件需要进行预处理,也就是把头文件包含的内容添加到源文件中,相当于把头文件的库加载进来最终组成一个文件。然后将这个预处理好的文件进行统一编译,把高级语言转换成汇编语言,汇编语言再转化成机器语言,最后是处理hello.c里面涉及到的printf函数,需要把这部分代码与当前的代码进行链接,最终合并到一个文件。合并成功后就可以加载到内存中由系统来执行。

1.3理解编译系统的好处

  1. 优化程序性能——理解编译过程有助于优化代码
  2. 理解链接时出现的错误——莫名其妙的错误往往跟链接有关
  3. 避免安全漏洞——缓冲区溢出是常见的安全漏洞

1.4程序运行的流程

  目标文件存在磁盘中,当我们在shell里面输入该文件名的时候,计算机会把目标文件从磁盘复制到主存,然后处理器开始执行main程序里面的机器语言指令,把相关数据从内存复制到寄存器文件中,然后再通过总线从寄存器复制到显示设备进行显示。

1.5高速缓存

  高速缓存在提升程序性能来说是非常重要的,因为我们的程序从磁盘到主存,从主存到寄存器这些过程都需要开销时间,这样就会降低效率。然而我们可以利用高速缓存的局部性原理来进行有效提升程序的性能,把最近出现或者未来可能会用到的程序放到高速缓存中,这样就可以减少访问磁盘或者内存的次数,从而实现提高效率。同时,高速缓存的访问速度跟寄存器差不多,比访问主存要快很多,更比磁盘快很多。在现在的系统中,甚至已经有L1、L2和L3三级的高速缓存。

1.6存储设备层次结构

    访问速度从快到慢:寄存器文件 --> L1 cache --> L2 cache --> L3 cache --> 主存 --> 本地磁盘 -->分布式系统、Web服务器。

    同时,前面一个存储设备可以作为后面一个的高速缓存,相当于一个中间件桥梁的作用,或者理解为缓冲区的作用,这对于提升程序性能来说非常重要,因此我们需要好好理解高速缓存的概念。

1.7操作系统管理硬件

  操作系统相当于在应用程序和硬件之间加了一层软件,通过这层软件可以对底层硬件进行抽象化,然后方便用户更方便地操控硬件。操作系统有几个基本抽象概念来实现这些功能,分别是进程、虚拟存储器和文件。

  文件是对I/O设备地抽象,说白了文件就是字节序列,所有的I/O设备都可以抽象为文件,包括磁盘、键盘、显示器甚至网络。

  虚拟存储器是对文件和主存的抽象表示,为每一个进程提供了独占地使用内存地假象。  

  进程是对处理器、主存和I/O设备的抽象表示,也是最重要的概念。进程是动态的,是正在运行的程序的一种抽象。处理器在处理代码和数据的时候往往会涉及到进程的上下文切换,这也是提高CPU利用率的方法。对进程的进一步划分还有一个线程的概念,线程可以共享进程的所有资源。

  综述所述,我们需要理解操作系统对硬件设备的抽象表示,只有这样我们才能更好地通过操作系统对硬件进行管理。

1.8系统间网络通信

  网络其实可以看成是一个I/O设备,因为通过网络我们可以连接到任何一台设备,这样地话我们把任何一台设备地输出当成我们本地设备地输入,也就可以把网络理解为I/O设备。网络之间地通信最典型地机制是客户端—服务器的形式,其整体的运行流程跟本机运行的流程基本一致,只是把网络接口当成了一个输入输出通道而已。

1.9重要主题

  线程级并发、指令级并行和SIMD并行(单指令、多数据并行)这三个概念有点抽象,后续继续探讨。除此之外,抽象是一个非常重要的概念,添加一个虚拟机的概念,虚拟机是对整个计算机的抽象,包括操作系统、处理器和程序。

CSAPP学习笔记(一)—— 第一章 计算机系统漫游

上一篇:解决手机无法连接【小米AI音箱】播放音乐问题


下一篇:MyBatis学习日记(三):戏说MyBatis配置文件