计算机组成原理

重学计算机组成原理(十)- \"烫烫烫\"乱码的由来

 ̄綄美尐妖づ 提交于 2019-11-27 18:57:27
程序 = 算法 + 数据结构 对应到计算机的组成原理(硬件层面) 算法 --- 各种计算机指令 数据结构 --- 二进制数据 计算机用0/1组成的二进制,来表示所有信息 程序指令用到的机器码,是使用二进制表示的 存储在内存里面的字符串、整数、浮点数也都是用二进制表示的 万物在计算机里都是0和1,搞清楚各种数据在二进制层面是怎么表示的,是我们的必修课。 在实际应用中最常遇到的问题,也就是文本字符串是怎么表示成二进制的,特别是我们会遇到的乱码究竟是怎么回事儿 在开发的时候,所说的Unicode和UTF-8之间有什么关系。 理解了这些,相信以后遇到任何乱码问题,你都能手到擒来了。 1 理解二进制的“逢二进一” 二进制和我们平时用的十进制,并没有本质区别,只是平时是“逢十进一”,这里变成了“逢二进一” 每一位,相比于十进制下的0~9这十个数字,我们只能用0和1这两个数字。 任何一个十进制的整数,都能通过二进制表示出来 把一个二进制数,对应到十进制,非常简单,就是把从右到左的第N位,乘上一个2的N次方,然后加起来,就变成了一个十进制数 当然,既然二进制是一个面向程序员的“语言”,这个从右到左的位置,自然是从0开始的。 比如_0011_这个二进制数,对应的十进制表示,就是 \(0×2^3+0×2^2+1×2^1+1×2^0\) \(=3\) 代表十进制的3 对应地,如果我们想要把一个十进制的数

深入浅出计算机组成原理学习笔记:机械硬盘-Google早期用过的“黑科技(第45讲)

蓝咒 提交于 2019-11-27 13:26:32
在1991年,我刚接触计算机的时候,很多计算机还没有硬盘。整个操作系统都安装在5⼨或者3.5寸的软盘里。不过,很快⼤部分计算机都开始⽤上了直接安装在主板上的机械硬盘。 到了今天,更早的软盘早已经被淘汰了。在个人电脑和服务器里,更晚出现的光盘也已经很少用了。 机械硬盘的生命力仍然非常顽强。无论是作为个人电脑的数据盘,还是在数据中心里面用作海量数据的存储,机械硬盘仍然在被大量使用。不仅如此, 随着成本的不断下降,机械硬盘还替代掉了很多传统的存储设备,比如,以前常常⽤来备份冷数据的磁带。 那这一讲里,我们就从机械硬盘的物理构造开始,从原理到应用剖析一下,看看我们可以怎么样用好机械硬盘。 一、拆解机械硬盘 1、盘面 1、定义 2、材质 3、数据存储在哪里 4、什么控制盘面旋转 5、硬盘购买指标 2、磁头 1、磁头的作用 2、一个片面上通常有几个磁头? 3、一块硬盘有多少个盘面? 3、悬臂 1、从原理方面 2、盘面像什么? 4、数据是怎么存到盘片上 我们刚才说的一个磁道,会分成一个一个扇区(Sector) 上下平行的一个一个盘面的相同扇区呢,我们叫作一个柱面(Cylinder) 1、步骤一 2、步骤二 3、平均延时 4、平均寻道时间 二、PartialStroking:根据场景提升性能 1、缩短行程 2、缩短行程 最极端的情况是不寻道 只用1/2或者1/4的磁道 3、在当时那个更划算

深入浅出计算机组成原理学习笔记:理解IO_WAIT-IO性能到底是怎么回事儿?(第44讲)

陌路散爱 提交于 2019-11-27 13:26:12
在专栏一开始的时候,我和你说过,在计算机组成原理这门课里面,很多设计的核心思路,都来源于性能。在前免讲解CPU的时候,相信你已经有了切身的感受了。 大部分程序员开发的都是应⽤系统。在开发应用系统的时候,我们遇到的性能瓶颈大部分都在I/O上。在第36讲讲解局部性原理的时候,我们一起看了通过把内存当作是缓存, 来提升系统的整体性能。在第37讲讲解CPU Cache的时候,我们一起看了CPU Cache和主内存之间性能的巨大差异 然而,我们知道,并不是所有问题都能靠利⽤内存或者CPU Cache做一层缓存来解决。特别是在这个“大数据”的时代。我们在硬盘上存储了越来越多的数据, 一个MySQL数据库的单表有个几千万条记录,早已经不算是什么罕见现象了。这也就意味着,用内存当缓存,存储空间是不够用的。大部分时间, 我们的请求还是要打到硬盘上。那么,这⼀讲我们就来看看硬盘I/O性能的事儿。 一、随机IO 1、硬盘厂商 2、数据传输率 HDD硬盘 SSD硬盘 3、响应时间 Acc.Time 指标和日常的经验不符啊 光看响应时间和吞吐率这两个指标,似乎我们的硬盘性能很不错、我们平时往数据库里写入一条记录,也就是1KB左右的大小。我们拿200MB去除以1KB, 也能够在几毫秒时间返回、一秒钟能够传输的数据,也有200MB左右 顺序读写和随机读写 随机读写 顺序读写 二

深入浅出计算机组成原理学习笔记:输⼊输出设备:我们并不是只能⽤灯泡显⽰“0”和“1”(第43讲)

谁说胖子不能爱 提交于 2019-11-27 10:59:13
我们在前面的章节搭建了最简单的电路,在这里面,计算机的输入设备就是一个一个开关,输出设备呢,是一个一个灯泡。的确,早期发展的时候,计算机的核心是做“计算”。 我们从“计算机”这个名字上也能看出这艺点。不管是中文名字“计算机”,还是英文名字“Computer”,核⼼都是在”计算“这两个字上。不过,到了今天,这些“计算”的贡作,更多的是艺个幕后工作。 我们讨论是使用自己的PC,还是智能手机,这部分时间都是在和计算机进行各种“交互操作”。换句话说,就是在和输入输出设备打交道。这些输入输出设备也不再是个一个开关, 或者一个一个灯泡。你在键盘上直接敲击的都是字符,而不是“0”和“1”,你在显示意器上看到的,也是直接的图形或者文字的画面,而不是一个一个闪亮或者关闭的灯泡。 想要了解这其中的关窍,那就请你和我一起来看一看,计算机里面的输入输出设备。 一、经典的适配器模式 1、硬件设备并不是直接和CPU直接通信的 2、内置在主板上的接口 3、CPU的三级缓存 二、经典的适配模式 1、把接口和实际设备分离 2、软件的设计模式口 3、Windows操作系统 三、CPU是如何控制I/O设备的? 首先是数据寄存器 然后是命令寄存器 而状态寄存器 四、发挥总线的价值 1、MIPS的CPU到底是如何通信 2、IntelX86 这个,其实也有点像我们在设计模式⾥⾯的Command模式。我们在总线上传输的

深入浅出计算机组成原理学习笔记:总线-计算机内部的高速公路(第42讲)

廉价感情. 提交于 2019-11-27 10:33:10
专栏讲到现在,如果我再问你,计算机五大组成部分是什么,应该没有人不知道了吧?我们这一节要讲的内 容,依然要围绕这五大部分,控制器、运算器、存储器、输入设备和输出设备。 CPU所代表的控制器和运算器,要和存储器,也就是我们的主内存,以及输入和输出设备进行通信。那问题来了,CPU从我们的键盘、鼠标接收输入信号,向显示器输出信号, 这之间究竟是怎么通信的呢?换句话说,计算机是用什么样的方式来完成,CPU和内存、以及外部输入输出设备的通信呢? 这个问题就是我们今天要讲的主题,也就是 总线。之前很多同学留言问,我什么时候会讲一讲总线。那这一讲,你就要听仔细了。 一、降低复杂性 1、设备间的通信,都是互相之间单独进行的 2、怎么降低复杂度呢 3、总线 4、事件总线(Event Bus)的设计模式 二、三种线路多种架构 1、三种线路 2、前端总线 3、以上案例就利用了局部性原理 三、总结延伸 好了,你现在明白计算机里的总线、各种不同的总线到底是什么意思了吧?希望这一讲能够帮你厘清计算机总线的知识点。现在我们一起来总结梳理一下这节的内容。 这一讲,我为你讲解了计算机里各个不同的组件之间用来通信的渠道,也就是总线。总线的设计思路,核心是为了减少多个模块之间交互的复杂性和耦合度。 实际上,总线这个设计思路在我们的软件开发过程中也经常会被用到。事件总线就是我们常见的一个设计模式

重学计算机组成原理(五)- \"旋转跳跃\"的指令实现

不问归期 提交于 2019-11-27 06:21:06
CPU执行的也不只是一条指令,一般一个程序包含很多条指令 因为有if…else、for这样的条件和循环存在,这些指令也不会一路平直执行下去。 一个计算机程序是怎么被分解成一条条指令来执行的呢 1 CPU如何执行指令 CPU里差不多几百亿个晶体管 实际上,一条条计算机指令执行起来非常复杂 好在CPU在软件层面已经为我们做好了封装 对于程序员来说,我们只要知道,写好的代码变成了指令之后,是一条一条 顺序执行 不管几百亿的晶体管的背后是怎么通过电路运转起来的 逻辑上,我们可以认为,CPU其实就是由一堆寄存器组成的 而寄存器就是CPU内部,由多个触发器(Flip-Flop)或者锁存器(Latches)组成的简单电路。 触发器和锁存器,其实就是两种不同原理的数字电路组成的逻辑门 如果想要深入学习的话,可以学习数字电路的相关课程 N个触发器或者锁存器,就可以组成一个N位(Bit)的寄存器,能够保存N位的数据 比方说,我们用的64位Intel服务器,寄存器就是64位的 CPU里有很多种不同功能的 1.1 寄存器 寄存器(Register),是中央处理器内的其中组成部分。寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令、数据和地址。在中央处理器的控制部件中,包含的寄存器有指令寄存器(IR)和程序计数器。在中央处理器的算术及逻辑部件中,包含的寄存器有累加器。 在计算机体系结构里

深入浅出计算机组成原理学习笔记:存储器层次结构全景-数据存储的大金字塔长什么样?(第35讲)

夙愿已清 提交于 2019-11-26 19:06:14
一、理解存储器的层次结构 1、和阅读书籍做个对照 1、CPU比喻成计算机的“大脑”我们思考的东西、就好比CPU中的 寄存器 2、而我们大脑中的记忆,就好比 CPU Cache 2、SRAM 1、SRAM为什么被称为静态存储器 2、SRAM的存储密度不高 3、不过,因为SRAM的电路简单,所以访问速度非常快 3、CPU的三级缓存 1、L1 2、L2 3、L3 4、和阅读对比 4、DRAM 1、和SRAM对比 2、存储器类型 3、存储容量更大 4、如何保持数据不丢失 二、存储器的层次结构 1、本质 2、大脑(CPU)中的记忆(L1 Cache) 3、我们自己的书房和书桌大脑 4、CPU并不是直接和每一种存储器设备打交道 三、现在主流的笔记本电脑分析 使用存储器的时候,该如何权衡价格和性能? 存储器在不同层级之间的性能差异和价格差异,都至少在一个数量级以上。L1 Cache的访问延时是1纳秒(ns),而内存就已经是100纳秒了。在价格上,这两者也差出了400倍。 我这里放了一张各种存储器成本的对比表格,你可以看看。你也可以在点击这个链接,通过拖拉,查看1990~2020年随着硬件设备的进展,访问延时的变化。 因为这个价格和性能的差异,你会看到,我们实际在进行电脑硬件配置的时候,会去组合配置各种存储设备。 我们可以找一台现在主流的笔记本电脑来看看,比如,一款入门级的惠普战66的笔记本电脑

深入浅出计算机组成原理学习笔记:建立数据通路(上)-指令more运算=CPU(第17讲)

倖福魔咒の 提交于 2019-11-26 19:06:11
一、引子 1、指令 2、计算 然而,光知道这两部分还不能算是真正揭开了CPU的秘密,只有把“指令”和“计算”这两部分功能连通起来,我们才能构成一个真正完整的CPU。 这一讲,我们就在前面知识的基础上,来看一个完整的CPU是怎么运转起来的。 二、指令周期 1、计算机每执行一条指令的过程 4.重复进行1~3的步骤。 这样的步骤,其实就是一个永不停歇的“ Fetch - Decode - Execute”的循环,我们把这个循环称之为 指令周期(Instruction Cycle)。 2、什么是指令周期 3、不同步骤在不同组件之内完成 三个周期之间的关系 4、CPU周期 5、时钟周期 三、建立数据通路 1、第一类操作元件 2、第二类存储元件 3、什么是数据通路 4、控制器 听起来是不是很简单?实际上,控制器的电路特别复杂。下面我给你详细解析一下。 一方面,所有CPU支持的指令,都会在控制器里面,被解析成不同的输出信号。我们之前说过,现在的IntelCPU支持2000个以上的指令。这意味着, 控制器输出的控制信号,至少有2000种不同的组合。 运算器里的ALU和各种组合逻辑电路,可以认为是一个固定功能的电路。控制器“翻译”出来的,就是不同的控制信号。这些控制信号,告诉ALU去做不同的计算。 可以说正是控制器的存在,让我们可以“编程”来实现功能,能让我们的“存储程序型计算机”名副其实。

深入浅出计算机组成原理学习笔记:局部性原理-数据库性能跟不上,加个缓存就好了(第36讲)

半腔热情 提交于 2019-11-26 19:06:09
平时进行服务端软件开发的时候,我们通常会把数据存储在数据库里。而服务端系统遇到的第一个性能瓶颈,往往就发生在访问数据库的时候。 这个时候,大部分工程师和架构师会拿出一种叫作“缓存”的武器,通过使用Redis或者Memcache这样的开源软件,在数据库前面提供一层缓存的数据, 来缓解数据库面临的压力,提升服务端的程序性能。                            在数据库前添加数据缓存是常见的性能优化方式 那么,不知道你有没有想过,这种添加缓存的策略一定是有效的吗?或者说,这种策略在什么情况下是有效的呢?如果从理论角度去分析, 添加缓存一定是我们的最佳策略么?进一步地,如果我们对于访问性能的要求非常高,希望数据在1毫秒,乃至100微妙内完成处理,我们还能用这个添加缓存的策略么? 一、局部性原理 可以看到,不同的存储器设备之间,访问速度、价格和容量都有几十乃至上千倍的差异。 1、时间局部性 同一份数据在短时间内会反复多次被访问 2、空间局部性 相邻的数据会被连续访问 3、局部性和空间局部性实际在存储中的应用 二、具体案例分析过程 1、案例需求描述 2、把数据放在内存 3、在内存里放前1%的热门商品 4、以上案例就利用了局部性原理 三、如何花最少的钱,装下亚马逊的所有商品? 1、痛点 2、内存的随机访问请求需要100ns 3、估算每天的活跃用户为1亿 4、缓存没有命中 当然

深入浅出计算机组成原理学习笔记:深入理解浮点数到底有什么用?(第16讲)

℡╲_俬逩灬. 提交于 2019-11-26 14:14:25
你是不是感到很疑惑,浮点数的近似值究竟是怎么算出来的?浮点数的加法计算又是怎么回事儿?在实践应用中,我们怎么才用好浮点数呢?这一节,我们就一起来看这几个问题 一、浮点数的二进制转换 1、十进制浮点数9.1 2、小数的二进制表示是怎么回事 3、浮点数其实是用二进制的科学计数法来表示的 4、为什么0.3+0.6=0.899999? 二、浮点数的加法和精度 1、浮点数的加法原理 2、比如0.5,表示成浮点数 实现这样一个加法,也只需要位移。和整数加法类似的半加器和全加器的方法就能够实现,在电路层面,也并没有引入太多新的复杂性。 3、这个加法计算的浮点数的结果是不是正确 1、先对齐 2、在加法发生之前,就丢失精度 3、32位浮点数的加法 你可以试一下,我下面用一个简单的Java程序,让一个值为2000万的32位浮点数和1相加,你会发现,+1这个过程因为精度损失,被“完全抛弃”了。 public class FloatPrecision { public static void main(String[] args) { float a = 20000000.0f; float b = 1.0f; float c = a + b; System.out.println("c is " + c); float d = c - a; System.out.println("d is " + d)