计算机组成 -- First Draft
|Word Count:61|Reading Time:1mins
从输入设备读取输入信息,通过运算器和控制器来执行存储在存储器里的程序,最终把结果输出到输出设备中
参考资料
Author: zhongmingmao
Copyright Notice: All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
Related Articles

2020-01-11
计算机组成 -- 二进制编码
补码表示法 原码表示法 0011为3,1011为-3 缺点:0000和1000都表示为0 浪费 + 模凌两可 由此诞生了补码表示法,其实就是一个简单的翻转而已 用补码表示负数,使得整数的相加变得容易,不需要做任何特殊处理,当成普通的二进制相加即可 字符串 ASCII码类似一个字典,用8位二进制中的128个不同的数字,映射到128个不同的字符里 a在ASCII里面是第97个,二进制为0110 0001,对应的十六进制为0x61 字符串9用0011 1001来表示,字符串15用0011 0001和0011 0101来表示,占用更多的空间 因此存储数据的时候,要采用二进制序列化的形式, 而不是简单地把数据通过CSV或者JSON这样的文本格式存储来进行序列化 不管是整点数,还是浮点数,采用二进制序列化比存储文本能节省不少空间 字符集(Charset)和字符编码(Character Encoding) 字符集:字符的集合 Unicode是字符集,包含150种语言的14万个字符 字符编码:对于字符集里的这些字符,怎么用二进制表示出来的一个字典 Unicode可以用UTF-8、UTF-1...

2020-01-23
计算机组成 -- 虚拟机
解释型虚拟机 要模拟一个计算机系统,最简单的办法,就是兼容这个计算机系统的指令集 开发一个应用程序,运行在操作系统上,该应用程序可以识别想要模拟的计算机系统的程序格式和指令,然后一条条去解释执行 原先的操作系统称为宿主机(Host),有能力模拟指令执行的软件称为模拟器(Emulator) 实际运行在模拟器上被虚拟出来的系统,称为客户机(Guest VM) 这种方式和运行Java程序的JVM比较类似,只不过JVM运行的是Java中间代码(字节码),而不是一个特定的计算机系统的指令 真实的应用案例:Android模拟器、游戏模拟器 优势 模拟的系统可以跨硬件 Android用的是ARM CPU,开发机用的是Intel X86 CPU,两边的CPU指令集是不一样的,但一样可以正常运行 劣势 无法做到精确模拟 很多老旧的硬件的程序运行,需要依赖特定的电路乃至电路特有的时钟频率,很难通过软件做到100%模拟 性能很差 并不是直接把指令交给CPU去执行,而是要经过各种解释和翻译的工作 编译优化:Java的JIT 把本来解释执行的指令,编译成Host可以直接运行的指令 全虚拟化 全...

2020-01-07
计算机组成 -- 函数调用
程序栈123456789101112131415// function_example.c#include <stdio.h>int static add(int a, int b){ return a+b;}int main(){ int x = 5; int y = 10; int u = add(x, y);} 12$ gcc -g -c function_example.c$ objdump -d -M intel -S function_example.o 1234567891011121314151617181920212223242526272829303132333435363738......0000000000000000 <add>:......int static add(int a, int b){ 0: 55 push rbp 1: 48 89 e5 mov rbp,rsp 4...

2020-01-20
计算机组成 -- 超线程 + SIMD
超线程 – 线程级并行Pentium 4 Pentium 4失败的原因:CPU的流水线级数太深 超长的流水线,使得之前很多解决冒险、提升并发的方案都用不上 解决冒险、提升并发的方案,本质上是一种指令级并行的技术方案,即CPU希望在同一个时间,去并行执行两条指令 但这两条指令,原本在代码里是有先后顺序的 无论是流水线架构、分支预测以及乱序执行,还是超标量和超长指令字 都是想通过在同一时间执行两条指令,来提升CPU的吞吐率 但在Pentium 4上,上面这些方法都可能因为流水线太深,而起不到效果 更深的流水线意味着同时在流水线里面的指令就很多,相互的依赖关系就多 因此,很多时候不得不把流水线停顿下来,插入很多NOP操作,来解决这些依赖带来的冒险问题 超线程 无论是多个CPU核心运行不同的程序,还是单个CPU核心里切换运行不同线程的任务 在同一时间点上,一个物理的CPU核心只会运行一个线程的指令,其实并没有做到真正的指令级并行 超线程的CPU,把一个物理层面的CPU核心,伪装成两个逻辑层面的CPU核心 这个CPU会在硬件层面增加很多电路,使得可以在一个CPU核心内部,维护两个不同线程的指...

2020-01-15
计算机组成 -- 定点数 + 浮点数
浮点数的不精确性12>>> 0.3 + 0.60.8999999999999999 32bit是无法表达所有实数的,只能表达2^32次方不同的数字,差不多40亿 40亿个数字比起无限多的实数集合只是沧海一粟,应该让这40亿个数映射到实数集合上的哪些数字,在实际应用中才最划算 定点数 用4个bit表示0~9的整数,那么32个bit就可以表示8个这样的整数 然后把最右边的2个0~9的整数,当成小数部分;把最左边6个0~9的整数,当成整数部分 这样用32bit可以表示0.00~999999.99这1亿个实数 这种用二进制表示十进制的编码方式,称为BCD编码(Binary-Coded Decimal) 应用非常广泛:超市、银行 缺点 浪费 本来32bit可以表示40亿个不同的数字,但在BCD编码下,只能表示1亿个数 如果精确到分,能够表达的最大金额为100W,非常有限 无法同时表示很大的数字和很小的数字 浮点数 浮点数的科学计数法的表示,有一个IEEE的标准,定义了两个基本的格式 一个是用32bit表示单精度的浮点数,即float 一个是用64bit表示双精度的浮点数,即do...

2020-01-18
计算机组成 -- 冒险
冒险 流水线架构的CPU,是主动进行的冒险选择,期望通过冒险带来更高的回报 对于各种冒险可能造成的问题,都准备好了应对方案 分类 结构冒险(Structural Hazard) 数据冒险(Data Hazard) 控制冒险(Control Hazard) 结构冒险 结构冒险,本质上是一个硬件层面的资源竞争问题 CPU在同一个时钟周期,同时在运行两条计算机指令的不同阶段,但这两个不同的阶段可能会用到同样的硬件电路 内存的数据访问 第1条指令执行到访存(MEM)阶段的时候,流水线的第4条指令,在执行取指令(Fetch)操作 访存和取指令,都是要进行内存数据的读取,而内存只有一个地址译码器,只能在一个时钟周期内读取一条数据 无法同时执行第1条指令的读取内存数据和第4条指令的读取指令代码 解决方案 解决方案:增加资源 哈佛架构 把内存分成两部分,它们有各自的地址译码器,这两部分分别是存放指令的程序内存和存放数据的数据内存 缺点:无法根据实际情况去动态调整 普林斯顿架构 – 冯.诺依曼体系架构 今天使用的CPU,仍然是冯.诺依曼体系架构,并没有把内存拆成程序内存和数据内存两部分 ...
Announcement
Things are always unexpected!





