计算机组成原理·考点知识点整理
根据往年考试题,对考点和知识点的一个整理。
校验编码
码距
一种编码的最小码距,其实就是指这种编码的码距。码距有两种定义:
| 码距所描述的对象 | 含义 |
|---|---|
| 2 2 2 个特定的码 | 其二进制表示中不同位的个数 |
| 一种编码 | 这种编码中任意 2 2 2 个合法编码的最小码距 |
课本上出现的码及其码距归纳如下。
- 奇偶校验码的码距是 2 2 2。
- 能纠 1 1 1 位错的海明码的码距始终是 3 3 3,不管 n , k , r n,k,r n,k,r 如何变化。首先,海明码的每一个数据位至少位于 2 2 2 个校验组,这就保证了海明码的码距至少是 3 3 3;其次, H 3 H_3 H3 一定位于且仅位于 G 1 , G 2 G_1,G_2 G1,G2 校验组, H 3 H_3 H3 的变化引起且只引起 P 1 , P 2 P_1,P_2 P1,P2 的变化,从而构造了一对码距为 3 3 3 的合法编码,保证海明码的码距最多是 3 3 3。
- CRC 编码的码距不固定,但是至少是 3 3 3。不同的 ( n , k ) (n,k) (n,k) 和生成多项式对应了不同的码距。比如下面这张表(来源于这篇博客):
| 总位数 n n n | 数据位数 k k k | 生成多项式 G ( x ) G(x) G(x) | G ( x ) G(x) G(x) 的二进制表示 | 码距 |
|---|---|---|---|---|
| 7 7 7 | 4 4 4 | x 3 + x + 1 x^3+x+1 x3+x+1 | 1011 1011 1011 | 3 3 3 |
| 7 7 7 | 4 4 4 | x 3 + x 2 + 1 x^3+x^2+1 x3+x2+1 | 1101 1101 1101 | 3 3 3 |
| 7 7 7 | 3 3 3 | x 4 + x 3 + x 2 + 1 x^4+x^3+x^2+1 x4+x3+x2+1 | 11101 11101 11101 | 4 4 4 |
| 7 7 7 | 3 3 3 | x 4 + x 2 + x + 1 x^4+x^2+x+1 x4+x2+x+1 | 10111 10111 10111 | 4 4 4 |
| 15 15 15 | 11 11 11 | x 4 + x + 1 x^4+x+1 x4+x+1 | 10011 10011 10011 | 3 3 3 |
| 15 15 15 | 7 7 7 | x 8 + x 7 + x 6 + x 4 + 1 x^8+x^7+x^6+x^4+1 x8+x7+x6+x4+1 | 111010001 111010001 111010001 | 5 5 5 |
| 31 31 31 | 26 26 26 | x 5 + x 2 + 1 x^{5}+x^{2}+1 x5+x2+1 | 100101 100101 100101 | 3 3 3 |
| 31 31 31 | 21 21 21 | x 10 + x 9 + x 8 + x 6 + x 5 + x 3 + 1 x^{10}+x^{9}+x^{8}+x^{6}+x^{5}+x^{3}+1 x10+x9+x8+x6+x5+x3+1 | 11101101001 11101101001 11101101001 | 5 5 5 |
| 63 63 63 | 57 57 57 | x 6 + x + 1 x^{6}+x+1 x6+x+1 | 1000011 1000011 1000011 | 3 3 3 |
| 63 63 63 | 51 51 51 | x 12 + x 10 + x 5 + x 4 + x 2 + 1 x^{12}+x^{10}+x^{5}+x^{4}+x^{2}+1 x12+x10+x5+x4+x2+1 | 1010000110101 1010000110101 1010000110101 | 5 5 5 |
汉字编码实验
GB2312 码:占 2 2 2 个字节,每个字节的最高位都是 1 1 1(为了与 ASCII 码区分)。
区号:GB2312 码高字节的低 7 7 7 位。
位号:GB2312 码低字节的低 7 7 7 位。
国标码转区位码的流程如下:
海明码流水传输实验
有关海明码的其它实验以及海明码的概念,可以参看这篇博客。这篇博客没有涉及到海明码的流水传输,在这里回顾一下。CRC 编码的流水传输和海明码流水传输在构成上是相似的。
流水传输的过程如下所示。图中的~使能/Stall 信号通过各级锁存器依次向右传递,获取了使能的锁存器将在下一个时钟上升沿完成锁存。当发生两位错的时候,前三个锁存器的值清零,同时地址回滚(减 3 3 3),显示阶段的锁存器stall接收到的数据 3 3 3 个时钟周期。
这是电路复位后的状态:
据此,总结两位错时各阶段的动作得下表:
| 阶段 | 动作 | 备注 |
|---|---|---|
| 取数阶段 | 地址回滚 | 地址要回滚 3 3 3 个汉字(ROM 回滚 6 6 6 个字节),出错了的数据重新传输。 |
| 编码阶段 | 数据清零 | 这个清零其实核心是把数据状态的值置为 0 0 0,其中锁存的数据可以不用管。 |
| 传输阶段 | 数据清零 | 和编码阶段清零是一个道理。 |
| 显示阶段 | 数据锁存 | 出错的字重传需要 3 3 3 个时钟周期才能到达显示阶段的锁存器,在这段时间内需要维持上一个字的显示。 |
CRC 编码解码
课本上介绍了 CRC编码、解码的时序逻辑实现,原始数据 D k ⋯ D 1 D_k\cdots D_1 Dk⋯D1 按位串行输入进来,然后经过时序系统的处理,每个时钟周期产出一位余数。但是我们做实验时用组合逻辑实现,根据 16 16 16 位原始数据 D 1 D_1 D1~ D 16 D_{16} D16 直接得到 6 6 6 校验码 R 1 R_1 R1~ R 6 R_6 R6。
实验中有两种思路,一种是采用 6 6 6 位的生成多项式,得到 5 5 5 位余数且 R 6 R_6 R6 作为总偶校验位;另一种是采用 7 7 7 位的生成多项式,得到 6 6 6 位的余数,就不设总偶校验位了。我当时没有想到后一种,因为它放了个 P P P 作为总偶校验位,还以为 R 6 R_6 R6 就是 P P P(心虚)。
头歌上萝卜打表没打全,能用的 6 6 6 位生成多项式只有下面这个:
上面的表是课本上的。使用这个生成多项式,直接出现了余数相等的盛况:
那么这个生成多项式显然在这里 ( k = 16 ) (k=16) (k=16) 是不能用的,只有原始数据是 15 15 15 位及以下才能用。其实表格上面的 x 5 + x 3 + 1 ( 0 x 29 ) x^5+x^3+1(0\rm x29) x5+x3+1(0x29) 和 x 5 + x 2 + 1 ( 0 x 25 ) x^5+x^2+1(0\rm x 25) x5+x2+1(0x25) 都可以使用,但是当时做实验的时候没有关注到课本,自己捏了一个 x 5 + x 3 + x 2 + x + 1 ( 0 x 2 f ) x^5+x^3+x^2+x+1(0\rm x2f) x5+x3+x2+x+1(0x2f) 来用。
上面出现的这三个 ( 0 x 29 , 0 x 25 , 0 x 2 f ) (\rm{0x29,0x25,0x2f}) (0x29,0x25,0x2f) 都是可以纠正一位错的。考题里现在出现了这样一个问题:
在假定没有 3 3 3 位以上错误发生的前提下,你的生成多项式生成的 CRC 编码检错时能否区分 1 1 1 位错和 2 2 2 位错?
![]()
对于我的版本(多项式 6 6 6 位),答案说是不能区分,余数相同。果真余数相同吗?我们利用下面的代码,尝试一下上面三个生成多项式。
#include<iostream> int poly,rest[23] = {0x1};
bool bkt[100],bkt2[900],retag; inline int bitcount(int num){int ret = 0;while(num){ret++;num >>= 1;}return ret;
}inline int getRest(int num){return bitcount(num) == bitcount(poly)?(num ^ poly):num;}int main(){int restnum;scanf("%x",&poly);for(int i = 1;i < 22;i++){rest[i] = getRest(rest[i-1] << 1);if(rest[i] == 0)return printf("一位错:第 %d 位错的余数是 0."),0;if(bkt[rest[i]])return printf("一位错:余数重复."),0; bkt[rest[i]] = true;}for(int i = 0;i < 22;i++) for(int j = i + 1;j < 22;j++){restnum = getRest(rest[i] ^ rest[j]);if(restnum == 0)return printf("两位错(%d,%d)的余数是 0.",i,j),0;if(bkt[restnum])return printf("两位错(%d,%d)与一位错余数(%d)重复.",i,j,restnum),0;if(bkt2[restnum])retag = true;bkt2[restnum] = true;}printf(retag?"存在两位错余数重复.":"无重复.");return 0;
}
结果是:
in: 0x2f out: 两位错(0,1)与一位错余数(3)重复.
in: 0x29 out: 两位错(0,1)与一位错余数(3)重复.
in: 0x25 out: 两位错(0,1)与一位错余数(3)重复.
那么这三个生成多项式,确实二位错和一位错的余数会重复,答案说得对。至于 7 7 7 位生成多项式的情况,一位错和二位错的余数是不是真的不相同,尝试了同学提供的生成多项式 0 x 6 f \rm 0x6f 0x6f:
in: 0x6f out: 存在两位错余数重复.
可见就这个生成多项式而言,确实是能够区分两位错和一位错的,因此试卷上的答案没有问题。
Cache 与虚拟存储系统
k − k- k−路组相连,指的是每一个 cache 组有 k k k 个 cache 行(或者说 k k k 个数据块)。这里主要说一下 TLB 这个特殊的 cache 是怎么组织的。
TLB 作为一个 cache,自然也有全相联、直接相联和组相联三种方式。以 k − k- k−路组相联为例对比一下 TLB 和内存 cache。
| Cache 类型 | 映射方式 | t a g \mathit{tag} tag 字段来源 | i n d e x \mathit{index} index 字段位数 | 有无块内偏移 ( o f f s e t ) (\mathit{offset}) (offset)字段 |
|---|---|---|---|---|
| TLB | 标记 t a g \mathit{tag} tag → P P N \mathit{PPN} PPN | V P N \mathit{VPN} VPN | log 2 k \log_2k log2k | 无 |
| 内存 cache | 标记 t a g \mathit{tag} tag → 内存数据块 | 内存地址 | log 2 k \log_2k log2k | 有 |
它们最大的区别就是,TLB 中是没有 o f f s e t \mathit{offset} offset 字段的。内存 cache 是通过 t a g \mathit{tag} tag 字段找到对应的数据块,然后根据 o f f s e t \mathit{offset} offset 字段寻找对应的字节(或者字,看计算机按什么编址了);TLB 直接通过 t a g \mathit{tag} tag 字段找到对应的 P P N \mathit{PPN} PPN,不需要 o f f s e t \mathit{offset} offset 字段。这也就意味着 TLB 行的开销比内存 cache 行小很多。
指令系统
课本是以 MIPS 指令集讲解的这一章,而 MIPS 指令集中,R 型指令的操作码字段 o p \mathit{op} op 一定是为 0 0 0 的,R 型指令中不同功能的指令根据 f u n c t \mathit{funct} funct 字段来区分。
其中beq属于上面的 I 型指令,立即数字段时跳转的偏移量。这里的偏移量指的是从下一条指令开始,偏移多少条指令,而不是多少字节或者多少字。对于 MIPS32 而言,其指令字长是恒定的 32 32 32 位,即 4 B 4\rm B 4B,那么beq中立即数为 i i i 意味着要偏移 4 i 4i 4i 个字节。
CPU 设计
数据通路时间相关问题
如下图,总结了就是两个条件,对于时钟周期,要求有 T c l o c k > T c l k _ t o _ Q + T m a x + T s e t u p T_{\mathit{clock}}>T_{\mathit{clk\_to\_Q}}+T_\mathit{max}+T_\mathit{setup} Tclock>Tclk_to_Q+Tmax+Tsetup。对于寄存器的 hold time 也有要求: T h o l d < T c l k _ t o _ Q + T m i n T_\mathit{hold}<T_{\mathit{clk\_to\_Q}}+T_\mathit{min} Thold<Tclk_to_Q+Tmin。
状态机
这里说的都是无中断的状态机。
传统的三级时序和现代时序是不一样的。三级时序中,每个机器周期都包含 4 4 4 个时钟周期,而现代时序的计算、执行分别为 2 , 3 2,3 2,3 个时钟周期。它们的电路也是不一样:
三级时序中,时序发生器有一个状态机。硬布线控制器作为一个组合逻辑单元,其输出不给到时序发生器,所以应该将它和时序发生器割裂开来。这个时序发生器的状态机如下图左:
现代时序中,其实也可以弄一个时序发生器,相比于三级时序的时序发生器,少了 2 2 2 个计算周期和 1 1 1 个执行周期。如上图右所示。但是如果要用 FSM 状态机的话,响应的状态转换图如下:
这个是将 FSM 状态机和状态寄存器看作一个整的时序逻辑电路,构造出来的状态图;不是 FSM 单独的状态图,组合逻辑电路没有所谓状态图。同时注意一下所有状态中访问内存的那些状态,以及给出的READ/WRITE信号。
中断的实现方式
主要是开中断和关中断实现方式的区别:
| 中断操作 | 实现方式 | 具体 |
|---|---|---|
| 关中断 | 硬件实现 | 中断响应周期,由硬件完成 |
| 开中断 | 软件实现 | 中断返回时,eret指令将 I E \mathit{IE} IE 置为 1 1 1 |
具体可以参考下面这两张图。其中中断响应是由硬件完成的操作,中断响应不是中断服务。中断响应周期结束后, P C \mathit{PC} PC 已然是中断服务程序的地址了,中断服务程序通过取指-计算-执行按指令一条条完成。
输入输出系统
DMA 与程序中断的区别:
1 1 1.中断通过程序传送数据,DMA靠硬件来实现。
2 2 2.中断时机为两指令之间,DMA响应时机为两存储周期之间。
3 3 3.中断不仅具有数据传送能力,还能处理异常事件。DMA只能进行数据传送。
4 4 4.DMA仅挪用了一个存储周期,不改变CPU现场。
5 5 5.DMA请求的优先权比中断请求高。CPU优先响应DMA请求,是为了避免DMA所连接的高速外设丢失数据。
6 6 6.DMA利用了中断技术
相关文章:
计算机组成原理·考点知识点整理
根据往年考试题,对考点和知识点的一个整理。 校验编码 码距 一种编码的最小码距,其实就是指这种编码的码距。码距有两种定义: 码距所描述的对象含义 2 2 2 个特定的码其二进制表示中不同位的个数一种编码这种编码中任意 2 2 2 个合法编码的…...
python-datetime模块时间戳常用方法汇总
文章目录 datetime模块常用方法1、导入模块2、获取当前日期和时间3、获取当前日期4、创建特定日期或时间5、日期和时间的运算6、使用timedelta运算日期时间创建 timedelta 对象timedelta 的加减运算timedelta 的属性timedelta 的比较示例代码格式化日期和时间获取日期和时间的各…...
【Python报错】已解决ModuleNotFoundError: No module named ‘timm’
成功解决“ModuleNotFoundError: No module named ‘timm’”错误的全面指南 一、引言 在Python编程中,经常会遇到各种导入模块的错误,其中“ModuleNotFoundError: No module named ‘timm’”就是一个典型的例子。这个错误意味着你的Python环境中没有安…...
【设计模式】适配器模式(结构型)⭐⭐⭐
文章目录 1.概念1.1 什么是适配器模式1.2 优点与缺点 2.实现方式2.1 类适配器模式2.2 对象适配器模式 3 Java 哪些地方用到了适配器模式4 Spring 哪些地方用到了适配器模式 1.概念 1.1 什么是适配器模式 简单来说,适配器模式就是作为两个不兼容接口之间的桥梁。 1.…...
云原生周刊:Gateway API v1.1 发布 | 2024.6.3
开源项目推荐 Grafana Tanka Tanka 是 Grafana 开发的一款用于 Kubernetes 的灵活、可重用和简洁的配置工具,是使用 YAML 进行 Kubernetes 配置的一种替代方案。 pv-migrate pv-migrate 是一个 CLI 工具/kubectl 插件,可以轻松地将一个 Kubernetes PersistentVo…...
KotlinConf 2024:深入了解Kotlin Multiplatform (KMP)
KotlinConf 2024:深入了解Kotlin Multiplatform (KMP) 在近期的Google I/O大会上,我们推荐了Kotlin Multiplatform (KMP)用于跨移动、网页、服务器和桌面平台共享业务逻辑,并在Google Workspace中采用了KMP。紧接着,KotlinConf 2…...
探索ChatGPT-4在解决化学知识问题上的研究与应用
1. 概述 近年来,人工智能的发展主要集中在 GPT-4 等大型语言模型上。2023 年 3 月发布的这一先进模型展示了利用广泛知识应对从化学研究到日常问题解决等复杂挑战的能力。也开始进行研究,对化学的各个领域,从化学键到有机化学和物理化学&…...
性能狂飙:SpringBoot应用优化实战手册
在数字时代,速度就是生命,性能就是王道!《极速启航:SpringBoot性能优化的秘籍》带你深入SpringBoot的内核,探索如何打造一个飞速响应、高效稳定的应用。从基础的代码优化到高级的数据库连接池配置,再到前端…...
Github上一款开源、简洁、强大的任务管理工具:Condution
Condution 是一款开源任务管理工具,它以简洁易用、功能强大著称。它旨在为用户提供一个简单高效的平台,帮助他们管理日常任务、提高工作效率。 1. Condution 的诞生背景 现如今,市面上存在着许多任务管理软件,但它们往往价格昂贵…...
LeetCode-2938. 区分黑球与白球【贪心 双指针 字符串】
LeetCode-2938. 区分黑球与白球【贪心 双指针 字符串】 题目描述:解题思路一:贪心解题思路二:一次遍历统计1的个数,找0后累加左边的1的个数解题思路三: 题目描述: 桌子上有 n 个球,每个球的颜色…...
深度神经网络——什么是扩散模型?
1. 概述 在人工智能的浩瀚领域中,扩散模型正成为技术创新的先锋,它们彻底改变了我们处理复杂问题的方式,特别是在生成式人工智能方面。这些模型基于高斯过程、方差分析、微分方程和序列生成等坚实的数学理论构建。 业界巨头如Nvidia、Google…...
有代码冗余的检查工具嘛
是的,有一些代码质量工具可以帮助检查冗余代码。这些工具可以分析代码库,并识别出重复、冗余或不必要的代码片段。一些流行的代码质量工具包括: PMD: PMD 是一个开源的静态代码分析工具,支持多种编程语言,包括 Java、…...
3D培训大师:快速输出标准3D课件,打造沉浸式培训体验
随着技术的日新月异和市场的迅猛扩张,企业对员工专业技能培训的需求日益凸显。传统的培训方式往往依赖于实地操作、现场指导,这不仅需要大量的人力、物力和时间成本,而且存在安全风险。特别是化工、机械制造等行业,实操培训的成本…...
Python接口自动化测试:Json 数据处理实战
🍅 视频学习:文末有免费的配套视频可观看 🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快 上一篇说了关于json数据处理,是为了断言方便,这篇就带各位小伙伴实战一下…...
Java概述 , Java环境安装 , 第一个Hello World
环境变量,HelloWorld 1.会常用的dos命令 2.会安装java所需要的环境(jdk) 3.会配置java的环境变量 4.知道java开发三步骤 5.会java的入门程序(HelloWorld) 6.会三种注释方式 7.知道Java入门程序所需要注意的地方 8.知道println和print的区别第一章 Java概述 1.1 JavaSE体系介绍…...
查看Linux端口占用和开启端口命令
查看端口的使用的情况 lsof 命令 比如查看80端口的使用的情况 lsof -i tcp:80列出所有的端口 netstat -ntlp查看端口的状态 /etc/init.d/iptables status开启端口以开启端口80为例。 1 用命令开启端口 iptables -I INPUT -p tcp --dport 80 -j accpet --写入要开放的端口/…...
24-unittest简介
一、unittest简介 unittest是Python中常用的单元测试框架,与Java中的Junit单元测试框架类似。 二、示例程序 1)导入unittest模块 import unittest 2)使用help()函数查看源码中的示例程序 help(unittest) Simple usage:import unittestc…...
Kotlin 中,扩展函数(Extension Functions)
在 Kotlin 中,扩展函数(Extension Functions)是用于向已有的类添加新功能而无需继承或使用装饰模式的一个特性。这允许你通过更自然的语法为现有类型添加方法。 下面是一个简单的扩展函数示例: // 定义一个扩展函数,…...
堪称2024最强的前端面试场景题,让419人成功拿到offer
前言 2024年的秋季招聘还有两个月就即将到来,很多同学开始思考前端面试中场景题的重要性。这里我提供一些见解和建议来帮助大家准备即将到来的面试。 首先,理解面试中场景题的必要性是至关重要的。与算法或理论问题不同,场景题更贴近实际工…...
使用node将页面转为pdf?(puppeteer实现)
本文章适合win系统下实验(linux,mac可能会出现些莫名其妙的bug我也不会解决) 具体过程 首先了解什么时无头浏览器启动无头浏览器打开指定的url页面设置导出pdf格式开始转化完整基础代码 首先了解什么时无头浏览器 没有界面的浏览器下载pupp…...
CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型
CVPR 2025 | MIMO:支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题:MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者:Yanyuan Chen, Dexuan Xu, Yu Hu…...
.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...
React Native在HarmonyOS 5.0阅读类应用开发中的实践
一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...
TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案
一、TRS收益互换的本质与业务逻辑 (一)概念解析 TRS(Total Return Swap)收益互换是一种金融衍生工具,指交易双方约定在未来一定期限内,基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...
微信小程序云开发平台MySQL的连接方式
注:微信小程序云开发平台指的是腾讯云开发 先给结论:微信小程序云开发平台的MySQL,无法通过获取数据库连接信息的方式进行连接,连接只能通过云开发的SDK连接,具体要参考官方文档: 为什么? 因为…...
什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南
文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...
RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)
RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发,后来由Pivotal Software Inc.(现为VMware子公司)接管。RabbitMQ 是一个开源的消息代理和队列服务器,用 Erlang 语言编写。广泛应用于各种分布…...
基于Springboot+Vue的办公管理系统
角色: 管理员、员工 技术: 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能: 该办公管理系统是一个综合性的企业内部管理平台,旨在提升企业运营效率和员工管理水…...
