深入理解计算机系统-第1章 计算机系统漫游

零散知识

x86-64处理64位字
计算机系统是由硬件和系统软件组成的,是硬件和系统软件互相交织的集合体。
源程序实际上就是一个由值0和1组成的位序列,8个位被组织成一组,称为字节。每个字节表示程序中的某些文本字符。大部分的现代计算机系统都使用ASCII标准来表示文本字符。
像hello.c这样只由ASCII字符构成的文件称为文本文件,所有其他文件都被称为二进制文件
区分不同数据对象的唯一方法是我们读到这些数据对象时的上下文。

编译系统

预处理阶段,根据以字符#开头的命令,修改原始的C程序。
编译阶段,编译器(ccl)将文本文件hello.i翻译成文本文件hello.s,它包含一个汇编语言程序
汇编阶段,汇编器(as)将hello.s翻译成机器语言指令,将这些指令打包成一种可重定位目标程序(relocatable object program)的格式,并将结果保存在目标文件hello.o中。
链接阶段,链接器(ld)负责合并,得到可执行目标文件,被加载到内存中。比如:printf函数存在于一个名为printf.o的单独的预编译好的目标文件中,这个文件必须以某种方式合并到我们的hello.o程序中。

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

shell是一个命令行解释器,如果该命令的第一个单词不是一个内置的shell命令,那么shell就会假设这是一个可执行文件的名字,将加载并运行这个文件。

系统的硬件组成

总线

贯穿整个系统的一组电子管道,携带信息字节并负责在各个部件间传递。
通常被设计成传送定长的字节块,也就是字。

IO设备

系统和外部世界的联系通道。
每个IO设备都通过一个控制器或适配器与IO总线相连。
控制器:IO设备本身或者系统的主印制电路板(主板)上的芯片组。
适配器:一块插在主板插槽上的卡。

主存

临时存储设备,在处理器执行程序时,用来存放程序和程序处理的数据。
主存是一组动态随机存取存储器(DRAM)芯片组成的。
是一个线性的字节数组,每个字节都有其唯一的地址(数组索引)。

处理器

解释(或执行)存储在主存中指令的引擎。
核心是大小为一个字的存储设备(或寄存器),称为程序计数器(PC)。
在任何时候,PC都指向主存中的某条机器语言指令(即含有该条指令的地址)。
在指令集架构中,指令按照严格的顺序执行,执行一条指令包含一系列的步骤。
寄存器文件是一个小的存储设备,由一些单个字长的寄存器组成,每个寄存器都有唯一的名字。
ALU(算术/逻辑单元)计算新的数据和地址值。
指令集架构描述的是每条机器代码指令的效果
微体系结构描述的是处理器实际上是如何实现的

运行hello程序的过程

键盘输入"./hello"后,shell程序将字符逐一读入寄存器中,再把它放到内存中去。
当在键盘上敲回车时,shell程序就知道已经结束了命令的输入,然后shell执行一系列指令来加载可执行的hello文件,这些指令将hello目标文件中的代码和数据从磁盘复制到主存。
直接存储器存取(DMA)技术,数据可以不通过处理器而直接从磁盘到达主存。
目标文件hello中的代码和数据加载到主存,处理器就开始执行hello程序中的机器语言指令。
这些指令将"hello, world\n"字符串中的字节从主存复制到寄存器文件,再从寄存器文件中复制到显示设备,最终显示在屏幕上。

高速缓存存储器

L1高速缓存的容量可以达到数万字节,访问速度几乎和访问寄存器文件一样快。
L2高速缓存通过一条特殊的总线连接到处理器,容量为数十万到数百万字节。
高速缓存的局部性原理,程序具有访问局部区域里的数据和代码的趋势。
让高速缓存存放经常访问的数据,大部分的内存操作都能在快速的高速缓存中完成。
L1和L2是静态随机访问存储器(SRAM)。

操作系统管理硬件

操作系统两个功能:

  1. 防止硬件被失控的应用程序滥用。
  2. 向应用程序提供简单一致的机制来控制复杂而又通常大不相同的低级硬件设备。
    文件是对IO设备的抽象表示
    虚拟内存是对主存和磁盘IO设备的抽象表示
    进程则是对处理器、主存和IO设备的抽象表示
进程

进程是操作系统对一个正在运行的程序的一种抽象。
操作系统实行交错执行的机制称为上下文切换。
操作系统保持跟踪进程运行所需的所有状态信息。
从一个进程到另一个进程的转换是由操作系统内核管理的。
内核时操作系统代码常驻主存的部分。
内核不是一个独立的进程,它是系统管理全部进程所有代码和数据结构的集合。

线程

一个进程实际上可以由多个线程的执行单元组成,每个线程都运行在进程的上下文中,并共享同样的代码和全局数据。

虚拟内存

地址空间最上面的区域是保留给操作系统中的代码和数据的(高地址)。
地址空间的底部区域存放用户进程定义的代码和数据(低地址)。
程序代码和数据:对所有的进程来说,代码是从同一固定地址开始,紧接着是和C全局变量相对应的数据位置。一开始运行时就被指定了大小。
:代码和数据区后紧随着的是运行时堆。当调用malloc和free这样的C标准库函数时,堆可以在运行时动态地拓展和收缩。
共享库:在地址空间的中间部分时一块用来存放像C标准库和数学库这样的共享库的代码和数据的区域。
:用户虚拟地址空间顶部的是用户栈,编译器用它来实现函数调用。在程序执行期间是动态地扩展和收缩。
内核虚拟内存:地址空间顶部的区域是为内核保留的。不允许应用程序读写这个区域的内容或者直接调用内核代码定义的函数,必须调用内核来执行这些操作。
把一个进程虚拟内存的内容存储到磁盘上,然后用主存作为磁盘的高速缓存。

文件

文件就是字节序列。
每个IO设备,包括磁盘、键盘、显示器、甚至网络都可以看成是文件。

Amdahl定律

例子:
系统执行某应用程序需要时间为 T o l d T_{old} Told
系统某部分所需执行时间与该时间的比例为 α \alpha α
现在该部分性能提升比例为 k k k
该部分初始所需时间为 α T o l d \alpha T_{old} αTold
现在所需时间为 ( α T o l d ) / k (\alpha T_{old})/k (αTold)/k
因此,总的执行时间为
T n e w = ( 1 − α ) T o l d + ( α T o l d ) / k = T o l d [ ( 1 − α ) + α / k ] T_{new} = (1 - \alpha)T_{old}+(\alpha T_{old})/k=T_{old}[(1 - \alpha) + \alpha/k] Tnew=(1α)Told+(αTold)/k=Told[(1α)+α/k]
计算出加速比为:
S = T o l d / T n e w S = T_{old}/T_{new} S=Told/Tnew
s = 1 ( 1 − α ) + α / k s = \frac{1}{(1-\alpha) + \alpha/k} s=(1α)+α/k1
结论:要想显著加速整个系统,必须提升全系统中相当大的部分的速度。

并行和并发

并发:指一个同时具有多个活动的系统。
并行:用并发来使一个系统运行得更快。

线程级并发

多核处理器是将多个CPU集成到一个集成电路芯片上。
使用线程,能够在一个进程中执行多个控制流。
当构建一个由单操作系统内核控制的多处理器组成的系统时,就得到了一个多处理器系统。
多核处理器是将多个CPU(称为"核")集成到一个集成电路芯片上。
L1高速缓存分为两个部分,一个保存最近取到的指令,另一个存放数据。
常规的处理器需要大约20000个时钟周期来做不同线程间的转换,而超线程的处理器可以在单个周期的基础上决定要执行哪一个线程。

指令集并行

现代处理器可以同时执行多条指令的属性称为指令级并行。
在流水线中,将执行一条指令所需要的活动划分成不同的步骤,将处理器的硬件组织成一系列的阶段,每个阶段执行一个步骤。
超标量处理器:处理器可以达到一个周期一条指令更快的执行速率。

单指令、多数据并行

许多现代处理器拥有特殊的硬件,允许一条指令产生多个可以并行执行的操作,即SIMD并行。

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

指令集架构提供了对实际处理器硬件的抽象。
文件是对I/O设备的抽象。
虚拟内存是对程序存储器的抽象。
进程是对一个正在运行的程序的抽象。
虚拟机:提供对整个计算机的抽象,包括操作系统、处理器和程序。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值