《深入理解计算机系统》笔记第一章(自用)

第一章 计算机系统

1.关于【hello.c】文件如何变成【hello】:

《深入理解计算机系统》笔记第一章(自用)_第1张图片

  • 预处理:.c变.i,把头文件中的内容插入到文本程序里
  • 编译:.i变.s,把文本文件翻译成汇编语言
  • 汇编:.s变.o(可重定位目标程序),把汇编语言翻译成机器语言
  • 链接:.o变可执行目标程序,将引用的库函数的实体合并到程序

2.系统的硬件组成:

《深入理解计算机系统》笔记第一章(自用)_第2张图片

  • 总线:(字/字节/位)e.g.字长为4字节的机器,4*8=32位
  • I/O设备:(tip:所有储存器也可以算是I/O设备,I/O所谓的输入输出,是指和计算机之间发生的数据传输)(每一个I/O设备都通过一个控制器/适配器与I/O总线相连,控制器是位于I/O设备本身的或者系统的主板上的芯片组,而适配器是一块插在主板插槽上的卡)
  • 主存:临时存储设备,在程序执行的时候用来存程序和数据。物理上是一组DRAM,逻辑上是线性的字节数组,每个字节都对应唯一数组索引(从0开始)
  • 处理器(CPU):解释/执行存储在主存中指令的引擎。其核心是一个字长的存储设备(寄存器),称为PC(程序计数器)。在任何时刻,PC都指向主存中的某条机器语言指令(也就是含有该条指令的地址)。处理器的执行模型是由指令集架构决定的,CPU从PC指向的存储器处读取指令,解释指令中的位,执行该指令指示的操作,然后更新PC使其指向下一条指令,但这条指令并不一定与前一条相邻。 除此之外处理器中还有寄存器ALU,寄存器是小的存储设备(每个寄存器都有唯一的名字),ALU是算术逻辑单元,用以计算新的数据和地址值。

这里有一个指令集结构和处理器的微体系结构的区分:指令集架构描述的是每条机器代码指令的效果,而微体系结构描述的是处理器实际上是如何实现的。

3.运行hello程序

  • 【1】shell执行它的指令,等待我们输入一个命令,在键盘上输入"./hello"后,外壳程序shell将这个字符串读入寄存器,再将它放入存储器中(这一步和目标执行文件无关,操作的只是"./hello"这个字符串)
    【2】敲一个回车,外壳程序就会get到我们已经结束了命令的输入,进而执行一系列指令来加载可执行的hello文件,这些指令会将hello文件中的代码和数据从磁盘复制到主存
    【3】一旦目标文件hello中的代码和数据被加载到主存,处理器就开始执行hello程序的main程序中的机器语言指令。这些指令将"hello,world\n"字符串中的字节从主存复制到寄存器文件,再从寄存器文件中复制到显示器设备,最终显示在屏幕上
    《深入理解计算机系统》笔记第一章(自用)_第3张图片

4.高速缓存

  • 从上面的过程图可以看出来系统花费了大量的时间把信息从一个地方挪到另一个地方,所以系统设计者需要使这些挪的步骤消耗时间更小;寄存器文件的存储空间小,但读取快;主存的存储空间大,但读取速度慢。
  • 针对上面二者的差异,采用更小更快的存储设备,即高速缓存,用来存放处理器近期可能会用到的信息。
  • L1高速缓存位于处理器芯片上,容量可以达到数万字节,访问速度几乎可以和访问寄存器文件一样快。 L2高速缓存通过一条特殊的总线连接到处理器,容量为数十万字节到数百万字节,进程访问L2高速缓存的时间要比访问L1的时间长5倍,但仍比访问主存的时间快5-10倍。 L1和L2都是SRAM。
  • 通过使用高速缓存,系统可以获得一个很大的存储器,同时访问速度也会很快,原因是利用高速缓存的局部性原理,程序具有访问局部区域里的数据和代码的趋势。通过让高速缓存里存放可能经常访问的数据的方法,大部分的存储器操作都能在快速的高速缓存中完成。

这里加一个冯诺依曼瓶颈问题:CPU再快,也要等内存,因为CPU和内存之间的性能差距越来越大。冯诺依曼架构不区分数据与指令,将两者放在同一内存中,指令和数据放在一起的后果是取指令和取数据不能同时进行,否则会引起访存的混乱。发展到今天,CPU的运算速度已经远远超过了访存速度,因此CPU必须浪费时间等数据。
缓解方法:1.在CPU和主存之间增加高速缓存 2.改为哈佛结构 3.branch predictor algorithms and logic

5.存储设备形成层次结构

  • 主要思想:上一层的存储器作为低一层存储器的高速缓存(也就是,寄存器文件就是L1的高速缓存,L1是L2的高速缓存,L2是L3的高速缓存,L3是主存的高速缓存,而主存又是硬盘的高速缓存)
    《深入理解计算机系统》笔记第一章(自用)_第4张图片

6.操作系统管理硬件

  • 操作系统,应用程序和硬件之间插入的一层软件,所有应用程序对硬件的操作必须通过操作系统。其两个基本功能:【1】防止硬件被失控的应用程序滥用 【2】向程序提供简单一致的机制来控制复杂而又通常大相径庭的低级硬件设备
  • 操作系统在实现基本功能的时候提供了几个抽象的概念:进程/虚拟内存/文件
    《深入理解计算机系统》笔记第一章(自用)_第5张图片
  • 进程:是操作系统对一个正在运行的程序的抽象
    并发执行是说一个进程的指令和另一个进程的指令是交错执行的,使它们看上去像多个进程在执行,但对于单个处理器来说其实每个时间片只有一个进程的代码在执行。
    操作系统实现这种交错执行的机制称为上下文切换。操作系统保持跟踪进程运行所需的所有状态信息,这种状态(上下文)包括PC和寄存器文件的当前值、主存的内容等等。(当操作系统决定要把控制权从当前进程转移到某个新进程的时候,就会进行上下文切换,保存当前进程上下文,恢复新进程上下文,然后把控制权传递到新进程,新进程从上次停止的地方开始)
    《深入理解计算机系统》笔记第一章(自用)_第6张图片
    进程的切换是由操作系统内核管理的,内核是操作系统代码常驻主存的部分,不是一个独立的进程,而是系统管理全部进程代码和数据结构的集合。
  • 线程:在现代操作系统中,一个进程实际上可以由多个线程组成,每个线程都运行在进程的上下文中,并共享同样的代码和全局数据。
    多线程之间比多进程之间更容易共享数据,线程一般来说都比进程更高效。

关于进程和线程:进程与线程的一个简单解释

  • 虚拟内存:为每个进程提供一个假象,即每个进程都在独立地使用主存
    每个进程看到的是一致的存储器,称为虚拟地址空间
    《深入理解计算机系统》笔记第一章(自用)_第7张图片
    程序代码和数据:是直接按可指形目标文件的内容初始化的,在实例中就是可执行文件hello,在进程一开始运行的时候就会被规定大小
    :在调用malloc free这种C标准库函数的时候可以在运行时动态地扩展和收缩
    共享库:用来存放像C标准库和数学库这样的共享库的代码和数据
    :编译器用它来实现函数调用,和堆一样,用户栈在程序执行期间可以动态的扩展和收缩
    内核虚拟内存:内核总是驻留在内存中,是操作系统的一部分。地址空间顶部的区域是为内核保留的,不允许应用程序读写这个区域的内容或者直接调用内核代码定义的函数
    虚拟存储器的运作需要硬件和操作系统软件之间精密复杂的交互。包括对处理器生成的每个地址的硬件编译。其基本思想是把一个进程虚拟存储器的内容存储在磁盘上,然后用主存作为磁盘的高速缓存
  • 文件:文件就是字节序列。 每个I/O设备,包括磁盘、键盘、显示器,甚至是网络,都可以视为文件。

7.并发和并行

  • 并发:通用概念,指一个同时具有多个活动的系统
  • 并行:指用并发来使一个系统运行得更快
  • 并发和并行都可以指多个线程,如果这些线程可以被分配到多个CPU上同时执行,那么就是并行;如果是单CPU对多线程进行切换式处理,那么就是并发。

8.计算机系统中抽象的重要性

  • 文件是对I/O设备的抽象
  • 虚拟内存是对程序存储器的抽象
  • 进程是对一个正在运行的程序的抽象
  • 虚拟机是对整个计算机的抽象(包括操作系统、处理器、程序)

你可能感兴趣的:(计算机系统)