- 原码(sign magnitude) 反码(one’s complement) 补码(two’s complement)
- **原码:**只有最前面一位表示符号位 这种是机器数编码方式中的一种。而其他的几种方法就是反码和补码。
- 计算法则:两数符号相同: 低位相加,最高位的符号位不变(当低位相加产生进位时,溢出 Overflow) 两数符号不同: 比较绝对值的大小,差的绝对值 = 大数 - 小数 ,符号位和大数的符号位相同。
- 缺点:原码中符号位不能直接参与运算,必须有单独的线路来确定符号位。而且原码的计算不能避免减法运算 而加法器和减法器又是不同的线路。而且0的编码方式还是不唯一的。
- 总结:虽然原码编码方式接近人类习惯 但是不适合在计算机中使用。因此引入反码。
- **反码:**编码规则:正数的反码等于原码 负数的反码等于符号位不变 其他位取反。(即 -176转化为 (999-176)+ 1 - 1000)
- 计算法则:不用区分符号和绝对值 直接进行计算 如果计算结果有移除 则将溢出位加到最低位(循环进位)
- 优点:电路简单 因为正数和负数的加法都一样计算
- 缺点:需要可以执行循环进位的硬件电路 而且0的编码方式仍然有两种。为了解决这种缺点 补码被发明了出来。
- **补码:**正数的补码=原码, 负数的补码=反码+1 意思就是说-176被表示成了 (1000-176)-1000
- 计算法则:采用补码的系统 减法被完全转化为加法,忽略计算结果最高位的进位(即不用循环进位)
- 优点:不用考虑循环进位 0的表示也只有一种。
溢出
除法计算
- 除法可以用减法实现
- 也可以先计算 1/B 再乘以A(牛顿法)
- 或者移位计算
牛顿法
fixed point and floating point
- 这些都是计算机发展过程中提出的多种方法表达实数,在定点数的表达方式中 小数点固定于实数所有数字中间的某个位置,比如说99.00就可以说是有四位精度。
- 因为定点数表达过于僵硬,因此引入浮点数的概念,浮点数包括尾数,基数和指数组成。根绝基数的不同 可以有十进制浮点数和二进制浮点数。单精度浮点数32位 组成是1+8+23, 双精度64位 组成是1+11+52.
计算机硬件层级关系
- 晶体管transistors组成电路circuits
- 电路circuits组成逻辑门logic gates
- logic gates可以组成combinational logic 和 memory, 上两者又可以组成sequential circuits. 然后这三者一起组成CPU。
adder circuit
- 这是一种能够执行加法的电路
- PPT上有几个问题还很有意思 比如说what is C0?溢出如何处理?最高进位Cn怎么处理?
- 接下来的full adder电路就完全解决了这个问题:只有在两个被加数和进位数中有奇数个1的时候 此位才是1 否则是0.
DeMorgan’s Law
- 本定律是在说 OR 逻辑电路和 AND逻辑电路是可以相互转化的 只要在OR电路的两个输入以及一个输出处加反,就可以变成AND 反之亦然。
- 作用:我们可以只用NAND逻辑门实现所有的逻辑电路(为什么只用NAND?因为NAND比AND/OR要快)
Logical Completeness
- {AND, OR, NOT}
- {NAND}
- {NOR}
ALU(Arithmetic/logic unit)
- 这种东西是一种总称 是所有add circuit that can perform: 加减乘除法和logic operations。
- ALU作用于 一内存单元大小的数据
Combinational logic circuits
- 之前谈论过的电路都是这种电路
- 其特点有:没有feedback signals, 输出只是输入的函数,改变输入立刻会改变输出。不需要内存作为支撑
Memory
-内存的作用是暂时存放在CPU中进行的运算数据 以及硬盘与外部储存器交换的数据。
什么是内存?组成成分又有哪些呢?内存一般采用半导体储存单元 包括RAM ROM CACHE. RAM下面的SDRAM是同步动态随机存取储存器。还有DRAM和SRAM 即动态和静态.
D Latch
- 他是一个具有记忆功能的 具有两个稳定状态的信息储存器件。他是构成多种时序电路的基本逻辑单元
Instruction Set Architecture
- 译名:指令集架构,是计算机结构体系中与程序设计有关的部分,包含了基本数据类型 指令集 寄存器 寻址模式 中断 异常处理以及外部IO。指令集架构包含一系列的opcode(操作码),以及由特定处理器执行得基本命令。https://zh.wikipedia.org/wiki/%E6%8C%87%E4%BB%A4%E9%9B%86%E6%9E%B6%E6%A7%8B
- 不同的处理器家族(Intel和IBM和arm)有不同的指令集架构
- 广义的来说 指令集架构定义了计算机硬件和软件之间的接口 在计算机层次中属于中间位置。
- 具体的来说 ISA定义了机器的关键参数(各类型数据所占位数,地址的位数),定义了CPU能够执行的instruction. 定义了CPU中的哪些能被programmer所看到(比如说program counter:下一个要被执行得指令的地址)。
- ISA有哪些主要种类?zero address, one address, two address, three address.这些都是什么意思?没看懂
https://www.cnblogs.com/yilang/p/10967374.html
什么是sequential circuits(state machine)
- 与cmbinational circuits相比:SC是记忆化的电路,输出不是只与当前输入有关,还可能与之前输入有关(分为两类:mealy machine: 输出取决于当前的状态和当前输入。 moore machine:输出只取决于当前状态)
- 设计seq cir,有两个核心函数需要确定:第一个是next_state_function f_ns(current_state, input) 第二个是f_o(current_state)
FSM vs Computer
- finite state machine:有限状态机,是表示有限个状态以及在这些状态之间转移和动作的行为的数学计算模型。
- 有限状态机的类别有:接受和识别器/变换器。接受和识别器输出是或者否老回答输入是否被机器所接受。 变换器使用内置动作 基于给定的输入 和/或 状态生成输出。它们用于控制应用。常分为两种类型:moore机和mealy机,前者输出只依赖于状态 后者的输出依赖于输入和状态。
如何设计FSM
- the behaviour of a finite state machine is specified by a state diagram. so the first step is we are gonna to develop state disgram.
- then we need to determine the next state function and output function
- 具体的例子 请见slides的example of candy machine
储存器的分类
- 大的方向上来说,储存器分为内部储存器和外部储存器,内部储存器叫内存,就是memory,分为RAM和ROM,RAM是随机存取储存器,对于CPU来说,RAM是主要存储数据和程序的地方,因此也叫主存(main memory),RAM断电数据即丢失。ROM(只读储存器),他只能读取数据,但是断电数据仍然保留
Conditional Code register
- 与之前讲过的整数寄存器(32位CPU中包含的一组8个32位值的寄存器,它可以储存一些地址或者整数的数据 有的用来记录某些重要的程序状态,有些用来保存临时数据)相对应,条件码寄存器是由单个位组成的寄存器(即只能表示0/1),当有算数与逻辑操作发生时 这些条件寄存器当中的值也会相应发生变化,也就是说可以通过检测这些寄存器来执行条件分支命令。
- 种类有:CF, ZF, SF, OF
Index Address Mode
- memory address computed by adding an offset to a base register
opcode
- 操作码 编译器的作用 就是将高级语言写好的程序 翻译成一条条操作码 因此操作码可以理解成机器能看懂的语言
Machine organization
- 用来实现ISA
- 主要有以下分类:main memory, register, adders
CPU
- 包含两部分 数据路径和控制单元
- 数据路径设计:register, arithmetic circuits, wires
- 控制单元设计:FSM设计
interpreters & compiler
http://huang-jerryc.com/2016/11/20/do-you-konw-the-different-between-compiler-and-interpreter/
- compiler是一种计算机程序 负责把一种编程语言编写的原码转化成另外一种计算机代码,转化的目的是生成可执行程序。
- interpreter:是一种计算机程序 他直接执行编程语言或者脚本语言编写的代码 并不会把源代码预编译成机器码,他就像黑盒子一样 我们输入原码 他会实时返回结果。
- 为什么人们常说C要比python快?因为C需要用compiler把HLL转化成机器语言 然后直接交给CPU硬件解释器。而python用的是软件解释器 虽然不需要compiler,但是效率较低。
program counter(PC)
mux
- 多路复用器(multiplexer)
- 是一种可以从多个模拟或者数字信号中选择一个信号进行输出的器件。比如说一个有2^n个输入端的数据选择器有n个可选择的输出线路。 这每个选择0或者1组成的n位,对应选择2 ^n个输入端的一个,选择了某个之后 只有那个能够顺利到达输出端 其余的输入都被暂时搁置。
- 作用:用于增加一定量时间和带宽内可以通过网络发送的数据量。
- 用例:电话线每家每户都有 但是采用多路复用器可以使得很多户共同使用一个输出通道。
CPU design process
- = Data path design (PC, registers, condition codes, MAR, MDR, IR, ALUs)+ control unit design
race condition:
- 是concurrency 出的bug的一种 一般是由:an unexpected sequence of operations executed by different threads, leading to erroneous results. 即不同的线程执行operations顺序不一样 造成了错误的结果。
- race condition的解决方法是 在代码中添加一块 critical section. 这块section的作用是保证了在某一个确定的时间点最多只有一个线程在运行。因此 代码中的对shared variable的获取和修改部分 一定要被放入critical section中。
- 那么critical section如何具体去添加呢?slides提供了一种方法 但是很快就被否决了(虽然为什么否决也看不懂)后面提供了解决方法: 如果硬件支持read,modify,write a memory location as one atomic operation 那么就能实现添加critical section以皮面race condition.
Deadlock
- DeadLock就是每个线程都在等待其他线程
- Deadlock很容易检测出来
- Deadlock检测出来之后也可以很容易的去解决。解决方法就是 确定一个固定的sequence(非环)来避免
值传递和引用传递
the run time stack
- runtime stack是一片内存域 用来储存function call的返回值的
- 这片区域不只是储存函数的返回值 还有传入函数的实参与形参,函数中生命的局部变量都储存在run time stack中
CPU pipeline(流水线)
- 流水线 就是将一整件需要重复做的事情切割成不同的阶段,每一个阶段由独立的单元负责,所有有待被服务的对象依次进入服务。这样的话 所有的独立单元可以不间断的进行工作,系统同时服务的客户也提高到了独立单元的个数倍。也就是说 我们不要让每位顾客等待时间过长(让他们在等待的过程中知道进度如何)。对应到CPU中 每一条指令的执行过程可以切割成: fetch instruction, decode it, find operand, perform action, score result.
- 这种流水线技术 是指在程序执行时 多条指令重叠进行操作的一种准并行处理实现技术,它能够实现在一个CPU时钟周期内完成一条指令 提高了CPU的运算速度(因为所有的电路任何时候都没有idle的)
locality of reference
- 又叫局部性原理 是取决于储存器访问模式频繁访问相关值或者相关储存位置的现象的术语。其有两种基本类型 时间局部性和空间局部性。时间(temporal locality)局部性是指recently 访问过的 空间(spatial locality)局部性是指储存位置很近的
register file
- 寄存器堆 他是在CPU中由多个寄存器组成的阵列。他是指令集架构的一部分。
k-way set associative cache
- https://www.jianshu.com/p/2b51b981fcaf
- 根据上面连接的内容 我们从头谈起:
- 我们知道 数据在主存和缓存之间以固定大小的block为单位传递,也就是每次从main memory读取最小的数据单元,每个块大小可能是4,8,16bytes,目前常用的x86 基本上是64bytes.这种数据单元称之为cache line,里面包含了数据 地址信息和状态信息。
- cache 的替换策略决定了主存中的数据块会拷贝到cache中的哪个位置。如果对于一块数据只有一个cacheline与之对应,我们称之为直接映射,如果与cache中的任意一个cache line相对应 我们称之为全相联,因此k way就是指与k个cache line相连。
- 究竟选多少way, 根绝tradeoff策略来。