64位和32位相比优势是什么(一)

2023-10-31

前置知识:程序是如何执行的?

一道常规的面试题:相比 32 位,64 位的优势是什么

面试官考察这种类型的问题,主要是想看求职者是否有扎实的计算机基础,同时想知道求职者在工作中是否充满好奇,会主动学习、寻根问底,毕竟 32、64 位是经常出现在程序员视野的词汇,常见的东西都弄明白了,那说明这个人学习能力强。

其实 ,面试官在这里给你挖了一个陷阱,因为他没有说清楚 32、64 位指的是操作系统、是软件、还是 CPU?

  • 如果是软件,那么我们的数据库有 32 位和 64 位版本;

  • 如果是操作系统,那么在阿里云上选择 Centos 和 Debian 版本的时候,也会有 32/64 版本;

  • 如果是 CPU,那么有 32 位 CPU,也有 64 位 CPU。

接下来请你带着问题开始今天的课程学习,本课时的重点是带你学懂程序执行的原理。

图灵机的构造

想要学懂程序执行的原理,就要从图灵机说起了。它在计算机科学方面有两个巨大的贡献:

第一,它清楚地定义了计算机能力的边界,也就是可计算理论;

第二,它定义了计算机由哪些部分组成,程序又是如何执行的。

在这里插入图片描述

我们先来看一看图灵机的内部构造:

  1. 图灵机拥有一条无限长的纸带,纸带上是一个格子挨着一个格子,格子中可以写字符,你可以把纸带看作内存,而这些字符可以看作是内存中的数据或者程序。

  2. 图灵机有一个读写头,读写头可以读取任意格子上的字符,也可以改写任意格子的字符。

  3. 读写头上面的盒子里是一些精密的零件,包括图灵机的存储、控制单元和运算单元。

图灵机如何执行程序

下面我们来举一个例子,让大家弄清楚图灵机是如何工作的,比如我们要计算 11 + 15 的值,具体的运算步骤如下:

  • 首先,我们将“11、15、+” 分别写入纸带上的 3 个格子(现在纸带上的字符串是11、15、 +),然后将读写头先停在 11 对应的格子上。

在这里插入图片描述

  • 接下来,图灵机通过读写头读入 11 到它的存储设备中(这个存储设备也叫作图灵机的状态)。图灵机没有说读写头为什么可以识别纸带上的字符,而是假定读写头可以做到这点。

在这里插入图片描述

  • 然后读写头向右移动一个格,用同样的方法将 15 读入图灵机的状态中。现在图灵机的状态中有两个连续的数字,11 和 15。

在这里插入图片描述

  • 接下来重复上面的过程,会读到一个+号。下面我详细说一下这个运算流程:

    • 读写头读到一个 + 号 ;

    • 然后将 + 号传输给控制单元 ;

    • 控制单元发现是一个 + 号,所以没有存入状态中。因为 + 号是一个我们预设的控制符(指令),它的作用是加和目前状态。因此,控制单元识别出是控制符,并通知运算单元工作;

    • 运算单元从状态中读入 11、15 并进行计算,将结果 26 存储到状态;

    • 运算单元将结果回传给控制单元;

    • 控制单元将结果传输给读写头。

在这里插入图片描述

  • 读写头向右移动,将结果 26 写入纸带。

在这里插入图片描述

这样,我们就通过图灵机计算出了 11+15 的值。不知道你有没有发现,图灵机构造的这一台机器,主要功能就是读写纸带然后计算;纸带中有数据、也有控制字符(也就是指令),这个设计和我们今天的计算机是一样的。

图灵通过数学证明了,一个问题如果可以拆解成图灵机的可执行步骤,那问题就是可计算的。另一方面,图灵机定义了计算机的组成以及工作原理,但是没有给出具体的实现。

冯诺依曼模型

在这里插入图片描述

具体的实现是 1945 年冯诺依曼和其他几位科学家在著名的 101 页报告中提出的。报告遵循了图灵机的设计,并提出用电子元件构造计算机,约定了用二进制进行计算和存储,并且将计算机结构分成以下 5 个部分:

  1. 输入设备;

  2. 输出设备;

  3. 内存;

  4. 中央处理器;

  5. 总线。

这个模型也被称为冯诺依曼模型,下面我们具体来看看这 5 部分的作用。

内存

在冯诺依曼模型中,程序和数据被存储在一个被称作内存的线性排列存储区域。存储的数据单位是一个二进制位,英文是 bit。最小的存储单位叫作字节,也就是 8 位,英文是 byte,每一个字节都对应一个内存地址。内存地址由 0 开始编号,比如第 1 个地址是 0,第 2 个地址是 1, 然后自增排列,最后一个地址是内存中的字节数减 1。

我们通常说的内存都是随机存取器,也就是读取任何一个地址数据的速度是一样的,写入任何一个地址数据的速度也是一样的。

CPU

冯诺依曼模型中 CPU 负责控制和计算。为了方便计算较大的数值,CPU 每次可以计算多个字节的数据。

  • 如果 CPU 每次可以计算 4 个 byte,那么我们称作 32 位 CPU;

  • 如果 CPU 每次可以计算 8 个 byte,那么我们称作 64 位 CPU。

这里的 32 和 64,称作 CPU 的位宽。

为什么 CPU 要这样设计呢? 因为一个 byte 最大的表示范围就是 0~255。比如要计算 20000*50,就超出了byte 最大的表示范围了。因此,CPU 需要支持多个 byte 一起计算。当然,CPU 位数越大,可以计算的数值就越大。但是在现实生活中不一定需要计算这么大的数值。比如说 32 位 CPU 能计算的最大整数是 4294967295,这已经非常大了。

控制单元和逻辑运算单元

CPU 中有一个控制单元专门负责控制 CPU 工作;还有逻辑运算单元专门负责计算。具体的工作原理我们在指令部分给大家分析。

寄存器

CPU 要进行计算,比如最简单的加和两个数字时,因为 CPU 离内存太远,所以需要一种离自己近的存储来存储将要被计算的数字。这种存储就是寄存器。寄存器就在 CPU 里,控制单元和逻辑运算单元非常近,因此速度很快。

  • 寄存器中有一部分是可供用户编程用的,比如用来存加和指令的两个参数,是通用寄存器

  • 还有一部分寄存器有特殊的用途,叫作特殊寄存器。比如程序指针,就是一个特殊寄存器。它存储了 CPU 要执行的下一条指令所在的内存地址。注意,程序指针不是存储了下一条要执行的指令,此时指令还在内存中,程序指针只是存储了下一条指令的地址。

  • 下一条要执行的指令,会从内存读入到另一个特殊的寄存器中,这个寄存器叫作指令寄存器。指令被执行完成之前,指令都存储在这里。

总线

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

  • 一种是地址总线,专门用来指定 CPU 将要操作的内存地址。

  • 还有一种是数据总线,用来读写内存中的数据。

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

  • 最后一种总线叫作控制总线,用来发送和接收关键信号,比如后面我们会学到的中断信号,还有设备复位、就绪等信号,都是通过控制总线传输。同样的,CPU 需要对这些信号进行响应,这也需要控制总线。

输入、输出设备

输入设备向计算机输入数据,计算机经过计算,将结果通过输出设备向外界传达。如果输入设备、输出设备想要和 CPU 进行交互,比如说用户按键需要 CPU 响应,这时候就需要用到控制总线。

到这里,相信你已经对冯诺依曼模型的构造有了一定的了解。这里我再强调几个问题:

1. 线路位宽问题

第一个问题是,你可能会好奇数据如何通过线路传递。其实是通过操作电压,低电压是 0,高电压是 1。

如果只有一条线路,每次只能传递 1 个信号,因为你必须在 0,1 中选一个。比如你构造高高低低这样的信号,其实就是 1100,相当于你传了一个数字 10 过去。大家注意,这种传递是相当慢的,因为你需要传递 4 次。

这种一个 bit 一个 bit 发送的方式,我们叫作串行。如果希望每次多传一些数据,就需要增加线路,也就是需要并行。

如果只有 1 条地址总线,那每次只能表示 0-1 两种情况,所以只能操作 2 个内存地址;如果有 10 条地址总线,一次就可以表示 210 种情况,也就是可以操作 1024 个内存地址;如果你希望操作 4G 的内存,那么就需要 32 条线,因为 232 是 4G。

到这里,你可能会问,那我串行发送行不行?当然也不是不行,只是速度会很慢,因为每多增加一条线路速度就会翻倍。

2. 64 位和 32 位的计算

第二个问题是,CPU 的位宽会对计算造成什么影响?

我们来看一个具体场景:要用 32 位宽的 CPU,加和两个 64 位的数字。

32 位宽的 CPU 控制 40 位宽的地址总线、数据总线工作会非常麻烦,需要双方制定协议。 因此通常 32 位宽 CPU 最多操作 32 位宽的地址总线和数据总线。

因此必须把两个 64 位数字拆成 2 个 32 位数字来计算,这样就需要一个算法,比如用像小时候做加法竖式一样,先加和两个低位的 32 位数字,算出进位,然后加和两个高位的 32 位数字,最后再加上进位。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

64位和32位相比优势是什么(一) 的相关文章

  • 有效地将三个字母的货币名称转换为符号名称(例如 20 美元到 20 美元)

    我有一个格式化的字符串 它等于USD 20 我想把它转换成 20 我怎样才能高效地做到这一点 我应该使用正则表达式来执行此操作 但由于区域设置发生变化 国家 地区 ISOCode 也会发生变化 你需要的是这个 import java uti
  • 在 Spark 中写入 JSON 时保留具有空值的键

    我正在尝试使用 Spark 编写 JSON 文件 有一些键有null作为价值 这些在中显示得很好DataSet 但是当我写入文件时 密钥会丢失 我如何确保它们被保留 写入文件的代码 ddp coalesce 20 write mode ov
  • 序列化 ArrayList

    我正在尝试编写一个 Android 游戏 即使用户想要返回主菜单或者活动被系统终止 我也希望能够暂停游戏 onSaveInstanceState 似乎并没有给我很大的控制权来决定何时可以读回捆绑包 而且据我所知 捆绑包仅在短时间内有效 所以
  • 如何将参数传递给Workmanager DoWork方法

    我想安排任务在 24 小时后从数据库中删除 public class WorkManager extends Worker public WorkManager NonNull Context context NonNull WorkerP
  • 如何从球衣服务端点发送实体列表?

    我正在从球衣服务器发送实体列表 在客户端 我试图获取这些实体列表 但它给了元帅例外 为什么它在元素名末尾添加 s 即 emps 而不是 emp XmlRootElement public class Emp Server side code
  • 如何在 Java 中复制对象?

    考虑下面的代码 DummyBean dum new DummyBean dum setDummy foo System out println dum getDummy prints foo DummyBean dumtwo dum Sys
  • bean 的 CDI @TransactionAttribute

    我正在尝试CDI在测试应用程序上 我有一个DAO它注入一个托管的容器JTA像这样的持久化上下文 public class TestDAO implements Serializable PersistenceContext private
  • 如何确定 JDialog 显示在哪个屏幕上

    我有一个非常大的应用程序 有多个对话框 我的任务是确保不完全可见的对话框 因为用户将其从可见屏幕区域拉出 移回屏幕中心 当我只处理一个屏幕时 这没问题 它工作得很好 但是 该应用程序的大多数用户的桌面上都有两个屏幕 当我尝试找出对话框显示在
  • 如何在 Android 中签署 AAR Artifacts?

    我目前正在开发一个 AAR android 库 我想用我自己的密钥对已发布的工件进行签名 以便我可以确定我是否发布了具有相同名称和功能的假 aar 注意事项1 我希望能够以编程方式检查我的库的真实性 即使是一个伪造的库 只是伪造了我的 aa
  • Byte[] 和 java.lang.OutOfMemoryError 按位读/写文件

    我正在努力擦除 Android 中的一些可用空间 这是我的代码 private void creatingFileDelete int size int passMode File lastFile new File Environment
  • 使用 Copy.CopyIntoItems Web 服务将文件上传到 SharePoint 2010 时收到 400 错误请求

    SharePoint 新手 我尝试使用 Java 的 CopyIntoItems Web 服务方法将文档上传到 SharePoint 但不断收到 400 错误请求 我使用 Java 的 wsimport 从 wsdl 文件生成类文件 这是我
  • 如何在 SpringBoot v3.0.0 中使用嵌入式 MongoDB?

    我正在尝试连接嵌入式 mongodb 并使用 MongoDbSpringIntegrationTest 对其进行测试 问题是相同的代码在 2 7 7 中适用于 spring boot 但在 3 0 0 中不适用于 spring boot 问
  • Hibernate更新查询问题

    对于此更新查询 update TestDB dbo MyEmp set empname where empid 我在 DAO 课上写的 MyEmployee myEmployee new MyEmployee MyEmployee myEm
  • 覆盖乔达一周的第一天?

    是否有可能覆盖乔达弱的第一天sunday 因为 Joda 使用Monday作为一周的第一天 如果有办法的话 谁能解释一下 我在 SOF 中提到了以下主题 乔达时间 一周的第一天 https stackoverflow com questio
  • java springrabbit - 优雅地拒绝消息

    我有以下侦听器方法 Override public void onMessage Message message Channel channel try do something bad catch Exception e try long
  • 错误包括 bouncycastle 提供商

    我需要使用bouncycastle provider我的项目中的库 我已将其包含在 gradle 项目中 apply plugin application sourceCompatibility 1 6 version 1 0 0 main
  • org.apache.poi 中的异常

    我试图编写一个可以读取和写入的程序 xlsx文件中 下面提供的代码旨在能够编写其第一个 Excel 程序 package excel reader import java io FileOutputStream import java io
  • SFTP Java - 管道关闭 Jsch 异常

    我正在研究一种 java 方法 将文件从一个位置复制到另一个远程位置 我的代码如下 我尝试使用jsch 0 1 42 0 1 50 0 1 54 public static void processFiles ArrayList
  • java.lang.IllegalStateException:FragmentManager 已被销毁

    活动中onResume我称之为 volley request 的方法 它获取项目列表 然后将它们加载到此活动内的 ListFragment 中 当我第一次进入活动时 一切正常 但当我重新进入活动时 ListFragment 为空 并且控制台
  • 如何将字符串解析为map

    有一个像A B C D E F这样的字符串 如何将其解析为map 我会使用拆分 String text A B C D E F Map

随机推荐

  • C++的强制类型转换

    关于强制类型转换的问题 很多书都讨论过 写的最详细的是C 之父的 C 的设计和演化 最好的解决方法就是不要使用C风格的强制类型转换 而是使用标准C 的类型转换符 static cast dynamic cast 标准C 中有四个类型转换符
  • 在docker上安装spark

    拉安装好spark的镜像 https hub docker com r bde2020 spark master docker pull bde2020 spark master 安装master节点 docker run name spa
  • SpringBoot 整合shiro框架

    网上有很多整合shiro的博客分享 但是貌似没找到一个完整 并且能够实现的 不是包的问题 就是代码的问题 也可能是自己的问题 或者版本的问题 所以 整理了一版自己已应用的 maven依赖
  • Netty 入门实战

    Netty 入门实战 异步事件驱动的Java开源网络应用程序框架 用于快速开发可维护的高性能协议服务器和客户端 Netty 项目旨在为可维护的高性能和高可伸缩性协议服务器和客户端的快速开发提供一个异步事件驱动的网络应用框架和工具 Netty
  • Kafka概述

    Kafka概述 Kafka 基础架构 生产者消息发送流程 生产者发送消息示例 分区的好处 生产者如何提高吞吐量 可靠性总结 幂等性问题 Kafka 事务 生产者乱序问题 kafka是一个多分区 多副本且基于zookeeper协调的分布式消息
  • wsl连接vscode

    文章目录 1 wsl 安装 2 wsl搭配vscode 3 adb 在wsl上的使用 1 wsl 安装 由于我已经提前安装了 所以这里没办法展示如何安装 大致有两个需要注意的点 在官网或者其它博文有 1 需要在命令行输入安装命令 2 需要下
  • python-循环

    文章目录 循环 是什么 定义 分类 做什么 怎么用 语法 If 语法 If 基本语法 If else if elif else 结构 if 嵌套 while 语法 while 基本语法 while else while else break
  • 费曼学习法简述

    你真的已经对某个知识点足够深入了吗 还是只是停留在一个肤浅的阶段 不妨试试费曼学习法 让自己的思考更加深入 费曼学习法 主要分为四个阶段 下面针对这四个步骤进行详述 选择概念 选择一个你想学习的概念 讲授概念 你对面的是一个10岁孩童 试图
  • 操作系统复习知识点(第四章、第五章)

    存储器管理 1 多层结构的存储器系统 存储器的多层结构 存储层次至少应具有三级 最高层为 CPU 寄存器 中间为主存 最底层是辅存 还可以根据具体的功能分工细划为寄存器 高速缓存 主存储器 磁盘缓存 固定磁盘 可移动存储介质等 6 层 在存
  • Mad Scientist (纯模拟题)

    Mad Scientist 题目描述 Farmer John s cousin Ben happens to be a mad scientist Normally this creates a good bit of friction a
  • QT--3.创建一个简单的图形界面

    创建一个简单的图形界面 1 qt基础 qt的移植性非常强 2 做一个简单的qt界面 1 创建一个工程 2 项目选择Application 然后选择Qt Widgets Application 最后选择choose 注意 创建项目的名称和路径
  • 对象池简单理解

    unity中一些需要频繁创建和销毁的对象 在销毁时会频繁的调用gc 非常占用cpu时 造成性能瓶颈 这时候就需要对象池技术 使用对象池在销毁时并不调用gc 而是仅仅将需要销毁的obj失活 当再次创建同类对象时 在对象池中查找可以使用的对象进
  • C语言练习——输出字符串长度

    输出字符串长度 题目描述 代码实现 方法一 方法二 方法三 方法四 题目描述 写一个函数 求一个字符串的长度 在 main 函数中输入字符串 并输出其长度 代码实现 方法一 include
  • linux oracle 临时空间不足,oracle for linux服务器磁盘空间不足,通过过期的文件释放磁盘空间...

    2013 09 16截取的数据 使用df h命令查看系统磁盘空间 root erpdbs PROD df h Filesystem Size Used Avail Use Mounted on dev sda5 4 9G 241M 4 4G
  • CCPC2019河南省省赛总结:lwh

    之前的邀请赛突然变成省赛 多了次拿牌的机会 还挺开心的 然后旷了2节课和队友去打了网络赛 成绩还不错 应该能够拿个金 然后就是现场赛了 不知道什么原因 现场赛开始前推迟了20分钟 比赛开始 开始一眼望过去 学长选了题 签到题直接敲 样例过了
  • mysql 列名映射_[Mybatis] Mybatis处理列名->字段名映射(二) - AS用法 & ResultMap

    前言 考虑到在Select时使用AS和方案一其实没什么差别 在介绍ResultMap之前 顺便带过一下 方案二 Select AS 当我们的数据库列名和对象字段之间不是驼峰式命名的关系 我们可以在Select时使用AS 使得列名和对象名匹配
  • BTY Ecosystem DNS‘s Ideas of DeSoc

    In May 2022 Ethereum founder Vitalik Buterin economist Glen Weyl and Flashbots researcher Puja Ohlhaver jointly released
  • vue前端上传文件到COS

    1 main js中 COS相关的 Vue prototype loadi https images 1254950508 cos ap guangzhou myqcloud com a 1588390454918 loading gif
  • 计算机网络重点知识解析(1)

    总结一下计算机网络知识 文章目录 OSI七层网络协议 TCP IP协议模型 TCP协议 UDP协议 TCP和UDP协议的区别 RTT和RTO TCP的滑动窗口 TCP 拥塞控制 OSI七层网络协议 先来一张网络协议图 简单解释一下各个协议
  • 64位和32位相比优势是什么(一)

    前置知识 程序是如何执行的 一道常规的面试题 相比 32 位 64 位的优势是什么 面试官考察这种类型的问题 主要是想看求职者是否有扎实的计算机基础 同时想知道求职者在工作中是否充满好奇 会主动学习 寻根问底 毕竟 32 64 位是经常出现