【计算机科学速成课】笔记二

2024-05-06 00:12

本文主要是介绍【计算机科学速成课】笔记二,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

笔记一

文章目录

      • 7.CPU
        • 阶段一:取指令阶段
        • 阶段二:解码阶段
        • 阶段三:执行阶段
      • 8.指令和程序
      • 9.高级CPU设计——流水线与缓存

7.CPU

CPU也叫中央处理器,下面我们要用ALU(输入二进制,会执行计算)、两种内存(寄存器(很小一块内存,能存一个值)、RAM(大量内存,能在不同地址存大量数字))来做一个CPU——电脑的心脏。
在这里插入图片描述

计算机中上的任何东西都是程序,程序有指令和数据组成。指示计算机要做什么。
我们采用微体系架构的方式(注重功能,适当抽象)来讲解之——
CPU既然是执行指令的,下面是CPU的指令表
我们给所有的指令分配一个ID,我们用前四位存操作码,后四位存地址或寄存器,指示数据来自哪里
在这里插入图片描述

我们还需要两个寄存器来完成CPU,指令地址寄存器(用来追踪程序运行到了哪里,即里面存当前指令的内存地址)、指令寄存器(用来存当前指令)。
下面是目前的大概图示:
在这里插入图片描述

为了举例,我们在RAM里面存了一个程序,我们会将其运行并一步一步讲解:
CPU运行有三个阶段——

阶段一:取指令阶段

初始所有寄存器里面的值均为0。指令地址寄存器连接到RAM,因为里面地址为0,所以会返回RAM中地址为0处的数据,将00101110复制到指令寄存器中。现在指令拿到了,必须分析是什么指令才能进行执行。

在这里插入图片描述

阶段二:解码阶段

首先检查指令前四位值,是0010,对应于指令表中的LOAD_A,即将值加载到寄存器A中,后四位是RAM的地址,1110,即十进制中的14,查看RAM地址为14处的数据为00000011,则该数据会加载进寄存器A中
在这里插入图片描述
在这里插入图片描述
上面这是解码器,用来判断指令是否是LOAD_A的。

阶段三:执行阶段

现在既然知道是什么指令了,就可以开始执行了。上面的检查是否是指令LOAD_A的电路可以打开RAM的“允许读取线”,把地址14传过去进行读取。地址14里面的值是00000011,因为只是加载进寄存器A中,所以会将所有寄存器用线连接起来,只打开寄存器A,将00000011存入即可。如下图。
之后将指令地址寄存器加1,执行阶段到此结束,进行下一次读取指令并执行。
在这里插入图片描述

上面只是LOAD_A指令的执行过程,不同指令有不同逻辑解码电路,这些逻辑解码电路会配置CPU内的组件来执行相应操作。我们不妨将解码电路封装成一个单元(又一层抽象),称为控制单元(control unit)——
在这里插入图片描述

控制单元就像管弦乐队的指挥一样,“指挥”CPU的所有组件。“取指令”——>“解码”——>"执行"完成之后,又再次开始该过程。直至程序结束。

当程序执行指令到地址2处时,指令为1000 0100,对应指令为将两个寄存器的值相加。后面的地址01代表寄存器B,地址00代表寄存器A,因此该指令代表将寄存器B与A相加后存到寄存器A中。
在这里插入图片描述
为了执行这个指令,我们的控制单元要整合ALU,进行运算。这里控制单元先用自己的寄存器保存结果,然后将ALU关闭后,再将结果存进寄存器A中。
在这里插入图片描述

最后一个指令将寄存器A中的值放入RAM中。这就是我们的第一个电脑程序!从RAM中加载两数后相加后存入RAM中。仅仅用了4条指令,地址从0~3.

现实中,处理器中会有一个“时钟”来控制上面的**“取指令”——>“解码”——>"执行"节奏**与速率。
时钟以精确的间隔触发电信号,控制单元会用这个信号,推进CPU的内部操作。确保一切顺利进行。

CPU执行**“取指令”——>“解码”——>"执行"的速度叫做“时钟速度”**,单位是HZ。通常也会有超频、降频来增加、降低时钟速度的。

在这里插入图片描述

我们将上面的CPU Chip抽象后封装成独立元件,叫做CPU芯片。而RAM是独立的组件,通过DATA,ADDRESS INPUT、READ ENABLE、WRITE ENABLE线与CPU相互通信。
我们目前做的只是简化版CPU,下一节,我们将给CPU拓展更多指令!

8.指令和程序

上一章我们用ALU、寄存器、RAM做了个简单的中央处理单元——CPU,这节课我们来给上节课做的CPU一些指令运行,即——编程
CPU之所以强大,就是因为它是可编程的。如果写入不同指令,就会执行不同任务。CPU是硬件,它可以被软件控制

我们知道RAM里面的指令前4位是指令表,后4为是地址,不如直接将二进制码换成汇编语言,更加方便易理解,这样就提升了一个抽象了。
在这里插入图片描述
在这里插入图片描述

CPU还有很多指令,如下,数据和指令是存在一个内存条里面的。HLT是程序结束指令,通常在数据与指令内存之间。
在这里插入图片描述
JUMP指令无非就是覆盖掉指令地址寄存器里面存的值。使得CPU读取指定地址处的指令。
如下原本是会继续读取地址为5的指令的,但是JUMP 2代表重新读取地址为2的值了。注意这里是一个永久循环,永远不会到达HALT,程序永远不会结束。这就是永久循环的原理。
在这里插入图片描述
So, our hypothetical CPU is very basic – all of its instructions are 8 bits long,
我们这里假设的 CPU 很基础,所有指令都是 8 位,

with the opcode occupying only the first four bits.
操作码只占了前面 4 位

So even if we used every combination of 4 bits, our CPU would only be able to support,a maximum of 16 different instructions.
即便用尽 4 位,也只能代表 16 个指令

On top of that, several of our instructions used the last 4 bits to specify a memory location.
而且我们有几条指令,是用后 4 位来指定内存地址

But again, 4 bits can only encode 16 different values,
因为 4 位最多只能表示 16 个值,

meaning we can address a maximum of 16 memory locations - that’s not a lot to work with.
所以我们只能操作 16 个地址,这可不多.

For example, we couldn’t even JUMP to location 17,
我们甚至不能 JUMP 17

because we literally can’t fit the number 17 into 4 bits.
因为 4 位二进制无法表示数字 17

For this reason, real, modern CPUs use two strategies.
因此,真正的现代 CPU 用两种策略

The most straightforward approach is just to have bigger instructions, with more bits,like 32 or 64 bits.
最直接的方法是用更多位来代表指令,比如 32 位或 64 位

This is called the instruction length.
这叫 指令长度法

Unsurprisingly.
毫不意外

The second approach is to use variable length instructions.
第二个策略是 “可变指令长度法”

For example, imagine a CPU that uses 8 bit opcodes.
举个例子,比如某个 CPU 用 8 位长度的操作码

When the CPU sees an instruction that needs no extra values, like the HALT instruction,
如果看到 HALT 指令,HALT 不需要额外数据

it can just execute it immediately.
那么会马上执行.

However, if it sees something like a JUMP instruction, it knows it must also fetch
如果看到 JUMP,它得知道位置值

the address to jump to, which is saved immediately behind the JUMP instruction in memory.
这个值在 JUMP 的后面

This is called, logically enough, an Immediate Value.
这叫 “立即值

In such processor designs, instructions can be any number of bytes long,
这样设计,指令可以是任意长度

which makes the fetch cycle of the CPU a tad more complicated.
但会让读取阶段复杂一点点

Now, our example CPU and instruction set is hypothetical,
要说明的是,我们拿来举例的 CPU 和指令集都是假设的,

designed to illustrate key working principles.
是为了展示核心原理

So I want to leave you with a real CPU example.
所以我们来看个真的 CPU 例子.

In 1971, Intel released the 4004 processor.
1971年,英特尔发布了 4004 处理器.

It was the first CPU put all into a single chip
这是第一次把 CPU 做成一个芯片 , 给后来的英特尔处理器打下了基础

在这里插入图片描述

It supported 46 instructions, shown here.
它支持 46 个指令

Which was enough to build an entire working computer.
足够做一台能用的电脑

And it used many of the instructions we’ve talked about like JUMP ADD SUBTRACT and LOAD.
它用了很多我们说过的指令,比如 JUMP ADD SUB LOAD

It also uses 8-bit immediate values, like we just talked about, for things like JUMP,in order to address more memory.
它也用 8 位的"立即值"来执行 JUMP, 以表示更多内存地址.
在这里插入图片描述
And this huge growth in instruction set size is due in large part to extra bells and whistles
指令越来越多,是因为给 CPU 设计了越来越多功能

that have been added to processor designs overtime, which we’ll talk about next episode.
下集我们会讲

9.高级CPU设计——流水线与缓存

这篇关于【计算机科学速成课】笔记二的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/963033

相关文章

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

论文阅读笔记: Segment Anything

文章目录 Segment Anything摘要引言任务模型数据引擎数据集负责任的人工智能 Segment Anything Model图像编码器提示编码器mask解码器解决歧义损失和训练 Segment Anything 论文地址: https://arxiv.org/abs/2304.02643 代码地址:https://github.com/facebookresear

数学建模笔记—— 非线性规划

数学建模笔记—— 非线性规划 非线性规划1. 模型原理1.1 非线性规划的标准型1.2 非线性规划求解的Matlab函数 2. 典型例题3. matlab代码求解3.1 例1 一个简单示例3.2 例2 选址问题1. 第一问 线性规划2. 第二问 非线性规划 非线性规划 非线性规划是一种求解目标函数或约束条件中有一个或几个非线性函数的最优化问题的方法。运筹学的一个重要分支。2

【C++学习笔记 20】C++中的智能指针

智能指针的功能 在上一篇笔记提到了在栈和堆上创建变量的区别,使用new关键字创建变量时,需要搭配delete关键字销毁变量。而智能指针的作用就是调用new分配内存时,不必自己去调用delete,甚至不用调用new。 智能指针实际上就是对原始指针的包装。 unique_ptr 最简单的智能指针,是一种作用域指针,意思是当指针超出该作用域时,会自动调用delete。它名为unique的原因是这个

查看提交历史 —— Git 学习笔记 11

查看提交历史 查看提交历史 不带任何选项的git log-p选项--stat 选项--pretty=oneline选项--pretty=format选项git log常用选项列表参考资料 在提交了若干更新,又或者克隆了某个项目之后,你也许想回顾下提交历史。 完成这个任务最简单而又有效的 工具是 git log 命令。 接下来的例子会用一个用于演示的 simplegit

记录每次更新到仓库 —— Git 学习笔记 10

记录每次更新到仓库 文章目录 文件的状态三个区域检查当前文件状态跟踪新文件取消跟踪(un-tracking)文件重新跟踪(re-tracking)文件暂存已修改文件忽略某些文件查看已暂存和未暂存的修改提交更新跳过暂存区删除文件移动文件参考资料 咱们接着很多天以前的 取得Git仓库 这篇文章继续说。 文件的状态 不管是通过哪种方法,现在我们已经有了一个仓库,并从这个仓

忽略某些文件 —— Git 学习笔记 05

忽略某些文件 忽略某些文件 通过.gitignore文件其他规则源如何选择规则源参考资料 对于某些文件,我们不希望把它们纳入 Git 的管理,也不希望它们总出现在未跟踪文件列表。通常它们都是些自动生成的文件,比如日志文件、编译过程中创建的临时文件等。 通过.gitignore文件 假设我们要忽略 lib.a 文件,那我们可以在 lib.a 所在目录下创建一个名为 .gi

取得 Git 仓库 —— Git 学习笔记 04

取得 Git 仓库 —— Git 学习笔记 04 我认为, Git 的学习分为两大块:一是工作区、索引、本地版本库之间的交互;二是本地版本库和远程版本库之间的交互。第一块是基础,第二块是难点。 下面,我们就围绕着第一部分内容来学习,先不考虑远程仓库,只考虑本地仓库。 怎样取得项目的 Git 仓库? 有两种取得 Git 项目仓库的方法。第一种是在本地创建一个新的仓库,第二种是把其他地方的某个

Git 的特点—— Git 学习笔记 02

文章目录 Git 简史Git 的特点直接记录快照,而非差异比较近乎所有操作都是本地执行保证完整性一般只添加数据 参考资料 Git 简史 众所周知,Linux 内核开源项目有着为数众多的参与者。这么多人在世界各地为 Linux 编写代码,那Linux 的代码是如何管理的呢?事实是在 2002 年以前,世界各地的开发者把源代码通过 diff 的方式发给 Linus,然后由 Linus