计算机组成 -- 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-03
计算机组成 -- 提升性能
CPU的功耗12CPU time = 时钟周期时间(Clock Cycle Time) × CPU时钟周期数(CPU Cycles) = 时钟周期时间(Clock Cycle Time) × 指令数 × 每条指令的平均周期数(Cycles Per Instruction,CPI) 80年代开始,CPU硬件工程师主要着力提升CPU主频,到功耗是CPU的人体极限 CPU,一般被叫做超大规模集成电路,这些电路,实际上都是一个个晶体管组合而成的 CPU计算,实际上是让晶体管里面的『开关』不断地去打开或关闭,来组合完成各种运算和功能 如果要计算得快,有两个方向:增加密度(7nm制程)、提升主频,但这两者都会增加功耗,带来耗电和散热的问题 密度 -> 晶体管数量 主频 -> 开关频率 如果功耗增加太多,会导致CPU散热跟不上,此时就需要降低电压(低压版CPU) 1功耗 ≈ 1/2 × 负载电容 × 电压的平方 × 开关频率 × 晶体管数量 并行优化 – 阿姆达尔定律1优化后的执行时间 = 受优化影响的执行时间 / 加速倍数 + 不受影响的执行时间 其它 加速大概率事...

2020-01-10
计算机组成 -- 动态链接
静态链接 把对应的不同文件内的代码段合并在一起,成为最后的可执行文件,可以做到代码在开发阶段的复用 很多程序都需要通过装载器装载到内存里面,里面链接好的同样的功能代码,也都需要再装载一遍,再占一遍内存空间 动态链接 动态链接过程中,需要链接的不是存储在硬盘上的目标文件代码,而是加载到内存中的共享库(Shared Libraries) 加载到内存中的共享库会被很多程序的指令调用 Windows的共享库文件是.dll(Dynamic-Link Libary)文件;Linux的共享库文件是.so(Shared Object)文件 地址无关 + 相对地址 要在程序运行时共享代码,这些机器码必须是地址无关的,即编译出来的共享库文件的指令代码,是地址无关码 地址无关码(PIC):Position-Independent Code,无论加载到哪个物理内存地址,都能够正常执行 大部分函数库都能做到地址无关,因为都是接受特定的输入,进行确定的操作,然后给出返回结果 对于所有动态链接共享库的程序来讲 虽然共享库用的都是同一段物理内存地址 但在不同的应用程序里,共享库所在的虚拟内存地址是不同的 不应该...

2020-02-03
计算机组成 -- DMA
背景 无论IO速度如何提升,比起CPU,还是太慢,SSD的IOPS可以达到2W,但CPU的主频有2GHz 对于IO操作,都是由CPU发出对应的指令,然后等待IO设备完成操作后返回,CPU有大量的时间都是在等待IO设备完成操作 在很多时候,CPU的等待是没有太多的实际意义的 对于IO设备的大量操作,其实都只是把内存里面的数据,传输到IO设备而已,此时CPU只是在傻等 当传输的数据量比较大的时候,如大文件复制,如果所有数据都要经过CPU,实在有点太浪费时间 因此发明了DMA技术,即直接内存访问(Direct Memory Access),来减少CPU等待的时间 协处理器 本质上,DMA技术就是在主板上一块独立的芯片 在进行内存和IO设备的数据传输的时候,不再通过CPU来传输数据 而直接通过DMA控制器(DMA Controller,DMAC),其实是一个协处理器(Co-Processor) DMAC最有价值的地方:当要传输的数据特别大,速度特别快,或者传输的数据特别小、速度特别慢的时候 用千兆网卡或者硬盘传输大量数据的时候,如果都用CPU来搬运的话,肯定忙不过来,可以选择DMAC 当数据传...

2020-01-16
计算机组成 -- 建立数据通路
三种周期指令周期 执行一条指令的过程 Fetch(取得指令) 从PC寄存器里面找到对应的指令地址,根据指令地址从内存里把具体的指令,加载到指令寄存器中 然后把PC寄存器自增,便于未来执行下一条指令 Decode(指令译码) 根据指令寄存器里面的指令,解析成要进行什么样的操作,是R、I、J中的哪一种指令 具体要操作哪些寄存器、数据或者内存地址 Execute(执行指令) 实际运行对应的R、I、J这些特定的指令,进行算术逻辑操作、数据传输或者直接的地址跳转 重复上面步骤 指令周期(Instruction Cycle):Fetch -> Decode -> Execute 涉及的组件 取指令的阶段,指令是放在存储器里的 通过PC寄存器和指令寄存器取出指令的过程,是由控制器(Control Unit)操作的 指令的解码过程,也是由控制器进行的 一旦到了执行指令阶段,R、I型指令都是由算术逻辑单元(ALU)操作 进行算术操作、逻辑操作的R型指令 进行数据传输、条件分支的I型指令 如果是简单的无条件地址跳转,可以直接在控制器里面完成,不需要用到运算器 机器周期 Mac...

2020-01-26
计算机组成 -- 高速缓存
缓存行1234567$ sysctl -a | grep -E 'cacheline|cachesize'hw.cachesize: 17179869184 32768 262144 6291456 0 0 0 0 0 0hw.cachelinesize: 64 # 64 Byteshw.l1icachesize: 32768 # 32 KBhw.l1dcachesize: 32768 # 32 KBhw.l2cachesize: 262144 # 256 KBhw.l3cachesize: 6291456 # 6 MB 1234567891011121314151617181920212223242526public static void f1() { int[] arr = new int[64 * 1024 * 1024]; long start = System.currentTimeMillis(); for (int i = 0; i < arr.length; i++) { arr[i] *= 3; ...

2020-01-04
计算机组成 -- 指令
CPU + 计算机指令 硬件的角度 CPU是一个超大规模集成电路,通过电路实现了加法、乘法乃至各种各样的处理逻辑 软件工程师的角度 CPU就是一个执行各种计算机指令的逻辑机器 计算机指令是一门CPU能听懂的语言,也称为机器语言 不同的CPU能够听懂的语言不太一样,两种CPU各自支持的语言,就是两组不同的计算机指令集 计算机程序平时是存储在存储器中,这种程序指令存储在存储器里面的计算机,叫作存储程序型计算机 代码 -> 机器码(编译 -> 汇编)1234567// test.cint main(){ int a = 1; int b = 2; a = a + b;} 编译(Compile)成汇编代码:把整个程序翻译成一个汇编语言(ASM,Assembly Language)的程序 汇编:针对汇编代码,用汇编器(Assembler)翻译成机器码(Machine Code) 机器码由0和1组成的机器语言表示,一串串的16进制数字,就是CPU能够真正认识的计算机指令 汇编代码 + 机器码12345678910$ gcc --help-c ...
Announcement
Things are always unexpected!




