【无标题】深入了解计算机系统

第一章:计算机系统漫游

1.1 信息就是位+上下文

#include <stdio.h>

int(main){
    printf("hello,worid!");
    return 0;
}

源程序(程序的生命周期)是一个由值0和1组成的(又称比特)序列,8位组织在一起为一组,称为字节。
大部分的现代计算机系统都使用ASC||标准来表示文本字符。ASC||码对应表示.
源程序是以字节序列的方式存在文件中的。只有ASC||字符构成的文件称为文本文件,所有其他文件都称为二进制文件
源程序的表示方法说明了一个基本思想:系统中的所有信息,包括磁盘文件、内存中的程序、内存中存放的用户数据以及网络上传送的数据,都是由一串比特表示的。区分不同数据对象的唯一方法是我们读到这些数据对象时的上下文(可以理解为环境)。

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

为了在系统上运行hello.c程序,每条c语句都必须被其他程序转化为一系列的低级机器语言指令(如汇编语言)。然后,这些指令按照可执行目标程序的格式打好包,以二进制磁盘文件的形式存放起来,其称为可执行目标程序。
截屏2022-03-09 下午9 34 49
编译器读取程序文件的翻译过程(高级语言转变成机械语言,之后储存在内存中):
预处理阶段:预处理器收到程序中的命令,修改原始程序,得到新程序1;(处理的是头文件)
编译阶段:编译器对程序1进行翻译,得到程序2;(处理main函数)
汇编阶段:汇编器将程序2翻译成机器语言指令,并保存生成二进制文件程序3;
链接阶段:链接器负责将程序中由编译器提供的函数编译成文件进行合并。
执行这四个阶段的程序(预处理器、编译器、汇编器和链接器)共同构成了编译系统。

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

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

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

源程序被编译系统翻译成了可执行目标文件,并被放在磁盘上。我们把它的文件名输入到命令行解释器的营养程序中:

linux> ./hello
hello, world
linux>

命令行解释器输出一个提示符,等待输入一个命令行,然后执行这个命令。如果该命令行的第一个单词不是一个内置的命令行解释器命令,那么命令行解释器就会假设这是个可执行文件的名字,它将加载并运行这个文件。
系统的硬件组成

  1. 总线:贯穿整个系统的是一组电子管道,称为总线,它携带信息字节并负责在各个部件间传递。
  2. I/O设备:I/O(输入/输出)设备是系统与外部世界的联系通道。鼠标、键盘、显示器、磁盘驱动器等。每个I/O设备通过一个控制器或适配器与I/O总线相连。控制器是至于I/O设备本身的或者系统的主板上的芯片组,而适配器是一块插在主板插槽上的卡。其区别主要在于封装的方式不一样。
  3. 主存:主存是一个临时存储设备,在处理器执行程序时,用来放程序和程序处理的数据。主存是一组动态随机存储器芯片组成的。存储器是一个线性的字节数组,每个字节都有其唯一的地址(数组索引),这些地址是从零开始的。组成程序的每条机器指令都由不同数量的字节构成。
  4. 处理器:中央处理单元(CPU),简称处理器,是解释(或执行)存储在主存中指令的引擎。处理器的核心是一个大小为一个字的存储设备(或寄存器),称为程序计数器(PC)。PC都指向主持中的某条机器语言指令(即含有该条指令的地址)。
    CPU在指令的操作下可能会执行这些操作:
  • 加载:从主存复制一个字节或者一个字到寄存器,以覆盖寄存器原来的内容。
  • 存储:从寄存器复制一个字节或者一个字到主存的某个位置,以覆盖这个位置上原来的内容。
  • 操作:把两个寄存器的内容复制到ALU,ALU对这两个字做算术运算,并将结果存放到一个寄存器中,以覆盖该寄存器中原来的内容。
  • 跳转:从指令本身中抽取一个字,并将这个字复制到程序计数器(PC)中,以覆盖PC中原来的值。
    现代处理器使用了非常复杂的机制来加速程序的执行。指令集架构描述的是每条机器代码指令的效果;而微体系结构描述的是处理器实际上是如何实现的。

1.5 高数缓存至关重要

处理器在磁盘驱动器上读取一个字的时间开销比从主存中读取的开销要大1000万倍。处理器冲寄存器文件中读取数据比从主存中读取几乎要快100倍。
针对这种处理器与主存之间的差异,系统设计这采用了更小更快的存储设备,称为高数缓存存储器(简称为cache或高数缓存),作为暂时的集结区域,存放处理器近期可能需要的信息。
高数缓存处理器使系统获得一个很大的存储器,同时访问速度也很快,原因是利用了高数缓存的局部性原理,即程序具有防蚊局部区域里的数据和代码的趋势。通过让高数缓存里存放可能经常访问的数据,大部分的内存操作都能在快速的高速缓存中完成。
意识到高速缓存存储器存在的应用程序员能够利用高数缓存将程序的性能提高一个数量级。

1.6 存储设备形成层次结构

存储器是一个具有不同容量、成本和访问时间的存储设备的层次结构。高层次存储器速度快,成本高;低层次速度慢,成本低。整体效果是一个大的存储器池,其成本与层次结构底层最便宜的存储设备相当,但是却以接近于层次结构顶部存储设备的高速率向程序提供数据。
截屏2022-03-10 下午9 19 20
存储器层次结构的主要思想是上一层的存储器作为低一层存储器的高速缓存。因此,寄存器文件就是L1的高速缓存,L1是L2的高数缓存,L2是L3的高数缓存,L3是主存的高速缓存,而主存又是磁盘的高数缓存。在某些具有分布式文件系统的网络系统中,本地磁盘就是存储在其他系统中磁盘上的高数缓存。

1.7 操作系统管理硬件

当命令行解释器加载和运行源程序时,以及源程序输出自己的消息时,它们都没有直接访问键盘、显示器、磁盘、或者主存。它们依靠的是操作系统提供的服务。所有应用程序对硬件的操作尝试都必须通过操作系统。
操作系统的两个基本功能:(1)防止硬件被失控的应用程序滥用;(2)向应用程序提供简单一致的机制来控制复杂而又通常大不相同的低级硬件设备。
操作系统通过几个基本的抽象概念(进程虚拟内存文件)来实现这俩个功能。
文件时对I/O设备的抽象表示,虚拟内存是对主存和磁盘I/O设备的抽象表示,进程则是对处理器、主存和I/O设备的抽象表示。
截屏2022-03-10 下午10 01 35

1.7.1 进程

进程是操作系统对一个正在运行的程序的一种抽象。在一个系统上可以说是同时运行多个进程,而每个进程都好像在独占地使用硬件。而并发运行,则是说一个进程的指令和另一个进程的指令是交错执行的。 操作系统实现交错执行的机制称为上下文交换。操作系统保持跟进运行所需的所有状态信息。这种状态,也就是上下文。
从一个进程到另一个进程的转换是由操作系统内核管理的。内核是操作代码常驻主存的部分。
内核不是一个独立的过程。相反,他是系统管理全部进程所用代码和数据结构的集合。
截屏2022-03-10 下午10 47 15

1.7.2 线程

在现代系统中,一个进程实际上可以由多个称为线程的执行单元组成,每个线程都运行在进程的上下文中,并共享同样的代码和全局数据。多线程之间比多进程之间更容易共享数据。

1.7.3 虚拟内存

虚拟内存是一个抽象概念,它为每一个进程提供了一个假象,即每个进程都在独占地使用主存。每个进程看到的内存都是一致的,称为虚拟地址空间
截屏2022-03-10 下午11 03 16

  • 程序代码和数据。 代码是从同一固定地址开始,紧接着的是和C全局变量相对的数据位置。
  • 堆。 代码和数据区后紧随着的是运行时。当调用C标准库函数,堆可以在运行时动态地扩展和收缩。
  • 共享库。 在地址空间的中间部分是一块用来存放C标准库和数学库这样的共享库的代码和数据的区域。
  • 栈。位于用户虚拟地址空间顶部的是用户栈,编译器用它来实现函数调用。用户栈在程序执行期间可以动态地扩展和收缩。每次我们调用一个函数时,栈就会增长;从一个函数返回时,栈就会收缩。
  • 内存虚拟空间。地址空间顶部的区域是为内核保留的。它们必须调用内核来执行这些操作。虚拟内存的运作需要硬件和操作系统软件之间精密复杂的交互,包括对处理器生成的每个地址的硬件翻译。基本思想是把一个进程虚拟内存的内容存储在磁盘上,然后用主存作为磁盘的高速缓存。

1.7.4 文件

文件就是字节序列,每个I/O设备,包括磁盘、键盘、显示器,甚至网络,都可以看成是文件的。系统中的所有输入输出都是通过使用一小组Unix I/O的系统函数调用读写文件来实现的。

1.8 系统之间利用网络通信

现代系统经常通过网络和其他系统连接到一起。从一个单独的系统来看,网络可视为一个I/O设备。当设备从主存复制一串字节到网络适配器时,数据流经过网络到达另一台机器,而不是比如说到说到达本地磁盘驱动器。系统可以读取从其他机器发来的数据,并把数据复制到自己的主存。
截屏2022-03-10 下午11 09 35
全球网络的出现,从一台主机复制信息到另外一台已经成为计算机系统最重要的用途之一。

1.9 重要主题

系统是硬件和系统软件互相交织的集合体,它们必须共同协作以达到运行应用程序的最终目的。

1.9.1 Amdahl定律

Amdahl定律对提升系统某一部分性能所带来的效果的效果做出简单却有见地的观察。该主要思想是,当我们对系统的某个部分加速时,其对系统整体性能的某个部分加速时,其对系统整体性能的影响取决于该部分的重要性和加速程度。若系统执行某应用程序需要时间为T1,系统某部分所需执行时间于该时间的比例为a,而该部分性能提升比例为k,即该部分初始所需时间为aT1,现在所需时间为(aT1)/k。所以总执行时间为T2=(1-a)T1+(aT1)/k=T1[(1-a)+a/k]. 加速比S为S=1/[(1-a)+a/k)].
Amdahl定律主要观点—————要想显著加速整个系统,必须提升系统中相当大的部分的速度。Amdahl定律描述了改善任何过程的一般原则。

1.9.2 并发和并行

并发指一个同时具有多个活动的系统;并行指的是用并发来使一个系统运行得更快。并行可以在计算机系统的多个抽象层次上运用。

  1. 线程级并发。
    构建在进程之上,能够设计出同时有多个程序执行的系统,导致了并发。并发执行只是模拟出来的,是通过使一台计算机在它正在执行的进程间快速切换来实现的,并发形式允许多个用户同时与系统交互。
    即使处理器必须在多个任务间切换,大多数实际计算机也都是由一个处理器来完成的。这种配置称为单处理器系统。构建一个由单操作系统内核控制的多处理器组成的系统时,就得到了一个多处理器系统随着多处理器线程和超线程的出现,多处理器系统才变得常见。多核处理器是将多个CPU(称为“核”)集成到一个集成电路芯片上。
    超线程,有时也称多线程,是一项允许一个CPU执行多个控制流的技术。它涉及CPU某些硬件有多个备份,如程序计算器和寄存器文件。超线程的处理器可以在单个周期的基础上决定要执行哪一个线程。使得CPU能够能好地利用它的处理资源。
    多处理器的使用可以从两方面提高系统性能。1.它减少了在执行多个任务时模拟并发的需要;2.使应用程序运行的更快。
  2. 指令级并行。
    在较低的抽象层次上,现代处理器可以同时执行多条指令的属性称为指令级并行。 每条指令从开始到结束需要长得多的时间,大约20个或者更多的周期,但是处理器是用了非常多的聪明技巧来同时处理多达100条指令。处理器可以达到一个周期一条指令更快的执行效率,称为超标量处理器。
  3. 单指令、多数据并行。
    在最低层次上,许多现代处理器拥有特殊的硬件,允许一条指令产生多个可以执行的操作,这种方法称为单指令、多数据,即SIMD并行。提供这些SIMD指令多是为了提高处理影像、声音和视频数据应用的执行速度。可靠的方法是用编译器支持的特殊的向量类型来写程序。

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

抽象的使用是计算机科学最为重要的概念之一。不同的语言提供不同形式和等级的抽象支持。
在处理器里,指令集架构提供了对实际处理器硬件的抽象。使用这个抽象,机器代码表现得就好像运行在一个一次只执行一条指令的处理器上。
截屏2022-03-11 上午7 50 20
文件是对I/O设备的抽象;虚拟内存是对程序处理器的抽象,进程是对一个正在运行的程序的抽象。虚拟机,它提供对整个计算机的抽象,包括操作系统、处理器和程序。
虚拟机在管理计算机方式上的优势的思想,在一些计算机必须能够运行不同的操作系统或同一操作系统的不同版本设计程序。

第二章 程序结构和执行

2.1 信息存储

机器级程序将内存视为一个非常大的字节数组,称为虚拟内存,所有可能地址的集合就称为虚拟地址空间。虚拟地址空间只是一个展现给机器级程序的概念性映像,实际的实现是将动态随机访问储存器、闪存、磁盘存储器、特殊硬件和操作系统软件结合起来,为程序提供一个看上去统一的字节数组。

编译器和运行时系统是如何将存储器空间划分为更可管理的单元,来存放不同的程序对象。每个程序对象可以简单地视为一个字节快,而程序本身就是一个字节序列。

2.1.1 十六进制表示法

截屏2022-03-13 下午7 14 11

在C语言中,以0x或0X开头的数字常量被认为是十六进制的值。字符‘A’~’F’即可以是大写,也可以是小写,甚至也可以是大小写混合。

编写机械语言程序语言的一个常见任务就是在位模式的十进制、二进制和十六进制表示之间人工转换。

如果给定一个二进制数字,可以通过首先把它分为每4位一组转换为十六进制,要要注意,如果总数不是4的倍数,最左边的一组可以少于4位,前面用0补足。

2.1.2 字数据大小

字长指明指针数据的标称大小,字长决定的最重要的系统参数就是虚拟地址空间的最大大小
字节单位换算

计算机和编译器支持多种不同方式编码的数字格式,如不同长度的整数和浮点数。

对于一个字长为w位的机器而言,虚拟地址的范围为0~2的w次幂-1.现在的计算机系统大多为32位和64位。

64位系统和32位系统有什么区别

2.1.3 寻址和字节顺序

对于跨越多字节的程序对象,我们必须建立两个规则:这个对象的地址是什么,以及在内存中如何排列这些字节。多字节对象都被存储为连续的字节序列,对象的地址为所使用字节地址中最小的地址。

排列表示一个对象的字节有两个通用的规则:大端法和小端法。

大端法:某些机器选择在内存中按照从最低有效字节到最高有效字节的顺序存储对象;

小端法:一些机器按照从最高有效字节到最低有效字节到顺序存储对象。

截屏2022-03-13 下午7 19 07

许多比较新的微处理器是双端法,可以把它们配置成作为大端法或者小端法运行机器运行。然而,一旦选择了特定操作系统,那么字节顺序也就确定下来。

2.1.4 表示字符串

在引用使用ASCII码作为字符的任何系统上都会将数据比的结果与字节性的录音规则相同。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值