深入理解计算机系统 第一章 计算机系统漫游 笔记

1.1 信息就是位加上下文

  1. 现代操作系统使用ASCII标准表示文本字符
    在这里插入图片描述
  2. 像hello.c这样只有ASCII字符构成的文件称为文本文件,其他的称为二进制文件。
  3. 系统中所有的信息都是由一串比特构成的,区分不同数据对象的唯一方法是我们读到这些数据对象的上下文,如,在不同的上下文中,一个同样的字节序列可能表示一个整数、浮点数、字符串或者机器指令。

1.2 程序被其他程序翻译成不同的格式

在这里插入图片描述

  1. 预处理器阶段:根据以字符#开头的命令,修改原始的C程序,得到.i程序。
  2. 编译阶段:将文本文件hello.i翻译成文本文件hello.s,它包含一段汇编语言程序。
    在这里插入图片描述
    每行语句以一种文本格式描述了一条低级机器语言指令。
  3. 汇编阶段:将hello.o翻译成机器语言指令,打包成可重定位目标程序,结果保存在hello.o中,它是一个二进制文件。
  4. 链接阶段:hello程序调用了printf函数,该函数存在于名为printf.o的预编译好的目标文件中,链接器将它与hello.o合并,得到可执行文件,加载到内存中,由系统执行。

1.3 了解编译系统如何工作是大有益处的

  1. 优化程序性能
  2. 理解链接时出现的错误
  3. 避免安全漏洞

1.4 处理器读并解释储存在内存中的指令

1.4.1 系统的硬件组成

  1. 总线 :贯穿整个系统的是一组电子通道,称为总线,它携带信息字节并负责在各个部件间传递。通常总线被设计成传送定长的字节块,也就是字。字中字节数即字长是一个基本的系统参数:4个字节(32位),8个字节(64位)。
  2. I/O设备:系统与外部世界的联系通道:键盘,鼠标,显示器和磁盘。每个I/O设备都通过一个控制器或适配器与I/O总线相连。控制器:主板上的芯片组,适配器:插在主板插槽上的卡。作用都是在I/O总线和I/O设备之间传递信息。在这里插入图片描述
  3. 主存:临时存储设备,用来存放程序和程序处理的数据。物理上说,主存由一组动态随机存取存储器(DRAM)芯片组成。逻辑上来说,存储器是一个线性的字节数组,每个字节逗游其唯一的地址,从零开始。
  4. 处理器:中央处理单元(CPU),解释(或执行)存储在主存中的指令的引擎。处理器的核心是一个大小为一个字的存储设备(或寄存器),称为程序计数器(PC)。在任何时刻,PC都指向主存的某条机器语言指令(即含有该条指令的地址)。处理器从程序计数器指向的内存处读取指令,解释指令中的位,执行简单操作,更新PC,使其指向下一条指令,而这条指令不一定和在内存中刚刚执行的指令相邻。寄存器文件:小的存储设备,由一些单个字长的寄存器组成。ALU(算术/逻辑单元):计算新的数据和地址值。
    简单操作:加载:主存复制一个字节或字到寄存器。
         存储:寄存器复制一个字节或字到主存的某个位置。
         操作:两个寄存器的内容复制到ALU,ALU对其做算术运算,并将结果存放到一个寄存器中。
         跳转:从指令中抽取一个字,并将这个字复制到PC中,覆盖原有的值。

1.4.2 运行hello程序

  1. 我们在键盘输入字符串“./hello”后,shell程序将字符逐一读入寄存器,再把它存放到内存中。在这里插入图片描述
  2. 我们键盘敲回车,shell程序知道我们已经结束了命令的输入。shell执行一系列指令来加载可执行的hello文件,这些指令将hello目标文件的代码和数据从磁盘复制到主存。数据包括最终会被输出的字符串“hello,world\n”。
  3. 利用直接存储器存取(DMA),数据不通过处理器而直接从磁盘到达主存。在这里插入图片描述
  4. 一旦目标文件hello中的代码和数据被加载到主存,处理器开始执行hello程序的main程序中的机器语言指令。这些指令将“hello,world\n”字符串的字节从主存复制到寄存器文件,再从寄存器文件中复制到显示设备,最终显示在屏幕上。在这里插入图片描述

1.5 高速缓存至关重要

  1. 问题:系统花费大量的时间把信息从一个地方挪到另一个地方。目标:复制操作尽可能快的完成。
  2. 磁盘比主存大1000倍,但时间开销比主存大1000万倍,同时处理器比主存快100倍,针对这种处理器与主存之间的差异,系统设计者采用了更小更快的存储设备,称为高速缓存存储器(cache)。L1和L2高速缓存用静态随机访问存储器(SRAM)。利用高速缓存的局部性原理,即程序具有访问局部区域里的数据和代码的趋势,系统可以获得一个很大的存储器,同时访问速度也很快。在这里插入图片描述

1.6 存储设备形成层次结构

在处理器和一个较大较慢的设备(例如主存)插入一个更小更快的存储设备(例如高速缓存),存储器层次结构:上一层的存储器作为低一层存储器的高速缓存。
在这里插入图片描述

1.7 操作系统管理硬件

操作系统:应用程序和硬件之间插入的一层软件。作用:防止硬件被失控的应用程序滥用,向应用程序提供简单机制来控制复杂的硬件设备。在这里插入图片描述

1.7.1 进程

进程:操作系统对一个正在运行的程序的抽象
并发运行:一个进程指令和另一个进程指令交错执行。
上下文:操作系统保持跟踪进程运行所需的所有状态信息。
上下文切换:保存当前进程的上下文,恢复新进程的上下文,控制权传递到新进程,新进程就会从它上次停止的地方开始。
操作系统内核:操作系统代码常驻主存的部分,当应用程序需要操作系统的某些操作,如读写文件,它就执行系统调用指令,将控制权传递给内核,然后内核执行被请求的操作并返回应用程序。
在这里插入图片描述

1.7.2 线程

一个进程由多个线程组成,每个线程运行在进程的上下文中,共享代码和全局数据。

1.7.3 虚拟内存

虚拟内存:每个进程都在独占使用主存,每个进程看到的内存都是一致的,为虚拟地址空间。
在这里插入图片描述
程序代码和数据:直接按照可执行目标文件的内容初始化的。
堆:代码和数据区在进程一开始运行就制定了大小,当调用malloc和free函数时,堆可以动态的扩展和收缩。
共享库:地址空间中间部分存放C标准库和数据库这样的共享库代码和数据。
栈:编译器用它来实现函数调用。可以在程序执行期间动态扩展和收缩,当调用一个函数,栈增长,从一个函数返回,栈收缩。
内核虚拟内存:为内核保留,不允许应用程序读写这个区域内容或者直接调用内核代码定义的函数,必须调用内核来执行这些操作。

1.7.4 文件

文件就是字节序列。每个I/O设备都可以看成是文件。系统中所有输入输出通过Unix I/O的系统函数调用读写文件来实现的。

1.8系统之间利用网络通信

在这里插入图片描述在这里插入图片描述

1.9 重要主题

1.9.1 Amdahl 定律

在这里插入图片描述
在这里插入图片描述

1.9.2 并发和并行

  1. 线程级并发 在这里插入图片描述在这里插入图片描述
    超线程:又称同时多线程,允许一个CPU执行多个控制流的技术。
  2. 指令级并行:在较低的抽象层次上,现代处理器可以同时执行多条指令的属性称为指令级并行。如果处理器可以达到比一个周期一条指令更快的执行速率,称为超标量处理器。
  3. 单指令、多数据并行:最低层次上,允许一条指令产生多个可以并行执行的操作,称为单指令、多数据,即SIMD并行。

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

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/dldldl1994/article/details/86657603