计算机的工作原理(上)

1. 计算机发展史

        计算的需求在人类的历史中是广泛存在的,发展大体经历了从一般计算工具到机械计算机到目前的电子计算机的发展历程。(以下是计算机的发展历程)

1、公元前2500 年前,算盘已经出现了;除此之外,人类还创造了各种工具以辅助计算

2、1694 年,德国博物学家 戈特弗里德·莱布尼兹建造了“步进计算器”。

3、1822 年,英国科学家 查尔斯·巴贝奇设计了“差分机”模型;1991年,才被现代科学家根据手稿建造完成

4、十九世纪三十年代,英国科学家 查尔斯·巴贝奇更进一步设计了“分析机”模型;是第一台“通用计算机”。

5、1890 年,美国科学家为了解决人口普查中的计算问题,发明了“打孔卡片制表机

6、1943年,英国制造了第一个大规模使用“真空管”的计算机 —— 巨人一号,用于破解纳粹通信密码。

7、1944 年,IBM 公司为二战同盟国制作了最大的“机电计算机” —— 哈佛 Mark一号,用于给“曼哈顿计划”跑模拟。

8、1945年,ENIAC在“宾夕法尼亚大学”完成建造,被视为第一台电子通用计算机。

9、1955年,AN/FSQ-7计算机,是“SAGE”防空计算机系统的一部分。

10、1947年,贝尔实验室科学家发明了“晶体管”,一种新的电子开关诞生了。也就是我们平时所谓的“半导体”材料

        人类对计算的需求,驱动我们不断的发明、改善计算机。目前这个时代是“电子计算机”的时代,发展的潮流是:更快速、更稳定、更微型。

        故此计算机是有软件和硬件两部分组成的,大概公式就是:计算机=软件+硬件,其中硬件部分主要依赖于冯诺依曼体系结构

2. 冯诺依曼体系(Von Neumann Architecture)

        现代的计算机, 大多遵守冯诺依曼体系结构,且该体系结构图如下所示:

      简单的词汇讲解:

        1、CPU 中央处理器: 进行算术运算和逻辑判断.

        2、存储器: 分为外存和内存, 用于存储数据(使用二进制方式存储)

        存储器(存储器主要有内存+外存,下面是内存和外存的相关比较):

        内存存储空间小,外存更大;

        内存访问速度快,外存更慢;

        内存的成本更高,外存更便宜;

        内存的数据断电后会丢失,外存不会;

        3、输入设备: 用户给计算机发号施令的设备.(鼠标,键盘)

        4、输出设备: 计算机个用户汇报结果的设备.(显示器,音箱)

        番外:

1、关于x86架构和arm架构的若干知识小点:

1.1 关于x86:

        设计cpu有很多不同的方案就称为架构,且不同的架构都会有不同的指令集,这些指令集就会对上层应用程序产生直接的影响。

        所谓编程,就是通过编程语言描述出一些逻辑,这些逻辑最终被转化成cpu能识别的指令最终执行。故此我们现在用java写的代码,先编译成jvm字节码文件,jvm再把这些字节码文件转换成x86架构下的指令。

1.2 关于arm

        相比之下,苹果,高通搞得cpu是另外一套架构,arm架构

        Arm的特点:更适合适用于低功耗的机器上。苹果电脑的续航能力是十分强的,但是其性能比x86要弱一些。

        我们要知道计算机的功耗和性能是对立的,且相互关联的。

2、关于软件:

        软件(是一个广义的概念,并非仅仅是指有图形化的界面,同时一个软件的难易程度,和图形化界面没有关系)

        软件,其实就是通过代码,来解决一些实际的问题。

3、Cpu基本适用情况

    X86架构:intel amd ---->家用pc,服务器

    Arm架构:苹果,高通 ------>苹果电脑。智能手机

    现在的x86的cpu都是64位的(cpu的位数,就和代码中内存地址用几个字节表示,是密切相关的---16位的cpu,就是2个字节)

        Windows的特殊处理:windows64位版本,可以兼容32位的程序

 3. CPU 基本工作流程

      关于cpu是怎么构成的:

    晶体管->门电路 -> 半加器 ->全加器 -> ALU运算器->如此差不多构成cpu

        接下来,我们用一个从无到有的过程,一步步搭建一个 CPU 出来,通过借助这个过程,理解CPU、内存等计算机主要部件的工作原理 ;

3.1 逻辑门

3.1.1 电子开关 —— 机械继电器(Mechanical Relay)

        整个过程,类似一个水龙头:打开水龙头开关,有水流出;关闭水龙头开关,水流停止。

             

        我们可以通过以下电子开关下方线圈通电,产生磁场,吸引上方机械臂闭合,完成上方电路闭合;下方线圈断电,磁场消失,导致上方机械臂弹起,断开上方电路闭合

        通过电子开关,我们可以实现 1 位(bit) 的看似无用的逻辑运算。我们接来下会做进一步的学习了解怎么使用电子开关组合出真正有用的逻辑组件。

3.1.2 门电路(Gate Circuit)

1、NOT GATE(非门)

2、AND GATE(与门)

3、OR GATE(或门)

4、XOR GATE(异或门)

3.2 算术逻辑单元 ALU(Arithmetic & Logic Unit)

        ALU 是计算机中进行算数、逻辑运算的核心部件,是计算机的数学大脑;

1、算术单元(Arithmetic Unit)

        算数单元,负责计算机里的所有数字操作,比如四则运算,当然它能做的远远不止这些。

2、逻辑单元(Logic Unit)

        逻辑单元主要用来进行逻辑操作,最基本的操作就是 与、或、非操作,但不只是一位(bit)数的比较

3、ALU 符号

   3.3 寄存器(Register) 和内存(RAM)

        Ram:内存。

        寄存器:是cpu上的存储数据的单元。(cpu上能直接存的数据比较少,这些寄存器主要是为了支持cpu完成一些计算,保存中间结果的,虽然寄存器空间有限,但是访问速度很快,是内存访问速度的三到四倍的)

        光有 ALU 还是远远不够的,我们无法为 ALU 提供存储的部件,这些存储都是要求必须保持通电状态的,即也就是这些存储都是易失的(volatile),上图的最后的效果就是:使能线置位时,输入为 1,保存 1;输入为 0,保存0。使能线不置位时,则写入无效。我们可以利用门锁,构建我们需要的寄存器和内存

        内存的构建的基本原理与上述大概一致。如此构建的内存被称为RAM(Random AccessMemory),可以支持 O(1) 时间复杂度访问任意位置的数据,这也就是我们数组下标访问操作是 O(1)的硬件支持。

3.4 控制单元 CU(Control Unit) 

        我们现在有 ALU、存储了,但这还是不足以让我们的计算机工作起来,我们需要有一个部件来指挥 ALU进行何种的运算,而这个部件就是控制单元(CU)且两者关系如下所示:

        关于 CU 如何由门电路从无到有搭建,我们就进行抽象了,我们只需要理解 CU 可以驱动 ALU 进行具体的计算工作即可 

3.5 指令(Instruction)

        首先,我们先介绍下我们需要到的指令(instruction)。所谓指令,即指导 CPU 进行工作的命令,主要有操作码 + 被操作数组成。其中操作码用来表示要做什么动作,被操作数是本条指令要操作的数据,可能是内存地址,也可能是寄存器编号等。指令本身也是一个数字,用二进制形式保存在内存的某个区域中

3.6 CPU 的基本工作流程

        接下来,我们演示指令运行的一个周期

        执行周期经过以下阶段:

        当然,电子计算机中的 CPU 可不像我们刚才那样,靠自己来驱动这个周期的运转,而是靠背后一个时钟来进行周期驱动的

        最后,ALU + CU + 寄存器 + 时钟就组成了我们平时经常看到的一个词汇:中央处理器(Center ProcessUnit)简称 CPU

 番外:

1、cpu如何执行指令代码的

        咱们写好的代码,最终想要运行,就需要让操作系统先把写好的并编译好的指令集加载到内存中,然后cpu才能执行。

        1.1 默认情况下,cpu执行内存中的指令,是顺序执行的,当然也会遇到一些跳转指令。

        1.2 当前的计算机,从cpu执行指令的时候,要经历从内存读取数据这样的操作。(本质上,依据于冯诺依曼体系结构,是将“执行”和“存储”分开了,这么做主要是为了“解耦合”降低硬件设计的成本),但现在的cpu执行速度越来越快,内存跟不上cpu的速度了(所谓的表演5分钟,通勤两小时),由此就有了缓存(临时安置一下,cpu附近的区域,之前的缓存在南北桥上,后来都集成到cpu上了)

2、Cpu的执行结论:

        2.1 cpu要执行的指令,是在内存中。(冯诺依曼体系,基本设定让执行单元和存储单元解耦合)

        2.2 cpu要想执行指令,就需要先取指令,在解析指令,然后才能执行指令。

        2.3 取指令需要从内存中读取指令到cpu的寄存器中,取指令的操作是相当耗时的,cpu中通过缓存,流水线等技术,来优化这里的效率。

        2.4 Cpu在解析指令的时候要用到解析表,不同架构的cpu支持的指令表不同(x86和arm等都是不同的),指令表的细节,已经写死到了cpu中了,cpu是可以识别的。

        2.5 指令在执行的过程中,可能会遇到一些操作数,不同的指令,操作数的个数含义都会有所不同

        2.6 Cpu重要的参数,主频,主频的含义,近似看成1s之内,cpu能够执行的指令个数。

3、关于cpu的相关知识

        3.1 Cpu是多核+超线程技术加持的产物(4核8线程)

          

        Cpu的好坏,要多维度来衡量:有的cpu核心多,但是单核频率不高,性能也就一般,同架构下,频率越高越好。

        3.2 其他

        频率:描述单个cpu核心工作的速度。(1khz = 1024hz,1mhz=1024khz,1ghz =1024mhz)

        睿频技术:cpu的频率动态发生变化,看当前任务多不多。

        衡量一个cpu的单核性能,既要看基础频率(下限),最大睿频(上限)。

ps:本次学习就到这里了,如果大家感兴趣的话就请一键三连哦!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/264855.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Unity protobuf中repeated转C#文件List只读问题

Unity protobuf中repeated转C#文件List只读问题 介绍问题解决方案总结 介绍 工具这里我就不多介绍了,如果有用到ProtoGen工具的可以继续看一下我后面的方法。 问题 如下图所示,我这里随便用了一个.proto文件,看下我这里面的repeated标记的…

大一C语言作业题目1

目录 字符串和字符数组? %s found的变化: 7-1 学生成绩录入及查询 学生成绩表中,一名学生的信息包含如下信息: 学号(11位)、姓名、数学成绩、英语成绩、程序设计成绩、物理成绩。 本题要求编写程序,录入N条学生的…

【Amazon 实验②】使用缓存策略及源请求策略,用于控制边缘缓存的行为及回源行为

文章目录 1. 了解缓存策略和源请求策略1.1 使用缓存键和缓存策略 实验:使用CloudFront缓存策略和缓存键控制缓存行为 接上一篇文章【Amazon 实验①】使用 Amazon CloudFront加速Web内容分发,我们现在了解和配置如何使用缓存策略及源请求策略,…

NativePHP:使用 PHP 构建桌面应用程序

PHP 在我心中占据着特殊的位置。它是我的第一份工作,我记得我在家里花了无数个小时做一些小项目。我非常想用 PHP 创建桌面应用程序,但我从来没有做到过。 现在,感谢 NativePHP,我可以了。 NativePHP 追随 Slack、Discord 和 Tre…

trino-435版本windows下源码编译

一、源码下载地址 https://github.com/trinodb/trino/tags 二、编译环境及工具准备 1、maven &#xff08;1&#xff09;版本&#xff1a;3.6.3 &#xff08;2&#xff09;settings.xml配置 <?xml version"1.0" encoding"UTF-8"?> <settin…

基于Vite+Vue3 给项目引入Axios

基于ViteVue3 给项目引入Axios,方便与后端进行通信。 系列文章指路&#x1f449; 系列文章-基于Vue3创建前端项目并引入、配置常用的库和工具类 文章目录 安装依赖新建src/config/config.js 用于存放常用配置进行简单封装解决跨域问题调用尝试 安装依赖 npm install axios …

双向数据绑定是什么

一、什么是双向绑定 我们先从单向绑定切入单向绑定非常简单&#xff0c;就是把Model绑定到View&#xff0c;当我们用JavaScript代码更新Model时&#xff0c;View就会自动更新双向绑定就很容易联想到了&#xff0c;在单向绑定的基础上&#xff0c;用户更新了View&#xff0c;Mo…

SuperMap iServer发布的ArcGIS REST 地图服务如何通过ArcGIS API加载

作者&#xff1a;yx 文章目录 一、发布服务二、代码加载三、结果展示 一、发布服务 SuperMap iServer支持将地图发布为ArcGIS REST地图服务&#xff0c;您可以在发布服务时直接勾选ArcGIS REST地图服务&#xff0c;如下图所示&#xff1a; 也可以在已发布的地图服务中&#x…

linux分辨率添加

手动添加分辨率 注&#xff1a;添加分辨率需要显卡驱动支持&#xff0c;若显卡驱动有问题&#xff0c;则不能添加 可通过 xrandr 结果判断 # xrandr 若图中第二行” eDP“ 显示为 ” default “ &#xff0c;则显卡驱动加载失败&#xff0c;不能添加分辨率 1. 添加分辨率 # …

PHP下载安装以及基本配置

目录 引言 官网 下载 配置 1. 鼠标右键“此电脑”>“属性” 2. 打开高级系统设置 3. 打开环境变量 4. 双击系统变量中的path 5. 新建新的path 6. 将刚刚安装的位置加入环境变量 7. 检查是否安装成功 引言 PHP&#xff08;"PHP: Hypertext Preprocessor"…

零基础学C语言——数组

这是一个C语言系列文章&#xff0c;如果是初学者的话&#xff0c;建议先行阅读之前的文章。笔者也会按照章节顺序发布。 上一篇我们讨论过函数&#xff0c;其中涉及到了一些数组和指针&#xff0c;本篇详细说明数组。 数组定义 **数组是一种集合结构&#xff0c;与数学种谈到…

电脑完全重装教程——原版系统镜像安装

注意事项 本教程会清除所有个人文件 请谨慎操作 请谨慎操作 请谨慎操作 前言 本教程是以系统安装U盘为介质进行系统重装操作&#xff0c;照着流程操作会清除整个硬盘里的文件&#xff0c;请考虑清楚哦&#xff5e; 有些小伙伴可能随便在百度上找个WinPE作为启动盘就直接…

前端性能优化六:css阻塞

1. css加载会阻塞DOM树的解析和渲染吗? (1). html代码: <!DOCTYPE html> <html lang"en"><head><style>h1 {color: red !important}</style><script>function h () {console.log(document.querySelectorAll(h1))}setTimeout(…

Leetcode—445.两数相加II【中等】

2023每日刷题&#xff08;六十七&#xff09; Leetcode—445.两数相加II 实现代码 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2…

[每周一更]-(第38期):Go常见的操作消息队列

在Go语言中&#xff0c;常见的消息队列有以下几种&#xff1a; RabbitMQ&#xff1a;RabbitMQ是一个开源的AMQP&#xff08;高级消息队列协议&#xff09;消息代理软件&#xff0c;用于支持多种编程语言&#xff0c;包括Go语言。RabbitMQ提供了可靠的消息传递机制和灵活的路由…

开源 AI 新秀崛起:Bittensor 更像是真正的“OpenAI”

强大的人工智能正在飞速发展&#xff0c;而完全由 OpenAI、Midjourney、Google&#xff08;Bard&#xff09;这样的少数公司控制 AI 不免让人感到担忧。在这样的背景下&#xff0c;试图用创新性解决方案处理人工智能中心化问题、权力集中于少数公司的 Bittensor&#xff0c;可谓…

让生活更智能,P1600边缘智能网关带你进入智能家居新时代

一、什么是P1600边缘智能网关&#xff1f; 在科技日新月异的今天&#xff0c;我们的生活已经被各种智能产品所包围。而在这个智能化的浪潮中&#xff0c;P1600边缘智能网关以其独特的优势&#xff0c;成为了智能家居的重要组成部分。那么&#xff0c;什么是P1600边缘智能网关呢…

力扣每日一题day38[106. 从中序与后序遍历序列构造二叉树]

给定两个整数数组 inorder 和 postorder &#xff0c;其中 inorder 是二叉树的中序遍历&#xff0c; postorder 是同一棵树的后序遍历&#xff0c;请你构造并返回这颗 二叉树 。 示例 1: 输入&#xff1a;inorder [9,3,15,20,7], postorder [9,15,7,20,3] 输出&#xff1a;[…

【数据结构之顺序表】

数据结构学习笔记---002 数据结构之顺序表1、介绍线性表1.1、什么是线性表? 2、什么是顺序表?2.1、概念及结构2.2、顺序表的分类 3、顺序表接口的实现3.1、顺序表动态存储结构的Seqlist.h3.1.1、定义顺序表的动态存储结构3.1.2、声明顺序表各个接口的函数 3.2、顺序表动态存储…

Redis取最近10条记录

有时候我们有这样的需求&#xff0c;就是取最近10条数据展示&#xff0c;这些数据不需要存数据库&#xff0c;只用于暂时最近的10条&#xff0c;就没必要在用到Mysql类似的数据库&#xff0c;只需要用redis即可&#xff0c;这样既方便也快&#xff01; 具体取最近10条的方法&a…