摘要:
分层概述 不同层次的存储器的常见访问时钟周期 存储器 时钟周期 CPU寄存器 0 高速缓存 4~75 主存 上百 磁盘 几千万 除非设计非常失败,计算机程序大多数都会在一段时间内持续的访问某个局部的数据,这称为局部性原理。所以存储空间更小,性能更高的存储器通常作为存储空间稍大,性能稍低的存储器的缓存 阅读全文
摘要:
编译器优化局限性 现代编译器都会在编译时对你的代码进行一些分析和优化,比如简化计算表达式,内联函数等等,并且编译器会对你提供优化等级的控制。在GCC中使用-Og、-O1、-O2、-O3会让编译器使用越来越多的优化。书上说编译器不会对代码进行激进的优化,编译器对代码做的所有优化都必须产生和未优化前一样 阅读全文
摘要:
流水线通用原理 在之前的SEQ模型中,由于一条指令的所有部分必须在一个时钟周期内完成,所以时钟周期无比的慢,所以系统的吞吐量就很慢,吞吐量即每秒能够处理的指令数量。 流水线系统的思路和工厂流水线一样,比如一个服装工厂流水线需要通过裁剪、缝合、贴商标、装袋这四个步骤,想象一下是当一件衣服的这四个步骤全 阅读全文
摘要:
指令集在CPU和程序员(编译器)之间提供了一个抽象层,看起来,CPU在一条接着一条的顺序执行编译后的指令,但出于性能考虑实际情况却远比这个“看起来”要复杂。现代CPU使用一种称作“流水线”的技术来执行每一条指令。 本章基于一种具有简单指令集“Y86-64”的CPU架构进行研究,旨在对处理器的整个体系 阅读全文
摘要:
本篇主要介绍机器层面对实现过程调用的支持。 过程 过程即编程语言中的函数、方法、子例程、处理器等。 当P调用Q时: 传递控制:在进入过程Q时,程序计数器必须设置成Q的起始地址,当从Q退出时,程序计数器必须设置成P中执行Q的下一条指令的地址 传递数据:P必须能够向Q提供一个或多个参数,Q必须能够向P提 阅读全文
摘要:
控制 CPU当然要提供一些指令和机制来允许开发者在其上构建出具有非完全顺序流程的程序了。 条件码 CPU维护者一组只有单个位的条件码寄存器,它们用来记录最近的算数或逻辑操作所产生的“副作用”。 CF:进位标志。最近的操作使最高位产生了进位,可以用来检查无符号操作的溢出。 ZF:零标志。最近的操作得到 阅读全文
摘要:
二进制小数 先来看看十进制小数的表示法: \[ d_md_{m-1}...d_1d_0.d_{-1}d_{-2}...d_{-n} \] 上面的十进制小数的值为: \[ d = \Sigma_{i=-n}^{m} d_i10^i \] 相应的,二进制也一样: \[ b_mb_{m-1}...b_1b 阅读全文
摘要:
整数表示 无符号 无符号整数就是正整数,它很简单,不用考虑负数该如何存储。 如果你用$w$位来存储一个无符号整数,如向量$\vec{x} = [x_{w-1}, x_{w-2},...,x_0]\(,那么你可以存储\)[0, 2^w - 1]$个整数。 我们定义一个函数来表示一个位向量B到一个无符号 阅读全文
摘要:
x86-64中的一些处理器状态 程序计数器:下一条将要执行的指令在内存中的地址 整数寄存器文件:有16个命名的位置,每个都能存储64位的值,可以存储地址或整数数据,它们根据命名的不同,经常被用于处理不同的数据。 条件码寄存器:保存最近执行的算数或逻辑指令的状态信息,可以用来实现条件或分支控制结构。 阅读全文
摘要:
卷简要介绍 ADD和COPY命令都可以将某一个目录或文件复制到Docker镜像中。不管怎样,这个文件最终都会成为镜像中的一个层。 卷则不同,卷是将一个宿主机上的目录挂载到容器中,你可以将一个目录挂载到多个容器中,使多个容器可以共同访问这个目录,并且该目录不受分层限制。 下面命令将宿主机当前目录下的n 阅读全文