通过前面两篇文章的学习,外甥对电脑的产生了各种好奇,差点把自己电脑拆开来研究研究了

我觉得这种学习精神挺好的,假使她真的把电脑拆坏了,也是赞同的,毕竟这种学习的经历是在的

就在前几天外甥和我抱怨说只要应用打开的比较多或者网页打开比较多,电脑运行超级慢,卡顿半天

我就反手问了一句,你知道为什么么?

她故作无知冷冷的来了一句 不知道

我细细的讲起卡顿有几方面的原因:

  • 打开的app或者网页需要计算的数据量太大,计算机算力不足,此时计算机算力全部被征用了,无法在操作其他
  • 打开的app内存需求量大,打开app多或者单个app内存需求较大,会导致内存被占满,此时会发生磁盘和内存的交换,磁盘速度很慢
  • app需要读取大量磁盘数据,磁盘读写速度远远低于内存和CPU
  • 网络卡顿,app有网路交互情况,网路非常慢,app会经历超时和重试 巴拉巴拉说了一通,她估计实在忍不住了,打断说

我看了任务管理器,卡顿时内存爆满 100%状态,然后就加装了内存条,诡异的是情况并没有好转,让我非常不解。

问号? 我听到这里,就已经知道病症在那里了,32bit和64bit的问题,今天就给大家讲讲这个病症

文章大纲 32bit和64bit指的是什么? 记得校招面试那会儿,经常被面试官问到,你知道32位和64位的区别是什么么?

那时候我脱口而出 寻址能力不一样

现在看来,这个回答含糊不清、对也不对

首先,我们应该问清楚 32位和64位指的是软件呢?还是CPU呢?

就像上面外甥的描述,她加装了一个4G内存条,她的本原生有4G内存 共计8G内存,为何原来的内存问题还是复现呢?

这里有两个可能的原因:

  1. 她的操作系统软件是32位,但是CPU是64位的,这样一来的话,即使加装了内存也无法使用。 虽然你有能力了,但是被限制了发挥空间,也就废物一个了,此时她装一个64位的操作系统即可发挥8G内存的威力了。

  2. 32位的CPU,这样一来的话,内存加装到8G了,也无济于事,寻址能力跟不上。 上面两种情况,第一种是有能力,但被限制了,只要放开我,就还你一片天地;第二种是无能为力

所以当在聊32位和64位的问题时,要优先搞清楚说的是什么?

从上面的内容很容易看出来,所指对象不同,结果完全不同的,不可一概而论

32bit和64bit的区别 明白了32位和64位指代对象,现在来谈谈二者的区别,谈之前先温习下前面说的冯诺依曼结构

结构五件套就不说了,前面有文章专门介绍了 计算机如何组成的?

  • 输入设备

  • 输出设备

  • 存储器

  • 中央处理器

  • 控制器

说说五件套之间如何有效通信的

CPU 和内存以及其他设备之间,需要通信,因此我们用一种特殊的设备进行控制,就是总线。

总线分成 3 种:

  • 地址总线,专门用来指定 CPU 将要操作的内存地址
  • 数据总线,用来读写内存中的数据
  • 控制总线,用来发送和接收关键信号,比如中断信号,还有设备复位、就绪等信号,都是通过控制总线传输。CPU 需要对这些信号进行响应,这也需要控制总线。 当然,这和我们要说的32位和64位有什么关系呢?

32位和64位软件的区别 32位软件和64位软件的区别就是,指针的大小不同,也就是地址范围不同

估计一脸黑人问号,现在高级语言都不在使用指针这个概念了,龙叔还在说 指针 是不是不合时宜了

是的,高级语言除了C++还在谈指针,其他的语言如java、Python、go都已经不谈指针了

语言设计者不谈是为了给开发者减负,并不意味着就是没有了

指针非常核心,因为我们 访问内存数据必须依赖地址,指针就是地址

拉回来了,继续说32位软件和64位软件问题

软件设计者在设计软件时是32位的,意味着程序里面使用的指针都是4byte的,也就意味着最大能寻到的地址2^32次方,也就是4G。

所以当我们操作系统是32位时,最大只能访问到4G内存,不管我们加多大的内存条 都是无意义的

声明一下 操作系统也是一种软件 ,不过是一种系统软件

用户软件是依赖操作系统的寻址操作的,如果操作系统是32位,该操作系统下无法运行64位的用户软件

我们都知道,数据传递是通过高低电压控制的,高电平是1 低电平是0

龙叔在大学学习数字电路时经常搞这种操作,动不动就是用电路连接一个加法器

四位全加器实验 经常做实验就是搞几个芯片 通过电路去控制做一个加法器或者去在显示器上按照规则亮灭相应的二极管

说实话,大一让我搞这些 还是比较头疼的,动不动几个小时还没搞个所以然,现在看来不过尔尔

所以现在每当遇到困难时,我都假设自己处在未来某个时间点 来看当下的问题 最终就是不过尔尔

其实本质就是使用电平的高低变化去传输数据,一个高电平表示 1 低电平表示 0

假设我们只有一条地址线,一次传输只能是一个电平0或1,那你要传输一个数字10(二进制)就必须传输两次

这种只有一条地址总线进行数据传输的方式称为串行传输

假设我们有两条地址总线,一次就能传输两个电平,数字10就只需要传输一次就好

这种用多条地址总线,一次传输多个信号的方式就是并行传输

当 CPU 需要读写内存的时候,先要通过地址总线来指定内存地址,再通过数据总线来传输数据

所以我们地址总线的根数决定寻址的能力,当我们有32根地址总线时我们的寻址能力就是2^32=4G

32位CPU和64位CPU的区别 举个例子:用一个32位的CPU求和两个64位的数字

通常 32 位宽 CPU 最多操作 32 位宽的地址总线和数据总线

64 位宽 CPU 最多操作 64 位宽的地址总线和数据总线

这就存在一个问题,64位数字无法进行一次性传输到32位上让CPU进行计算

由上面的传输原则可知 必须把64位数字拆分为两个32数字进行传输

通过这个例子可以很明白的看到,32位的CPU和64位的CPU在控制总线上的能力不同

32位CPU和64位CPU的区别之一就是,CPU 的位宽决定能控制的总线根数,而总线的根数决定寻址能力

32位最大控制的总线为32根,最大寻址能力是4G,一次能传输最大字节数是4byte

64位最大控制的总线为64根,最大寻址能力是256TB,一次能传输的最大字节数是8byte

还可以看到的是,32位的CPU计算能力也是只能计算32位的数据,无法对64位的数据进行运算

这点可能不是很好理解,32位CPU一次读入只能读取32bit的数据,同时32位的CPU只有32位的寄存器

64位具有向下兼容特性,64位可以跑32位的软件,可以进行32位的计算

说到这里,再回想面试官问的问题,以及外甥女的不解 犹如明镜一般清澈无比

64的优势是什么? 接下来说说64位的优势到底是个啥

我们的CPU执行程序的步骤是:

  1. CPU读取PC指针指向的指令,简称取指(fetch)
  2. CPU 分析指令寄存器中的指令,确定指令的类型和参数,简称 解码(decode)
  3. 如果是计算类型的指令,那么就交给逻辑运算单元计算;如果是存储类型的指令,那么由控制单元执行 ,简称执行(execute)
  4. 将执行结果进行返回给寄存器或者将寄存器数据存入内存,简称 存储(store)
  5. PC 指针自增,并准备获取下一条指令 上面步骤是一个循环也称为CPU指令周期,CPU 的工作就是一个周期接着一个周期,周而复始。

指令周期 在CPU运行的周期中可以看到,有一个核心的部件 寄存器

上面用到了 程序寄存器 指令寄存器,寄存器本质就是指针,指针就是地址,地址就是一串数字编码

而决定这串数字编码的就是地址的大小,地址的大小由寻址能力决定,寻址能力就是总线的根数

总线的根数是由CPU的位数决定的

说到这里其实大家应该已经明白64位CPU的优势了,龙叔还是给个总结

64 位 CPU 可以执行更大数字的运算,具体多大呢?2^64这么大

这个优势在普通应用上不明显,但是对于数值计算较多的应用就非常明显

64 位 CPU 可以寻址更大的内存空间

如果 32 位/64 位说的是程序,那么说的是指令是 64 位还是 32 位的

32 位指令在 64 位机器上执行,困难不大,可以兼容。如果是 64 位指令,在 32 位机器上执行就困难了

32 位指令在 64 位机器执行的时候,需要的是一套兼容机制就OK了,但是 64 位指令在 32 位机器上执行,32 位的寄存器都存不下指令的参数。

操作系统也是一种程序,如果是 64 位操作系统,也就是操作系统中程序的指令都是 64 位指令,因此不能安装在 32 位机器上。

补充内容 前面提到了寄存器,很多人对寄存器非常陌生,这里详细讲解一下

CPU内部结构图 从上面的图中可以很明显的看到,图中虚线以内,寄存器是CPU内部集成的,内存是外部的

当我们访问内存时需要通过寄存器去找到对应的地址,再执行相应的指令

此时CPU会在数据总线上生成读取或写入内存的时钟信号,最后内存的内容会被CPU寄存器的内容更新或者读入

寄存器是啥,上面已经说了,寄存器就是一个指针,里面存放着地址

以上就是本期的所有内容了,我是龙叔,我们下期见

最后非常需要靓仔靓女们的分享、转发、点赞,这些都是我创作的动力,感谢大家