简介
本文章涵盖计算机技术与软件专业技术资格(水平)考试(软考)-软件设计师所需知识点。
持续更新中。。。。。。。。。。。。。。。
涉及内容
CPU相关、总线、输入输出、存储系统、进制及转换、数据的表示、校验码、计算机体系结构、总线、流水线、进程管理(前趋图)、数据结构(树、森林、链表、列表、图)、算法、面向对象、UML图、OSI七层模型、常用协议、设计模式、数据库设计、软件工程、项目管理、系统测试、知识产权等。
本文为考试而生,内容覆盖广。如有问题或不全的地方,欢迎指出,本人看到会及时修改及补充相关内容
CPU
CPU(Central Processing Unit):中央处理器,是计算机的核心部件之一,负责执行计算机程序中的指令以及进行数据处理和运算。
CPU被安装在计算机主板上,它是控制和执行计算机操作的主要组件。
CPU根据指令集执行计算机程序中的各种操作
CPU的运算速度和性能直接影响计算机的运行速度和效率
CPU的组成及功能
CPU主要由控制单元、算术逻辑单元和寄存器组成。
控制单元(控制器)
负责解释和执行指令,控制各个部件的操作,调度和管理计算机的运行。
- 指令寄存器(IR):
存储当前正在执行的指令
- 程序计数器(PC):
正在执行的指令的内存地址
- 地址寄存器:
用于存储内存地址的寄存器,以实现对内存数据的读取和写入操作
- 指令译码器:
将指令从机器码转换为对应的操作控制信号
识别指令类型:分析指令的操作码,确定指令的类型,如算术逻辑操作、数据传输、分支跳转等。
解析寻址模式:解析指令中的寻址模式,确定指令的操作数在内存中的位置。
生成控制信号:根据指令的类型和寻址模式生成相应的控制信号,包括读取操作数、写入操作数、执行操作等。
错误检测和处理:检测指令中的错误,如非法操作码、非法寻址模式等,并采取相应的措施,如中断程序执行、报错等。
算术逻辑单元(运算器)
负责进行各种算术和逻辑运算,如加减乘除、比较和逻辑判断等。
- 算术逻辑单元:
执行所有的算术和逻辑运算
- 累加器寄存器:
存储和操作算术和逻辑运算的结果
- 数据缓冲寄存器:
暂时存储数据的寄存器
- 状态条件寄存器:
保存和记录特定的状态信息和条件
寄存器
用于暂时存储和操作数据的高速存储器,用于临时存储指令和数据。
CPU的各个参数
主频
频是机器内部主时钟的频率,主频越高,完成指令的一个执行步骤所用的时间就越短,速度越快。比如跳绳,跳的越快(即频率越高),那么完成一次所用的时间就越短。
- 单位:Hz
时钟周期
与主频对应,CPU时钟周期是一个时间单位,即一个周期的时长
- 单位:s(秒)(ms,μs等)
- 计算:CPU时钟周期=1/主频
CPI
全称为:Clock cycle Per Instructions:即一条指令所需要的时钟周期数。
需要注意的是这个是需要的时钟周期数,不是时钟周期。
- 计算:CPI = 程序所需时钟周期数 / 程序所含指令数
把周期数平分为n份,n为指令数,即求得每条指令所需要时钟周期数,这里计算的是平均值,一般情况下均计算平均值
- 单位:周期数/每条指令(根据算式得的,一般没要求,这里为了帮助理解)
IPS
IPS(Instructions Per Second):每秒执行多少条指令;
- 计算:IPS = 主频 ÷ CPI
MIPS
英文全称:Million Instructions Per Second:即每秒执行多少百万条指令。
- 计算:MIPS = 主频 ÷ (CPIx106)
CPI与MIPS例题
某计算机系统的CPU主频为2.8GHZ
。某应用程序包括3类指令,各类指令的CPI(执行每条指令所需要的时钟周期数) 及指令比例如下表所示。执行该应用程序时的平均CPI为 ( ?1 );运算速度用MIPS表示,约为 ( ?2 )。
指令A | 指令B | 指令C | |
---|---|---|---|
比例 | 35% | 45% | 20% |
CPI | 4 | 2 | 6 |
?1
平均CPI为?
4*35%+2*45%+6*20%=3.5
?2
MIPS(每秒执行的百万条指令数)?
- 每秒执行指令数为
2.8G/3.5=0.8G=800M
(MIPS)。(1M=106,1G=109)
总线
总线的作用
共享
- 总线的共享在计算机系统中是指多个设备共同使用同一条总线传输数据和控制信号的过程。
- 共享总线可以提供高效的数据传输和资源共享,但也会引发一些问题。
在计算机系统中,总线通常被分为数据总线、地址总线和控制总线。
不同设备通过这些总线进行数据传输和通信。
总线的共享可以在同一时间内让多个设备同时使用总线,实现数据交换和通信。
-
总线共享的优点:
- 提高系统的效率和性能:多个设备共享同一条总线可以减少总线的使用冲突,提高系统的数据传输效率。
- 节约系统成本:共享总线可以减少总线的数量和复杂性,节约系统设计和制造的成本。
- 方便资源共享:不同设备可以通过总线进行数据传输和通信,方便实现资源共享和协作。
-
总线共享的缺点:
- 性能瓶颈:多个设备共享同一条总线可能会导致总线的带宽不够用,造成数据传输的性能瓶颈。
- 冲突和竞争:多个设备同时请求使用总线可能会引发冲突和竞争,需要设计合适的总线控制机制来解决。
- 设备间的时序问题:多个设备共享总线时,需要协调设备之间的时序关系,确保数据传输的正确性和稳定性。
- 计算机系统常常采用多总线结构、总线仲裁协议和高速总线等技术来提高总线的共享效率和性能。
分时
同一时刻仅允许一个部件向总线发送信息,但允许多个部件同时从总线上接收相同的信息。
串行总线
- 串行总线是一种数据传输方式,它通过在单根线上逐位地传输数据来实现通信。
- 与并行总线相对,串行总线只使用一个传输通道来传输数据,这使得串行总线在传输数据时更加简单和高效。
- 优点之一是它可以传输长距离的数据,因为只需要一根线来传输数据,降低了成本。
- 可以更好地利用带宽,因为数据是逐位传输的,可以更好地解决并行总线中可能出现的数据冲突问题。
- 与并行总线相比,串行总线的传输速度较慢。
- 由于数据是逐位传输的,传输速度限制在总线的时钟频率上,因此传输速度相对较低。
- 由于数据逐位传输,对于大量数据的传输会引入更多的延迟。
- 串行总线是当前计算机系统中广泛使用的一种总线类型,例如
USB
、Ethernet
等。它们通过串行的方式传输数据,以满足不同设备之间的数据传输需求。
并行总线
- 并行总线是一种计算机通信和数据传输的架构。
- 由多个并行的电子信道组成,每个信道可以同时传输多个比特的数据。
- 并行总线可以在多个设备之间进行并行数据传输,提高数据传输速度和效率。
- 并行总线通常由多个数据线、地址线和控制线组成。
- 数据线用于传输数据,
- 地址线用于指定数据的存储位置
- 控制线用于控制数据传输的各个步骤。
- 在并行总线中,数据被分割成多个比特,同时通过不同的信道进行传输,从而实现并行传输。
并行总线可以应用于各种计算机系统中,包括个人计算机、服务器、嵌入式系统等。它可以提供高速的数据传输能力,适用于需要大量数据传输的应用场景,如多媒体处理、科学计算等。
尽管并行总线可以提供高速的数据传输能力,但它也存在一些限制。首先,由于需要同时传输多个比特的数据,所以需要更多的电子信道和硬件支持,增加了系统的成本和复杂性。其次,并行总线的传输距离限制较小,传输的数据位数越多,受到干扰的可能性就越大。
随着计算机技术的发展,串行总线逐渐替代并行总线成为主流。串行总线通过将数据逐个比特地传输,减少了信道数量和硬件支持,提供了更高的传输速度和更远的传输距离。
单 工、半双工、双工
单工通信:单工通信是一种通信方式,只允许信息在一个方向传输。发送方只发送信息,而接收方只接收信息,没有反馈机制。这种方式的通信效率较低,常见于广播电视、广播广告等。
半双工通信:半双工通信是一种通信方式,允许信息在两个方向上传输,但只能在不同的时间段进行传输。发送方和接收方交替进行信息的发送和接收,不能同时进行。这种方式的通信效率较高,常见于对讲机、聊天软件等。
双工通信:双工通信是一种通信方式,允许信息在两个方向上同时传输。发送方和接收方可以同时发送和接收信息,不受时间限制。这种方式的通信效率最高,常见于电话、互联网等。
总线的类型
数据总线(双向)
- 数据总线是计算机中传输数据的一组线路。
- 可以将数据从计算机的内部组件(如处理器、内存)传输到外部设备(如打印机、显示器)或其他计算机。
- 通常由多条并行线路组成,每条线路可以传输一个二进制位(0或1)。
- 数据总线的宽度决定了它可以一次传输的位数,也称为数据总线的位宽。
- 数据总线不仅可以传输数据,还可以传输控制信号和地址信息,以控制数据的传输和访问。
地址总线(单向)
- 地址总线是一种用于传输地址信息的电子通路,它将处理器或其他设备产生的地址信号传送给存储器或其他外部设备。
- 地址总线决定了处理器能够寻址的内存或外设的范围。
- 地址总线的宽度决定了系统的最大寻址能力。
- 如果一个系统的地址总线宽度为
n
位,那么该系统可以寻址的内存或外设数量为2
的n
次方。 - 例如:一个16位地址总线的系统可以寻址
2
的16
次方,即64KB
的内存或外设。
- 如果一个系统的地址总线宽度为
地址总线是计算机系统中重要的组成部分,它与数据总线和控制总线共同构成了系统的总线系统。通过地址总线,处理器能够指定要访问的内存地址或外设地址,从而实现数据的读取或写入。地址总线的宽度也会影响系统的性能,较宽的地址总线可以提供更大的寻址范围和更高的数据传输速度。
地址总线是单向传输的,仅用于将地址信息从处理器传输到存储器或外设。数据的传输则通过数据总线完成。控制总线则用于传输控制信号,如读写控制信号、时钟信号等。
控制总线
- 计算机内部使用的一种数据传输通路。
- 负责传输各种控制信号,如时钟信号、地址信号、数据信号等,以控制各个硬件组件的操作。
- 将计算机的控制器与其他硬件组件连接起来,实现了指令的执行和数据的传输。
- 通过控制总线,计算机可以实现各种功能,如读写内存、执行指令、进行输入输出等。
- 控制总线的设计直接影响了计算机的运行速度和功能扩展能力。
总线宽度
总线宽度是指总线的线数,即数据信号的并行传输能力,也体现总线占用的物理空间和成本;
总线的带宽是指总线的最大数据传输率,即每秒传输的数据总量。
总线宽度与时钟频率共同决定了总线的带宽。
例:总线宽度32bit
,时钟频率为200MHz
,若总线上每5
个时钟周期发送一个32bit
的字,则该总线的带宽为:160 MB/s = 200MHz / 5 * (32bit / 8)
系统总线
又称内总线或板级总线,在微机系统中用来连接各功能部件而构成一个完整的微机系统。
系统总线包含有三种不同功能的总线,即数据总线DB (Data Bus)、地址总线AB (Address Bus)、控制总线CB (Control Bus)。
ISA (Industrial Standard Architecture)
- AT总线
- 1984年由IBM公司为推出PC/AT机而建立的系统总线标准。
- 是对XT总线的扩展,以适应8/16位数据总线要求。
EISA总线
- 1988年由Compaq等9家公司联合推出的总线标准。
- 在ISA总线的基础上使用双层插座,在原来ISA总线的98条信号线上又增加了98条信号线,也就是在两条ISA信号线之间添加一条EISA信号线。
- 在实用中,EISA总线完全兼容ISA总线信号。
PCI (Peripheral Component Interconnect)
- 由Intel公司推出的一种局部总线。
- 它定义了32位数据总线,且可扩展为64位。
- PCI总线主板插槽的体积比原ISA总线插槽还小,支持突发读写操作,最大传输速率可达132MB/S,可同时支持多组外围设备。
- PCI局部总线不能兼容现有的ISA、EISA、MCA (Micro Channel Architecture)总线,但它不受制于处理器,是基于奔腾等新一代微处理器而发展的总线。
SCSI (Small Computer System Interface)
- 是一种用于计算机和智能设备之间(硬盘、软驱、光驱、打印机、扫描仪等)系统级接口的独立处理器标准。
存储系统
存储系统主要包括以下几种类型:
- 主存储器(主存):
- 又称:内存,是计算机中用于存储程序指令和数据的临时存储器。
- 由动态随机存取存储器(
DRAM
)芯片组成,具有较快的读写速度。 - 计算机进行数据处理的关键组件。
- 辅助存储器(外存):
- 二级存储器,用于长期存储数据和程序。
- 常见的辅助存储器包括硬盘驱动器、光盘和闪存驱动器等
- 辅助存储器的容量通常比主存储器大得多,但访问速度较慢。
- 高速缓存(Cache):
- 位于主存储器和处理器之间的存储器层次结构中的一级缓存。
- 高速缓存用于存储最近使用的数据和指令,以提高处理器的数据访问速度。
- 高速缓存通常由静态随机存取存储器(
SRAM
)构成,具有较快的读写速度。
- 虚拟存储器:
- 一种将辅助存储器扩展到主存储器的技术。
- 虚拟存储器使用页面置换算法将主存储器中的数据和指令分成固定大小的页面,当某个页面不再被频繁使用时,可以将其置换到辅助存储器中,以释放主存储器空间。
- 存储器控制器:
- 连接计算机系统的存储器和处理器的关键组件。
- 存储器控制器负责管理数据在各个存储层次之间的传输和调度。
分类
- 存储器位置:内存、外存
- 层次
- 可被CPU直接读写:高速缓存、主存、内存
- 不可被CPU直接读写:辅助存储器(硬盘、光盘、U盘等)
- 按存储介质
- 半导体:主存、Cache
- 磁表面存储器: 磁盘,磁带
- 光存储器
- 按信息的可更改性进行分类
- 读写存储器:可读可写(如内存,硬盘等)
- 只读存储器:只能读,不能写(如电影使用的光碟)
- 按信息的可保存性进行分类
- 易失性存储器:断电后数据消失(主存,Cache)
- 非易失性存储器:断电依然保存(磁盘、光盘)
- 破坏性读出:读出数据后要进行重写(如DRAM芯片)
- 非破坏性读出:读出数据后原数据没被破坏(如SRAM芯片、磁盘、光盘)
- 存取方式
- 按内容存取:相联存储器(Cache)
- 按地址存取
- 随机存取存储器(内存)
- 顺序存取存储器(磁带)
- 直接存取存储器(磁盘)
- 工作方式
- 随机存取存储器(RAM):内存
- DRAM:动态随机存取纯存储器
- SRAM:静态随机存取纯存储器
- 制度存储器(ROM):BIOS
高速缓存(cache)
概念:
- 一种高速存储器,用于暂时存储来自
主存(RAM)
的数据,以提高CPU
访问数据的速度。 - 缓存采用了快速的
SRAM(静态随机访问存储器)
技术,与主存
相比,它具有更低的访问延迟和更高的带宽
。 - 遵循
局部性原理
,通过将最经常访问的数据和指令
存储在靠近CPU
的高速存储器
中,减少对主存
的读取次数
,从而提高系统性能。局部性原理
- 时间局限性:被引用过一次的存储器位置在未来会被多次引用,主要体现是主要是循环
- 空间局限性:如果一个存储器的位置被引用,那么将来他附近的位置也会被引用,主要体现是顺序执行的过程
- 工作集理论:工作集是进程运行是被频繁访问的页面集合
- 存在多级缓存:缓存的层次结构主要是为了平衡容量和速度两个因素
- 其中L1缓存是最接近CPU的一级缓存,通常包括数据缓存和指令缓存。
- L2缓存位于L1缓存之外,其容量较大,但速度稍慢。
- 更多缓存:如L3缓存和L4缓存。
- 缓存采用了缓存行的概念,即一次从主存中读取的数据块大小。
- 常见的缓存行大小为64字节或128字节。
- 当CPU请求某个地址的数据时,缓存会先查看是否在缓存行中
- 是:
命中(Cache Hit)
,直接返回缓存中的数据; - 否:
不命中(Cache Miss)
,缓存需要从主存
中加载相应的数据块
,并将其存储到相应的缓存行中,然后再返回数据给CPU
。
- 是:
- 采用
缓存替换算法
来决定在缓存满时应该替换哪些数据。- 最近最少使用(LRU)
- 最不经常使用(LFU)
- 随机替换等。
如果以 h
代表对Cache
的访问命中率,t1
表示Cache
的周期时间,t2
表示主存储器周期时间,以读操作为例。使用用“Cache + 主存储器”的系统的平均周期为t3
则:
t3 = h * t1 + (1 - h) * t2
其中,(1 - h)
又称为失效率(未命中率)。
地址映像
地址映像是将贮存与Cache的存储空间划分若干大小相同的页(块)
描述 | 冲突率 | 电路复杂度 | |
---|---|---|---|
直接相联映像 | 主存的块与 Cache块的对应关系是固定的 | 高 | 简单 |
全相联映像 | 主存与 Cache均分成大小相同的块,允许主存的任一块可以调入 Cache存储器的任何一个块的空间中 | 低 | 复杂 |
组相联映像 | 将 Cache中的块再分成组,组采用直接映像方式而块采用全相联映像方式。即主存任何区的0组只能存到 Cache的o组中1组只能存到 Cache的1组中,依此类推组内的块则采用全相联映像方式,即一组内的块可以任意存放。即主存一组中的任一块可以存入cache相应组的任一块中 | 中 | 折中 |
注:主存与Cache的地址映射由硬件直接完成
缓存替换算法
算法 | 描述 | 优点 | 缺点 |
---|---|---|---|
FIFO | 淘汰最早被缓存的页面 | 实现简单 | 对长时间驻留在缓存中的数据不友好,可能导致高缓存命中率的数据被淘汰 |
LRU | 淘汰最久未使用的页面 | 适用于热点数据,能够保留经常访问的数据 | 实现较复杂,需要维护访问时间的记录 |
LFU | 淘汰访问频次最低的页面 | 适用于长时间内不变的数据,能够保留经常被访问的数据 | 对频繁变化的数据不友好,可能导致访问频次高的数据被淘汰 |
LRU-K | 基于最近一段时间内的访问情况进行淘汰 | 能够平衡最近访问和长期访问的数据 | 实现较复杂,需要维护最近访问的记录 |
LRU-2 | 维护两个队列,淘汰最久未使用的页面 | 简化了LRU的实现,提高了淘汰效率 | 不适用于有循环访问模式的数据 |
随机算法 | 随机选择一个页面进行淘汰 | 实现简单 | 对所有数据公平,不会有特定数据被频繁淘汰的问题 |
读写过程
- 写直达:同时写Cache与内存
- 写 回:只写Cache,淘汰页面时,写回内存
- 标记法:只写入内存,并将标志位清零,若用到此数据,只需要再次调取
主存
编址
例题:
内存地址从AC000H到C7FFFH,共有 ( ?1 ) K个地址单元,如果该内存地址按字编址,由28片存储器芯片构成,已知构成内存的芯片每片有16K个存储单元,则该芯片每个存储单元存储 ( ?2 )位。
-
?1 :
112
- 计算公式:高位地址 - 低位地址 + 1 = 地址单元(字)
1.C7FFFH - AC000H + 1 = 1C000H(字)
2.1C000H - 1024 = 112(K)
-
?2:
4
1.(112 * 16k) / (28 * 16K) = 4
磁盘管理
-
机械磁盘存取时间指的是计算机读取或写入数据到机械硬盘所需的时间。
-
机械磁盘由盘片和机械臂组成,当计算机需要读取或写入数据时,机械臂会移动到盘片上特定的位置,并且盘片需要旋转到特定的扇区。
在磁盘调度中,通常先进行移臂调度再进行旋转调度
-
因此,机械磁盘存取时间主要由以下几个因素决定:
- 寻道时间(Seek Time):即机械臂从当前位置移动到所需磁道的时间。机械臂的移动速度决定了寻道时间的长短。
- 延迟时间(Latency Time):即盘片旋转到所需扇区的时间。盘片的转速越高,延迟时间越短。
- 数据传输时间(Transfer Time):即数据从磁盘读取或写入的时间。传输时间取决于数据的大小和磁盘的传输速度。
-
存取时间 = 寻道时间 + 延迟时间 + 数据传输时间
机械磁盘相对于固态硬盘来说,存取时间较长。固态硬盘不需要机械臂移动和盘片旋转,因此存取时间更短,速度更快。
例题2:
假设某磁盘的每个磁道划分为11个物理块,每块存放1个逻辑记录。逻辑记录R0、R1、…、R2、R3存放在同一磁道上,记录的存放顺序如下表所示:
物理块 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
---|---|---|---|---|---|---|---|---|---|---|---|
逻辑记录 | R0 | R1 | R2 | R3 | R4 | R5 | R6 | R7 | R8 | R9 | R10 |
-
如果磁盘的旋转周期为33ms,磁头当前处在R0开始出。若系统使用单缓冲区顺序处理这些记录,每个记录的处理时间为3ms,则处理这11个记录的最长时间为?
注意:
已知磁盘旋转周期为33ms
,共11个数据,则读取每个数据的时间为33 / 11 = 3ms
- 从
0ms
开始,第一次读取 R0 放入单个缓存区中 3ms
:磁头继续转动的同时数据开始处理:第二次读取 R1 后 缓存区中还存在 R0 ,无法存入 R1,需要等待 R0 处理完成,并且磁头不会等待
,磁头会继续旋转
定位到 R2 。6ms
:R0 处理完成后,此时磁头数据在 R2,要求位顺序处理,此时需要等待磁头重新转动到 R1 后才可继续处理36ms
:此时磁头重新定位到 R1- 处理 R0并等待磁头转动到 R1 的时间为
36ms
(读取时间3ms
+ 等待磁头时间33ms
)处理数据与磁头转动同时进行,此处忽略处理时间
- R0 - R9总处理时间为
36ms * 10
- R10 处理时间为 读取数据
3 ms
,处理时间3 ms
- R10 之后没有数据需要进行处理,所以此处不计算磁头等待时间,只计算数据处理时间
- 总处理时间为:
366 ms
=36ms * 10
+6ms
- 从
-
若对信息存储进行优化分布后,处理11个记录的最少时间为?
- 优化后的数据排列如图所示
- 由于不需要等待磁头,每次读取数据处理完成后,磁头定位的数据正好为所需要处理的数据
- 所以每次处理时间为
6ms
(数据读取时间3ms
+处理时间3ms
) - 总处理时间为:
66ms
- 优化后的数据排列如图所示
输入输出系统设计
直接程序控制
概念:
- 直接程序控制是一种输入输出技术,它通过编程方式控制计算机系统的输入输出设备。
- 在直接程序控制中,输入输出设备的操作是由计算机系统的程序直接控制的。这意味着程序可以直接发送命令给输入输出设备,以完成特定的操作,如读取数据、写入数据、打印文档等。
- 直接程序控制使用特定的指令和编程接口来与输入输出设备进行通信。这些指令和接口允许程序读取和写入设备的寄存器、缓冲区和状态信息,以便进行设备的控制和数据传输。
工作方式:两种(无条件传送/ 程序查询方式)
- 无条件传送
- 程序执行时,无需进行条件判断,直接跳转到指定的程序段进行执行
- 使用无条件跳转指令(如JMP指令)来实现。
- 程序查询方式
- 根据特定的条件判断结果来选择跳转到不同的程序段进行执行
- 查询方式通常使用条件跳转指令(如JZ、JNZ等)来实现。
- 条件跳转指令会根据特定的条件判断结果改变程序执行的流程
- 如果判断结果为真,则跳转到指定的程序段执行
- 如果判断结果为假,则继续顺序执行下一条指令
缺点:
- 降低了CPU 的效率
- 对外部的突发事件无法做出实时响应
程序中断方式
概念:
程序中断是指在执行程序的过程中,当需要进行输入输出操作时,会发生中断,将控制权转移到相应的I/O处理程序上,等待I/O操作完成后再将控制权还给原程序。
特点:
- 当系统中有多个中断请求时,中断系统按优先级进行排队。
- 中断嵌套:若在处理低级中断过程中又有高级中断申请中断,则
高级中断可以打断低级中断处理
,转去处理高级中断,等处理完高级中断后再返回去处理原来的低级中断。 - 实现中断嵌套用
后进先出
的栈
来保护断点和现场最有效。
工作方式:
- 程序执行到需要进行输入输出操作的指令时,比如读取用户输入、写入文件等。CPU发出一个中断请求信号,将控制权转移到中断处理程序。
- 中断处理程序会保存当前程序的状态,将CPU的控制权转移到I/O处理程序。
- I/O处理程序会执行相应的输入输出操作,比如从设备中读取数据、向设备中写入数据。
- 当I/O操作完成后,中断处理程序会将数据传递给原程序或将数据写入内存中的指定位置。
- 中断处理程序将控制权还给原程序,原程序继续执行。
优点:使CPU在进行输入输出操作时不会浪费太多时间,而是可以继续执行其他程序
缺点:中断处理程序需要占用一定的CPU资源,可能会导致一定的性能损失。
DMA
概念:DMA(Direct Memory Access,直接内存访问)
- 一种计算机输入输出(I/O)技术,用于实现高速数据传输。
- 允许外部设备(如硬盘、网卡等)直接访问计算机的主内存,而不需要经过CPU的介入,从而提高数据传输的速度和效率。
工作方式:
-
在CPU和外部设备之间设置一个特殊的DMA控制器,负责管理数据的传输和存储。
注意:这里是 DMA控制器 并不是 数据通路
-
当
外部设备
需要读取或写入大量数据时,它会发送一个DMA请求给DMA控制器
,请求将数据传输到或从主内存
中。注意:这里才是:建立了一个主存到外设的通道
-
DMA控制器会占用CPU的总线,直接和内存进行数据传输,而不需要CPU的介入。
-
一旦数据传输完成,DMA控制器会发送一个中断信号给CPU,通知数据传输的完成。
优点:
- 使用DMA的好处是它可以减少CPU的负担,提高系统的性能。
- 由于数据传输是直接在内存和外设之间进行的,不需要CPU的介入,所以CPU可以在数据传输的同时继续执行其他任务。
- 对于需要大量数据传输的应用程序特别有用,如高清视频播放、大规模数据处理等。
输入/输出处理机(IPO)
-
输入/输出处理机(IPO)是计算机系统中的一个重要组成部分,用于处理与外部设备之间的数据输入和输出。
-
IPO的主要功能是管理计算机系统与外部设备之间的数据传输。它负责接收外部设备发送的数据,并将其传递给中央处理单元(CPU)进行处理。同时,IPO也负责将CPU处理好的数据发送给外部设备进行输出。
-
IPO可以与各种外部设备进行数据交互,例如键盘、鼠标、显示器、打印机等。它通过与这些设备的接口进行连接,并通过这些接口来控制设备的操作。
-
除了数据传输功能外,IPO还具备数据缓冲和中断处理的能力。它可以将接收到的数据存储在缓冲区中,以便等待CPU处理。当外部设备发送中断请求时,IPO能够响应并及时处理中断事件。
计算机体系结构
Flynn分类法
- Flynn分类法是计算机体系结构的分类方法之一,
- 基于指令流中的指令数目和操作数的数目对计算机体系结构进行分类。
- 根据指令流中的指令数目可以将计算机体系结构分为:
- 单指令流单数据流(SISD)
- 指令流中只包含一条指令,每个时钟周期只能处理一个操作数。
- 这是传统的冯·诺依曼计算机体系结构,顺序执行指令,如一般的个人电脑。
- 单指令流多数据流(SIMD)
- 指令流中包含多个相同的指令,每个时钟周期可以同时处理多个数据。
- 这种体系结构适用于数据并行计算,如图形处理器(GPU)。
- 多指令流单数据流(MISD)
- 指令流中包含多条指令,每个时钟周期处理一个操作数,但是每条指令在不同的数据上操作。
- 这种体系结构并不常见,主要用于特定领域的应用,如冗余计算和错误检测。
- 多指令流多数据流(MIMD)
- 指令流中包含多条指令,每个时钟周期可以同时处理多个数据。
- 这种体系结构适用于任务并行计算,如分布式系统。
- 单指令流单数据流(SISD)
CISC与RISC
指令系统类型 | 类型 | 寻址方式 | 实现方式 | 其他 | 代表 |
---|---|---|---|---|---|
CISC(复杂) | 数量多,使用频率差别大,可变长格式 | 支持多种 | 微程序控制奇数(微码) | 研发周期长 | X86 |
RISC(精简) | 数量少,使用频率接近,定长格式,大部分为单周期指令,操作寄存器,只有 load/store 操作内存 | 支持方式少 | 增加了通用寄存器;硬布线逻辑控制为主,适合采用流水线 | 优化编译,有效支持高级语言 | RISC-V ARM |
比较维度:指令数量、指令使用频率、寻址方式、寄存器、流水线支持、高级语言支持
CISC: 复杂、指令数量多、频率差别大、多寻址、桌面计算机和服务器
RISC: 精简、指令数量少、操作寄存器、单周期、少寻址、多通用寄存器、流水线、嵌入式系统和移动设备
现代的处理器设计已经混合了 CISC 和 RISC 的特点,将两种体系结构的优点结合起来,以提供更好的性能和效率。
这种混合体系结构通常称为:复合体系结构 (CISC-RISC Hybrid)。
流水线技术
流水线是指在程序执行时多条指令重叠进行操作
的一种准并行处理实现技术。
——> 取指 ——> 分析 ——> 执行 ——>
各种部件同时处理是针对不同指令而言的,它们可同时为多条指令的不同部分进行工作,以提高各部件的利用率和指令的平均执行速度
流水线计算
1条指令执行时间+(指令条数-1)*流水线周期
理论公式:(t1+t2+...+tk)+(n-1)* △t
实践公式:k * t + (n-1) * t
流水线建立时间:第一条指令的执行时间
流水线周期:执行时间最长的一段
K:流水线 段数
例:若指令流水线吧一条指令分为取指、分析、执行三部分,且三部分的时间分别是取指2ns、分析2ns、执行1ns
流水线周期是 2ns
100条执行全部执行完毕 理论公式需要 203 ns,实践公式需要204 ns
流水线吞吐率计算
流水线的吞吐率是指在单位时间内流水线完成的任务数量或输出的结果数量。
计算流水线吞吐率的最基本的公式如下:
流水线最大吞吐率:
流水线的加速比
完成同样一批任务,不使用流水线所用的时间与使用流水线所用的时间之比称为流水线的加速比。
计算基本公式:
流水线的效率
流水线的效率是指流水线的设备利用率。
在时空图上,流水线的效率定义为n个任务占用的时空区与k个流水段总的时空区之比
计算公式:
冯诺依曼结构和哈弗结构
冯诺依曼结构(Von Neumann Architecture)
又名:存储程序计算机
冯诺依曼结构的特点是将计算机的指令存储器和数据存储器合并在一起,共享同样的存储空间。它包括五个组成部分:运算器、控制器、存储器、输入设备和输出设备。
运算器(ALU)负责进行数学和逻辑运算
控制器(Control Unit)负责指挥和协调各个部件的工作
存储器(Memory)用于存储程序和数据;
输入设备(Input Device)用于将数据输入计算机;
输出设备(Output Device)用于将计算结果输出。
(1)一般用于PC处理器,如AMD、英特尔的酷睿i3,i5,i7处理器
(2)指令与数据存储器合并在一起
(3)指令与数据都通过相同的数据总线传输。
哈佛结构(Harvard Architecture)
哈佛结构的特点是将指令存储器和数据存储器分离,分别使用不同的存储空间。
这样可以同时进行指令的取指和数据的存取,提高了数据传输和运算的效率。哈佛结构常用于嵌入式系统和一些特定的应用领域。
(1)一般用于嵌入式系统处理器(DSP)数字信号处理(DSP,Digital SignalProcessing)
(2) 指令与数据分开存储,可以并行读取,有较高数据的吞吐率
(3) 四条总线:指令和数据的数据总线与地址总线
进制
进制的含义
常见的进制系统包括
二进制(基数为2)
、八进制(基数为8)
、十进制(基数为10
、十六进制(基数为16)
进制 | 数码 | 基数 | 位权 |
---|---|---|---|
十进制(D) | 0,1,2,3,4,5,6,7,8,9 | 10 | 10k |
二进制(R) | 0,1 | 2 | 2k |
十六进制(H) | 0-9,A,B,C,D,E,F | 16 | 16k |
进制转换
进制转换是将一个数字从一种进制表示转换为另一种进制表示的过程。在数学和计算机科学中,我们经常使用不同的进制系统来表示整数和小数。
要进行进制转换,我们需要了解每种进制系统的表示方法和计算规则。例如,十进制系统是我们日常生活中最常用的进制系统,使用0-9这10个数字。二进制系统则只使用0和1两个数字。
进制转换的方法主要有两种:逐位转换和除法取余法。
- 逐位转换:将数字的每一位分别转换为目标进制的表示,然后组合起来。
- 除法取余法则:不断地将数字除以目标进制的基数,并将余数作为结果的一部分,最后倒序排列余数。
二进制 转 十进制 (按权展开法)
- 将二进制数的每一位数值用 Rk 形式表示,即幂的底数是 R,指数为 K
- 底数:为自身的基数
2
- 指数:为自身每个数字的下标,也就是二进制每一个数字,从右到左,从0开始
二进制数字 1 0 1 下标/指数 2 1 0
- 底数:为自身的基数
- 例:
- 二进制:
10101
- 过程:
1 0 1 0 1 1 * 24 0*23 1*22 0*21 1*20 - 对应关系如上,最后所得结果为:
10100
= 1 * 24 + 1 * 22 + 1 * 20 =16+4+1
=21
- 二进制:
二进制 转 十六进制 (取四合一法)
- 每四位取成一位,从右往左(不足四位时补零)
100101
=0010 0101
- 将每个四位二进制转为
10进制
,再将十进制转为十六进制(10=A,11=B,12=C,13=D,14=E,15=F)
- 按顺序进行排列,小数点的位置不变
- 例:
- 二进制:
100101
- 过程:
111110
=0011 1110
0010 0101
=3 14
3 14
=3 E
- 对应关系如上,最后所得结果为:
111110
=3E
- 二进制:
十进制 转 二进制(短除法)
-
将十进制数按二进制的基数(
2
)进行取余计算,所得商
为下次的除数
,所得余数
为二进制数
-
十进制:
94
除数 余数 2/94 0 2/47 1 2/23 1 2/11 1 2/5 1 2/2 0 1 1 0 -
结果:
94
=1011110
十进制 转 十六进制(短除法)
-
将十进制数按十六进制的基数(
16
)进行取余计算,所得商
为下次的除数
,所得余数
为十六进制数
-
十进制:
93
除数 余数 16/94 5 16/14 14(D) 0 结果:
93
=5D
十六进制 转 二进制
- 将十六进制的每一位数字分隔
- 将每一位数字转换为4位二进制
- 接着将四位的二进制数字按顺序进行排列
- 十六进制:
5D
- 过程:
5 D
=5 13
5 13
=0101 1101
- 结果:
5D
=0101 1101
十六进制 转 十进制(按权展开法)
- 将十六进制数的每一位数值用 Rk 形式表示,即幂的底数是 R,指数为 K
- 底数:为自身的基数
16
- 指数:为自身每个数字的下标,也就是二进制每一个数字,从右到左,从0开始
|十六进制数字|A|0|5|D|
|–|–|–|
|下标/指数|2|1|0|
- 底数:为自身的基数
- 例:
- 十六进制:
A05D
- 过程:
A 0 5 D A * 163 0 * 162 5 * 161 D*160 10 * 163 0 * 162 5 * 161 13*160 - 对应关系如上,最后所得结果为:
A05D
= 10 * 163 + 5 * 161 + 13*160 =40960+80+13
=41053
- 十六进制:
数据的表示
原码、反码、补码、移码
计算机中用来表示带符号整数的四种编码方式为:原码、反码、补码、移码
- 原码(Sign-Magnitude)
- 最高位表示符号,0表示正数,1表示负数
- 其余位表示数值
- 反码(Ones’Complement)
- 正数的反码与原码相同
- 负数的反码是对原码的每一位取反(符号位除外)
- 补码(Two’s Complement)
- 正数的补码与原码相同
- 负数的补码是对原码的反码加1。
- 移码(Excess-K)
- 移码是对其补码的符号位取反。
数值1 | 解释 | 数值-1 | 解释 | 1-1 | |
---|---|---|---|---|---|
原码 | 0000 0001 | 1000 0001 | 1000 0010 | ||
反码 | 0000 0001 | < 与原码相同 | 1111 1110 | < 对原码取反(除符号位) | 1111 1111 |
补码 | 0000 0001 | < 与原码/反码相同 | 1111 1111 | < 在反码的基础上加1 | 0000 0000 |
移码 | 1000 0001 | < 符号位取反 | 0111 1111 | < 符号位取反 |
浮点数
码制 | 定点整数 | 定点小数 | 数码个数 |
---|---|---|---|
原码 | -(2n-1 -1) ~ +(2n-1 -1) | -(1-2-(n-1) ) ~ +(1-2(n-1) ) | 2n-1 |
反码 | -(2n-1 -1) ~ +(2n-1 -1) | -(1-2-(n-1) ) ~ +(1-2(n-1) ) | 2n-1 |
补码 | -2n-1 ~ (2n-1 -1) | -1~(1-2-(n-1)) | 2n |
移码 | -2n-1 ~ (2n-1 -1) | -1~(1-2-(n-1)) | 2n |
- 浮点数表示: N = M * Re
- M 为尾数
- e 为指数
- R 为基数
- 运算过程:対阶 ——> 尾数计算 ——> 结果格式化
- 特点
- 一般尾数用 补码,阶码用移码
- 阶码决定数的表示范围,位数越多范围越大
- 尾数决定数的有效精度,位数越多精度越大
- 对阶时,小数向大数看齐
- 对阶是通过较小数的尾数右移实现的
逻辑运算
逻辑变量之间的运算称为逻辑运算。二进制数 1 和 0 在逻辑上可代表 “真” 与 “假”
优先次序:
! (非) ——> && (与) ——> || (或)
逻辑运算符中的 “&&” 和 “||” 低于关系运算符, “!” 高于算数运算符
符号 | 译 | 解释 |
---|---|---|
&&、*、·、n、AND | 与 | 连接的两个逻辑值全1时才取1 |
丨丨、+、U、V、OR | 或 | 连接的两个逻辑值全0时才取0 |
!、~、NOT | 非 | 将原逻辑值取反 |
⊙、XNOR | 同或 | 连接的两个逻辑值相同才取1,不同则取0 |
⊕、XOR | 异或 | 连接的两个逻辑值不相同才取1,相同则取0 |
真值表
A | B | !A | A+B | A*B | A⊙B | A⊕B |
---|---|---|---|---|---|---|
0 | 0 | 1 | 0 | 0 | 0 | 1 |
0 | 1 | 1 | 1 | 0 | 1 | 0 |
1 | 0 | 0 | 1 | 0 | 1 | 0 |
1 | 1 | 0 | 1 | 1 | 0 | 1 |
运算符运算优先级
!
> 算数运算符
> 关系运算符
> &&
> ||
> 赋值运算符
短路原则
在逻辑表达式的求解中,并不是所有逻辑运算符都要被执行。
- 例1:
a && b && c
:只有a
为真时,才需要判断b
的值,只有a
和b
都为真时,才需要判断c
的值 - 例2:
a || b || c
:只要a
为真,就不必判断的b
和c
的值,只有a
为假,才判断b
,a
和b
都为假才判断c
模2运算
简介:模2运算是一个对二进制数进行运算的操作,它的原理是将两个二进制数按位进行异或运算。
具体来说,对于两个二进制数a和b
,模2运算可以表示为a ⊕ b
,其中⊕
表示异或操作。
特点:
- 一种二进制算法,CRC校验技术中的核心部分。本质是异或运算,且不考虑进位和借位。
- 每一位的结果只有两种可能:0和1。
- 如果两个二进制数的对应位相同,那么结果为0;
- 如果对应位不同,结果为1。
- 常用于校验和计算、差错检测和纠错编码等领域。
- 例如:对于两个二进制数
1010
和1101
,进行模2运算的结果为0111
。
加法
- 对于两个二进制数的对应位进行相加
- 两位数字相同,结果为
0
- 两位数字不同,结果为
1
0+0=0 0+1=1 1+0=1 1+1=0
例如:0101 + 0011 = 0110,列竖式计算:
0 1 0 1
+ 0 0 1 1
—————————————
0 1 1 0
减法
- 对于两个二进制数的对应位进行减法运算
- 两位数字相同,结果为
0
- 两位数字不同,结果为
1
0-0=0 0-1=1 1-0=1 1-1=0
例如:0110-0011=0101,列竖式计算:
0 1 1 0
- 0 0 1 1
—————————————
0 1 0 1
乘法
- 对于两个二进制数的对应位进行相乘,模2乘法就是判断两个数的乘积是奇数还是偶数。
- 有一个数为
0
,乘积为0
- 两个数都为
1
,乘积为1
0×0=0 0×1=0 1×0=0 1×1=1
- 多位二进制模2乘法类似于普通意义上的多位二进制乘法
- 不同之处在于后者累加中间结果(或称部分积)时采用带进位的加法
- 模2乘法对中间结果的处理方式采用的是模2加法
- 例如1011 × 101=100111,列竖式计算:
1 0 1 1
× 1 0 1
———————————————————
1 0 1 1
0 0 0 0
+ 1 0 1 1
———————————————————
1 0 0 1 1 1
————————————————
除法
- 模2除法是模2乘法的逆运算。
- 当最后余数的位数小于除数位数时,除法停止
- 当
被除数的位数
小于除数位数
时,则商数为0
,被除数
就是余数
。 - 只要
被除数
或部分余数
的位数
与除数
一样多,且最高位
为1
,不管其他位是什么数,皆可商1
- 步骤:
- 对齐:将除数对齐到被除数的最高位。
- 异或操作:对齐的位进行异或操作。
- 如果被除数的最高位是
0
,则不进行操作,直接将除数向右移动一位,商为0
。 - 如果被除数的最高位是
1
,则将除数与被除数的对应位进行异或,商为1
。
- 如果被除数的最高位是
- 移位:完成一次异或操作后,将除数向右移动,直到除数的最高位与被除数中的下一个
1
对齐。 - 重复:重复进行异或和移位操作,直到除数移动到被除数的末端。
- 余数:最终被除数变为的形式(通常是除数长度或更短)即为余数。
校验码
码距: 任何一种编码由许多码字构成,任意两个码字质检最少变化的二进制位就称为数据校验码的码距
奇偶校验码
特点:可检1位(奇数位)
的错误,不可纠错
- 有奇数个位发生误码,则奇偶性发生变化,可以检查出误码,但不能纠错。
- 有偶数个位发生误码,则奇偶性不发生变化,不能检查出误码(也称漏检)。
编码方式: 由若干位有效信息(如一个字节),再加上一个二进制位(校验位)组成校验码
奇校验 :在传输的数据中,如果数据中的1的个数为奇数,则奇校验位设置为0,否则设置为1
偶校验: 在传输的数据中,如果数据中的1的个数为偶数,则偶校验位设置为0,否则设置为1
校验方式:
- 发送方在传输数据的同时计算数据中1的个数
- 根据奇偶校验的方式设置校验位,并与数据一起传输。
- 接收方在接收数据后,再次计算数据中1的个数
- 如果与校验位不匹配,则说明数据传输过程中发生了错误
例题:1001101
的奇校验码与偶校验码?
- 答:
1001101
1的个数为4
位
- 奇校验码:
10011011
- 个数为偶数,校验码应为
1
- 个数为偶数,校验码应为
- 偶校验码:
10011010
- 个数为偶数,校验码应为
0
- 个数为偶数,校验码应为
CRC循环冗余校验码
特点:可检多错,不可纠错
编码方式: 在k位信息码之后拼接r位校验码。
- 将待发送消息转为多项式,并化简
- 构造除数:多项式的各项系数构成的二进制串
- 构造被除数:待发送信息后面添加生成
多项式最高次数
个0 - 进行
模2除法
得到余数 - 余数处理:余数的位数应与生成多项式最高次数相同,也就是与添加0的个数相同,如果不够,则在余数签补足0凑足位数
- 将待发送信息与最终得到的余数拼接,得到最终的校验数据
例题1:对原始数据1101011011
进行编码形成校验码
- 答:
- 转为多项式:1 * 24 +0 * 23 + 0 * 22 + 1 * 21 + 1 * 20
- 化简为:24 + 21 + 20
- (除数)提取系数并依次排列:
10011
- (被除数)将原始数据后加
4
个0(上述多项式最高幂次为4
):1101011011–0000
(原始数据–填充位) - 经过以下计算(模2除法)得出余数作为校验码:
1110
- 将原始数据与校验码合并,得出最终校验码:
1101011011–1110
(原始数据-校验码)
校验方式:
- 构造被除数:接收到的信息就是被除数
- 构造除数:多项式的各项系数构成的二进制串
- 进行
模2除法
运算得出余数 - 检查余数:
如果为0,传输过程无误码。
如果不为0,传输过程产生误码。
例题2:接收到的信息为101101001
,生成的多项式为 G(x)= x3 +x2+1 ,判断传输是否有误码。
- 答:
- 构造被除数:
101101001
- 构造除数: x3 +x2+1 = 1101
- 进行
模2除法
运算得出余数
- 检查余数 :
11
4.1. 如果为0,传输过程无误码。
4.2. 如果不为0,传输过程产生误码。
- 构造被除数:
海明校验码
特点:可检错,可纠错
编码方式:将数据位按照一定规则分组,然后在每个组中添加校验位
公式:设数据位是n
位,校验位是k
位,则 2k >= n + k + 1
-
根据公式确定校验位数量
-
编号:
从最低位开始编号,从1开始递增
-
确定校验位的具体位置:校验位处于2的n次幂的位置上,即:
1、2、4、8、16、32...
7 6 5 4 3 2 1 位数 n4 n3 n2 n1 信息位 k2 k1 k0 校验位 -
填充数据位:
其余位填充真正的数据位(信息位)
从右到左依次填入(以1011
为例)7 6 5 4 3 2 1 位数 1 0 1 1 信息位 k2 k1 k0 校验位 -
计算校验位:
5.1. 将信息位所在的编号拆分成校验位所在的编号,目的是看第几位数是由哪些校验位校验的7 = 4 + 2 + 1,即第7位信息位是由第4位校验位(k2)和第2位校验位(k1)和第1位校验位(k0)共同校验的
6 = 4 + 2,即第6位信息位是由第4位校验位(k2)和第2位校验位(k1)共同校验的
5 = 4 + 1,即第5位信息位是由第4位校验位(k2)和第1位校验位(k0)共同校验的
3 = 2 + 1,即第3位信息位是由第2位校验位(k1)和第1位校验位(k0)共同校验的5.2. 分别求第4位校验位(r2)和第2位校验位(r1)和第1位校验位(r0)的值。
将校验位对应的所有数据位的值,进行异或/同或运算(同或为奇校验,异或为偶校验)
第4位校验位校验第7、6、5三位数据位
偶:r2 = 1⊕0⊕1 = 1⊕1 = 0
奇:r2 = 1⊙0⊙1 = 0⊙1 = 1
第2位校验位校验第7、6、3两位数据位
偶:r1 = 1⊕0⊕1 = 1⊕1 = 0
奇:r1 = 1⊙0⊙1 = 0⊙1 = 1
第1位校验位校验第7、5、3两位数据位
偶:r0 = 1 ⊕ 1 ⊕ 1 = 0⊕1 = 1
奇:r0 = 1⊙1⊙1 = 1⊙1 = 07 6 5 4 3 2 1 位数 1 0 1 1 信息位 0 0 1 偶校验位 1 1 0 奇校验位 -
最终得出 海明校验码:偶:
1010101
,奇:1011110
校验与纠错方式:
-
接收方收到海明码之后,将每一位校验位与其校验的位数分别进行计算
(同或为奇校验,异或为偶校验)
偶校验:运算得到的结果应该全为
0
奇校验:运算得到的结果应该全为1
-
假设为
偶校验
,接收到的数据为1011101
(第四位出错,上文计算的海明校验码为:1010101
),说明接收方接收到的校验位是101
而不是正确的001
-
原始表格:
7 6 5 4 3 2 1 位数 n4 n3 n2 n1 信息位 k2 k1 k0 校验位 -
接受到的数据转为表格(含错误的校验位):
7 6 5 4 3 2 1 位数 1 0 1 1 信息位 1 0 1 校验位 -
此时运算结果为下述,这里所得结果不全为
0
,表明传输有误k2 ⊕ I4 ⊕ I3 ⊕ I2 = 1 ⊕ 1 ⊕ 0 ⊕ 1 = 1
k1 ⊕ I4 ⊕ I3 ⊕ I1 = 0 ⊕ 1 ⊕ 0 ⊕ 1 = 0
k0 ⊕ I4 ⊕ I2 ⊕ I1 = 1 ⊕ 1 ⊕ 1 ⊕ 1 = 0 -
查错:
k2 k1 k0
排列为二进制100,这里指出的就是错误的位数,表示第100
,转化为十进制是4
,即第4位
出错 -
纠错:纠错方法就是将该位逆转,将
第4位校验码
变为0
即可
对比
校验码位数 | 校验码位置 | 检错 | 纠错 | |
---|---|---|---|---|
奇偶校验 | 1 | 一般拼接在头部 | 可检奇数位错 | 不可纠错 |
CRC循环冗余校验 | 生成多项式最高次幂决定 | 拼接在信息位尾部 | 可检多位错 | 不可纠错 |
海明校验 | 2r >= m + r + 1 | 插入在信息位中间 | 可检多位错 | 可纠错 |
加密技术和认证技术
加密技术和认证技术是计算机系统中保护数据安全和身份识别的重要手段。
-
加密技术(Encryption Techniques)是通过对数据进行加密转换,使得未经授权的人无法理解或访问数据内容
- 对称加密(Symmetric Encryption):使用相同的密钥对数据进行加密和解密。加密和解密过程非常快速,适用于大量数据的加密。常见的对称加密算法有DES、AES等。
- 非对称加密(Asymmetric Encryption):使用一对密钥,公钥用于加密数据,私钥用于解密数据。非对称加密具有高度的安全性,但加解密过程相对较慢。常见的非对称加密算法有RSA、ECC等。
-
认证技术(Authentication Techniques)是用于确认用户身份的技术手段
- 密码认证(Password Authentication):是通过用户输入的密码与事先存储的密码进行比对,确认用户身份。密码认证简单易用,但容易受到密码猜测、暴力破解等攻击。
- 双因素认证(Two-factor Authentication):是在密码认证的基础上增加了第二个认证因素,如手机验证码、指纹识别等。双因素认证提供了更高的安全性,防止了仅凭密码就能登录的情况。
- 生物特征认证(Biometric Authentication):是通过用户的生物特征信息进行身份认证,例如指纹、面部识别、虹膜识别等。生物特征认证具有高度的唯一性和不可伪造性,但成本较高。
加密技术用于保护数据的机密性
认证技术用于确认用户的身份。
两者结合可以提供更高级别的数据安全保护。
加密技术
对称加密技术
对称加密技术是一种加密算法,使用相同的密钥对数据进行加密和解密。通信的双方使用相同的密钥,发送方使用该密钥对数据进行加密,接收方使用相同的密钥对加密后的数据进行解密。
特点:
- 加密和解密速度快:对称加密算法通常使用较小的密钥长度,加密和解密的速度比较快。
- 密钥管理相对简单:因为加密和解密使用相同的密钥,所以密钥管理相对简单。
- 安全性依赖于密钥的保密性:对称加密算法的安全性依赖于密钥的保密性。如果密钥泄露,加密的数据也就不再安全。
双方在通信前需要安全地传递密钥,密钥的分发和更新成为对称加密技术面临的主要问题
加解密过程:
加密过程:明文 + 加密算法 + 私 =>密文
解密过程:密文 + 解密算法 + 私 =>明文
常用的对称加密算法:
DES(Data Encryption Standard)
、3DES(Triple Data Encryption Standard)
、AES(Advanced Encryption Standard)
、RC
、IDEA
、PGP
等。
非对称加密技术
非对称加密技术,又称为公钥加密技术,是一种加密方法,其中使用了两个不同的密钥:公钥
和私钥
。
加解密过程:
公钥
用于加密数据,私
钥用于解密数据
加密过程:明文 + 加密算法 + 公钥 =>密文
解密过程:密文 + 解密算法 + 私钥 =>明文
特点:
- 在非对称加密技术中,加密和解密过程使用不同的密钥。
- 发送方使用接收方的公钥对数据进行加密,
- 接收方使用自己的私钥对数据进行解密。
- 由于私钥是保密的,因此只有接收方能够解密数据。
常见的非对称加密算法: RSA
、DSA
、ECC(园曲线算法)
等
用法:
- 用于数字签名。
- 发送方使用自己的私钥对数据进行加密得到数字签名,
- 接收方使用发送方的公钥对数字签名进行解密,从而验证数据的完整性和真实性,
- 但加密和解密花费的时间长、速度慢不适合于对文件加密,而只适用于对少量数据进行加密。
优势:
- 可以安全的进行密钥交换和数字签名。
- 由于公钥是公开的,任何人都能够使用公钥对数据进行加密,但只有拥有私钥的人才能够解密数据。
信息摘要
简介:
信息摘要是指将任意长度的数据转化为固定长度的摘要(hash)值的过程。
它是一种用于确保数据完整性和验证数据一致性的技术。
信息摘要算法是实现信息摘要的数学算法。
原理:
将输入的数据通过一系列计算转化为固定长度的摘要值。
这个摘要值通常是一个较短的唯一字符串,其长度通常为128位、160位、256位等,取决于具体的算法。
特点:
- 唯一性:两个不同的数据几乎不可能生成相同的摘要值。
- 高效性:计算摘要值的过程应该是快速的。
- 不可逆性:从摘要值无法推导出原始数据。
- 抗碰撞性:极难找到两个不同的数据生成相同的摘要值。
常见的信息摘要算法:MD5
、SHA-1
、SHA-256
等。
这些算法已广泛应用于数据完整性验证、密码存储、数字签名等领域。
在计算信息摘要时,输入数据的任何细微变化都会导致不同的摘要值,因此可以用于检测数据是否被篡改。
MD5实现文件校验
简介:
MD5是一种常用的信息摘要算法,可以用来实现文件校验。
文件校验是一种验证文件完整性的方式,通过计算文件的MD5摘要值并与预先计算的摘要值进行比较来判断文件是否被篡改。
使用:
使用MD5算法进行文件校验的步骤:
- 载入文件:首先,将要校验的文件载入内存中。
- 计算摘要值:将文件的每个字节作为输入,通过MD5算法进行计算,生成文件的MD5摘要值。
- 比对摘要值:将计算得到的MD5摘要值与预先计算得到的摘要值进行比较。
- 如果两个摘要值相同,则表示文件的内容没有被篡改,文件完整性得到保证。如果两个摘要值不同,则表示文件的内容已被篡改。
注意,
MD5
算法本身并不是安全的,因为它容易受到碰撞攻击(暴力破解)。
碰撞攻击是指找到两个不同的输入数据产生相同的MD5
摘要值的情况。
因此,在安全性要求较高的场景中,建议使用更强大的摘要算法,如SHA-256
。
数字签名
简介:
数字签名是一种加密技术,用于验证数字文档的真实性和完整性。
它基于非对称加密算法
,使用私钥
对文档进行加密生成签名,然后使用对应的公钥
对签名进行解密验证。
数字签名过程如下:
- 发送方:使用哈希算法对要发送的文档进行摘要计算,生成文档的哈希值。
- 发送方:使用自己的私钥对哈希值进行加密生成签名。
- 接收方:收到文档和签名后,使用发送方的公钥对签名进行解密得到哈希值。
- 接收方:使用相同的哈希算法对收到的文档进行摘要计算,生成新的哈希值。
- 接收方:将解密得到的哈希值与新生成的哈希值进行比较,如果一致,则证明文档的真实性和完整性得到验证。
数字签名可以确保文档在传输过程中不被篡改,同时也提供了非否认性,即发送方无法否认自己的签名。
使得数字签名技术在电子商务、数字合同、身份验证等领域中得到了广泛应用。
计算机的可靠性模型
串联系统
计算机的可靠性模型串联系统是一个用于评估和预测计算机系统可靠性的模型。
它将计算机系统中的各个组件和子系统通过可靠性模型
串联起来,形成一个整体的可靠性评估模型
,必须全部子系统正常工作,系统才能工作。
可靠性计算公式:
-
可靠性块图方法:
假设系统由n个可靠性块组成,每个可靠性块的可靠度为R1
,R2
,…,Rn
。系统的可靠度R(串联系统可靠度)
可以通过以下公式计算:
R = R1 * R2 * … * Rn
-
Markov模型方法:
假设系统有m个状态,用状态转移概率矩阵P
表示状态之间的转移概率。
则系统的可靠度R(串联系统可靠度)
可以通过以下公式计算:
R = P(0, m)
其中,P(0, m)
表示从初始状态(状态0)
到终止状态(状态m)
的转移概率。
计算机系统的可靠性模型涉及到众多因素,如组件的可靠度、故障率、维修时间等。
在实际应用中,需要结合具体的系统情况和可靠性模型的假设,适当调整和扩展上述公式以满足实际需求。
并联系统
假如一个系统由 N 个子系统组成,只要有一个子系统正常工作,系统就能正常工作,这样的系统称为并联系统。
可靠性计算公式:
R_total = 1 - (1 - R_1) * (1 - R_2) * … * (1 - R_n)
R_total
表示整个并联系统的可靠性,R_1
,R_2
, …,R_n
分别表示各个组件(子系统)
的可靠性。
公式基于并联系统的原理,即只要有任何一个组件正常工作,整个系统就能正常工作。
所以,计算整个系统的可靠性时,我们需要对各个组件的可靠性进行乘法运算。
如果系统中的所有组件都是完全可靠的,即可靠性为1
,那么整个系统的可靠性也为1
。
但是如果其中一个组件发生故障,那么整个系统的可靠性就会降低。
注意:
这个公式假设各个组件的可靠性是独立的,即一个组件的故障不会影响其他组件的可靠性。
如果组件之间存在相关性,那么可靠性计算公式可能需要进行适当的修正。
例题:
某系统由3个部件构成,每个母舰的千小时可靠度都为R
,该系统的千小时的可靠度为 (1-(1-R)2)R , 则该系统的构成方式为?
- 答:
- 总:前两个部件并联后与第三个部件串联
- (1-R)2 :
- 指数
2
代表 两个部件并联 1-R
代表单个部件串联可靠度
- 指数
- (1-(1-R)2)R:
(1-
())R 代表单个部件串联可靠度
程序设计语言
低级语言和高级语言
- 低级语言:
- 与计算机硬件直接相关的语言,更接近机器语言,
- 通常需要较少的编译或解释过程
- 低级语言包括
汇编语言
和机器语言
汇编语言
- 是一种与机器语言直接对应的符号化语言
- 使用助记符来代替机器指令的二进制码
- 汇编语言相对于机器语言来说更容易理解和编写,但仍然需要了解计算机硬件的细节
- 高级语言:
- 高级语言使用更加自然的语法和结构来表达算法和程序逻辑
- 通常由编译器或解释器转换为机器语言。
- 高级语言包括
C
、C++
、Java
、Python
等。
相对于低级语言来说,高级语言的编写更加方便和高效,可以更快地开发出功能完善的程序。
高级语言还提供了更多的抽象和封装,使得程序员能够更好地组织和管理代码,提高开发效率。
高级语言相对于低级语言,高级语言的执行效率可能会稍低一些。
汇编程序(低级语言)
汇编程序是一种底层编程语言,它使用机器指令来控制计算机的硬件,在计算机中执行特定的任务。
汇编程序的基本原理包括以下几个方面:
机器指令
:- 使用的指令是计算机硬件可以直接执行的指令,每个指令都有特定的操作码和操作数。
- 通过编写机器指令来控制计算机的硬件,包括处理器、内存、输入输出设备等。
汇编语言
:- 使用的是一种符号语言,它将机器指令用易于理解和书写的符号表示,每个符号都对应一条机器指令。
- 通常具有较强的可读性和可理解性,但是它与计算机硬件之间的对应关系非常直接。
汇编器
:- 汇编程序需要通过汇编器将汇编语言翻译成机器指令。
- 汇编器将汇编语言中的符号转换为对应的操作码和操作数,并生成机器指令的二进制代码。
- 会生成符号表,记录每个符号对应的地址信息,供后续的链接和加载使用。
汇编程序流程
:- 汇编程序的执行流程一般包括以下几个步骤:
- 首先:将源代码交给汇编器进行编译,生成机器指令的二进制代码;
- 然后:将生成的二进制代码加载到计算机的内存中;
- 最后:通过处理器执行加载到内存中的机器指令,来完成相应的任务。
寄存器和内存
:- 汇编程序使用寄存器和内存来进行数据的存储和处理。
编译程序和解释程序(高级语言)
编译程序和解释程序都是用来将高级语言代码
转化为机器语言代码
的工具。
编译程序
- 将整个高级语言程序一次性地转化为机器语言代码,生成可执行文件。
- 优点:
执行速度快
,因为它一次性将代码转换为机器语言,不需要再进行解释。 - 缺点:编译程序生成的目标代码通常运行在特定的平台上,
不具有可移植性
。
编译过程:
词法分析(Lexical Analysis)
:将源代码分解成一个个的词法单元(token),如标识符、关键字、运算符等。语法分析(Syntax Analysis)
:根据语法规则将词法单元组织成语法树(parse tree),确定程序的结构和语义。语义分析(Semantic Analysis)
:对语法树进行分析,检查程序是否符合语言规范,如变量使用是否正确、函数参数是否匹配等。中间代码生成(Intermediate Code Generation)
:将语法树转化为中间代码(intermediate code),中间代码是一种类似于汇编语言的抽象表示,比源代码更接近机器语言。代码优化(Code Optimization)
:对中间代码进行优化,使得生成的机器代码更高效、更快速。代码生成(Code Generation)
:将中间代码翻译成特定机器的机器代码,生成可执行文件。符号表管理(Symbol Table Management)
:维护一个符号表,记录程序中的变量、常量、函数等信息,在编译过程中进行查找和管理。
这些步骤通常由编译器前端和后端分别完成。前端负责词法分析、语法分析、语义分析和中间代码生成,后端负责代码优化和代码生成。
解释程序
- 是逐行地解释高级语言代码,并执行相应的操作。
- 解释程序不生成可执行文件,而是实时地解释代码并生成结果。
- 优点:具有
良好的可移植性
,同一份高级语言代码可以在不同的平台上运行。 - 缺点:解释程序的执行
速度相对较慢
,因为需要逐行解释代码。
解释过程:
词法分析(Lexical Analysis)
:解释程序首先会将源代码分解成词法单元,也就是词法分析。它将源代码分为关键字、标识符、运算符、数字、字符串等不同类型的词法单元。语法分析(Syntax Analysis)
:在语法分析阶段,解释程序会根据词法单元的层次结构来构建抽象语法树(AST)。抽象语法树表示了源代码的语法结构,将代码以树形结构表示。语义分析(Semantic Analysis)
:在语义分析阶段,解释程序会检查抽象语法树中的语义错误,并为每个节点分配类型信息。它还会执行类型检查,并进行类型推导。中间代码生成(Intermediate Code Generation)
:解释程序会将抽象语法树转换为中间代码,也就是一种与机器无关的中间表示形式。中间代码类似于汇编语言,但更高级,更易于优化和转换。代码优化(Code Optimization)
:解释程序可能会对中间代码进行一些优化,以提高程序的性能。这些优化包括常量折叠、公共子表达式消除、循环展开等。代码生成(Code Generation)
:最后,解释程序会将中间代码转换为目标机器代码,以便在目标机器上执行。这个过程通常包括寄存器分配、指令选择和代码布局等步骤。执行
:解释程序会按照生成的目标机器代码一条一条地执行指令。它会从程序的入口点开始执行,并按照指令的顺序执行,直到遇到结束指令或异常。
编译程序和解释程序各有优劣,适用于不同的场景。
需要高性能和可执行文件的情况下,可以选择编译程序。
需要可移植性和灵活性的情况下,可以选择解释程序。有些语言,如Java和Python,采用了折中的方式,先将代码编译成中间代码,然后再通过解释程序运行中间代码。这样可以兼顾性能和可移植性的需求。
程序设计语言的基本成分
成分 | 描述 |
---|---|
语法 | 程序设计语言的语法规则,定义了如何编写合法的程序代码。语法规则可以包括关键字、运算符、标识符、分隔符等等。 |
语义 | 程序设计语言的语义定义了代码的含义和行为。它规定了代码执行的规则、数据类型的操作、函数的调用等等。 |
变量 | 变量是用于存储和操作数据的名字。在程序设计语言中,变量需要事先声明并赋予一个数据类型。 |
数据类型 | 数据类型定义了存储和处理数据的方式。常见的数据类型包括整数、浮点数、布尔值、字符串、数组、结构体等等。 |
运算符 | 运算符用于执行各种操作,例如算术运算、逻辑运算、比较运算等等。不同的程序设计语言提供不同的运算符集合。 |
控制结构 | 控制结构用于控制程序的执行流程。常见的控制结构包括条件语句(如 if-else)、循环语句(如 for、while)、跳转语句(如 break、continue)等等。 |
函数 | 函数是可重复使用的代码块,用于执行特定的操作。函数可以接受参数,并返回值。函数可以提高代码的模块化和复用性。 |
输入输出 | 输入输出是程序与外部环境进行交互的方式。输入可以是用户的输入、文件的读取等,输出可以是打印信息、写文件等。 |
异常处理 | 异常处理用于处理程序执行过程中的错误和异常情况。它可以捕获和处理错误,使程序在错误发生时能够做出适当的响应。 |
注释 | 注释是用于给代码添加说明和解释的文本。它不会被编译或执行,只是用于提高代码的可读性和可理解性。 |
数据结构
线性结构
指每个元素最多只有一个出度和一个入度,表现为一条线状。
存在惟一的一个被称做“第一个”的数据元素
存在惟一的一个被称做“最后一个”的数据元素
除第一个之外,集合中的每个数据元素均只有一个前驱
除最后一个之外,集合中每个数据元素均只有一个后继
顺序存储
- 将线性表中的元素依次存储在一组地址连续的存储单元中,使得逻辑上相邻的元素在物理上也相邻。
- 通过元素的下标可以直接访问元素,因此查找效率高。插入和删除元素时需要移动其他元素,效率较低。
- 对应数据结构:
-
数组(Array):一组连续的内存空间来存储相同类型的数据元素,通过下标访问元素。
-
栈(Stack):
先进后出(LIFO)
,只能在表的一端进行插入和删除操作。
-
- 队列(Queue):
先进先出(FIFO)
,只能在表的一端进行插入操作(队尾),在表的另一端进行删除操作(队头)。
链式存储
- 通过存储各数据元素的结点的地址来实现元素的存储。
- 每个结点包含数据域和指向下一个结点的指针。
- 插入和删除元素时只需要修改指针,不需要移动其他元素,因此插入和删除效率较高。
- 但是链式存储无法直接访问中间的元素,需要从头节点开始顺序遍历。
- 对应数据结构:
-
链表(Linked List):由一系列节点组成,每个节点包含数据域和指向下一个节点的指针。
-
双向链表(Doubly Linked List):每个节点包含数据域和指向前一个节点和后一个节点的指针。
-
循环链表(Circular Linked List):最后一个节点的指针指向第一个节点,形成一个闭环。
-
对比
存储密度 | 容量分配 | 查找 | 读 | 插入 | 删除 | 总结 | 原因 | |
---|---|---|---|---|---|---|---|---|
顺序存储 | 1 | 实现确定 | o(n/2) | o(1) | o(n / 2),最好情况为0,最坏情况为n | o([n - 1] / 2 ) | 存储效率高、容量无法改变、查找效率高、修改效率低 | 顺序存储:物理地址连续,可通过索引快速定位,但插入或修改时,需要移动所有元素 |
链式存储 | <1 | 动态改变 | o(n/2) | o( [n-+1] / 2 ),最好情况为1,最坏情况为n | o(1) | o(1) | 存储效率低、容量可动态改变、查找效率低、修改效率高 | 链式存储:物理地址不连续、需要从头节点开始查找,插入修改无需移动其他元素,只需要修改元素头部或尾部指针即可 |
数组、矩阵、广义表
数组
数组的表示
- 特点:适合用于存储和操作大量数据。
由于数组在内存中是连续存储的,所以可以通过下标直接访问数组中的元素,而不需要像链表那样遍历整个结构。这样可以提高访问元素的效率。
- 由于数组的元素类型相同且结构一致,可以利用数组的特性进行高效的数据处理和计算。
- 例如:可以通过循环遍历数组中的元素进行逐个计算或操作。
- 数组的下标关系具有上下界的约束,可以有效地控制数组的访问和操作。通过下标,可以直接定位数组中的元素,而不需要进行复杂的查找操作。
- 虽然数组的长度是固定的,不支持插入和删除运算,但是可以通过重新分配内存空间来实现对数组的扩展或缩小。这样可以灵活地管理数组的大小。
假设有一个3行2列的数组:
[[1, 2],
[3, 4],
[5, 6]]
行向量形式表示时,将每一行都排列在一行中:
[1, 2, 3, 4, 5, 6]
列向量形式表示时,将每一列都排列在一列中:
[1, 3, 5, 2, 4, 6]
- 行向量形式将数组按照行的方式展开成一行
- 列向量形式将数组按照列的方式展开成一列
- 这样的表示方式有时可以方便进行矩阵运算和数据处理
数组存储地址
-
数组在内存中是连续存储的,因此数组名本身就可以看作是存储数组首元素地址的指针。
-
当我们定义一个数组时,编译器会分配一段连续的内存空间来存储数组元素,并将数组名指向该内存空间的首地址。
-
例如:假设我们定义了一个
int
类型的数组arr
:
int arr[5] = {1, 2, 3, 4, 5};
- 在内存中,该数组的元素将被连续存储,如下所示:
地址 内容
1000 1
1004 2
1008 3
1012 4
1016 5
- 数组名
arr
在这种情况下可以看作是存储地址1000的指针
。 - 我们可以通过使用指针来访问数组元素:
- 访问arr的第一个元素可以使用arr或者arr[0]
- 访问第二个元素可以使用(arr+1)或者arr[1]
- 以此类推。
数组类型 | 存储地址计算 |
---|---|
一维数组a[n] | a[i]的存储地址为:a+i*len |
二维数组a[m][n] | 按行存储:a[i] [j]的存储地址为:a+(i*n+j)*len |
二维数组a[m][n] | 按列存储:a[i] [j]的存储地址为:a+(j*m+i)*len |
矩阵结构
矩阵是一种常见的数据结构,它由行和列组成的二维数组。
矩阵可以用于表示和处理多种类型的数据,如数值、图像、文本等。
在计算机科学中,矩阵通常用于表示图形图像和图像处理算法。
图像可以表示为一个矩阵,其中每个元素表示一个像素的颜色值。通过对矩阵进行操作,可以实现图像的旋转、缩放、滤波等处理。
矩阵结构在数值计算和科学计算中也非常重要。矩阵可以用于表示线性方程组、矩阵乘法、求特征值和特征向量等数学运算。通过矩阵运算,可以解决线性方程组、最小二乘拟合、最优化等问题。
在编程中,矩阵通常用二维数组来表示。可以使用索引访问矩阵中的元素,并且可以使用循环遍历矩阵中的所有元素。还可以定义各种操作来处理矩阵,如矩阵相加、相乘等。
以下是一些常见的矩阵结构分类:
方阵:行数和列数相等的矩阵,即n x n的矩阵。
非方阵:行数和列数不相等的矩阵。
稀疏矩阵:其中绝大多数元素为0的矩阵。
稠密矩阵:其中绝大多数元素不为0的矩阵。
对称矩阵:指以主对角线为对称轴对称的矩阵,即A[i][j] = A[j][i]。
非对称矩阵:不满足对称性质的矩阵。
上三角矩阵:是指主对角线以下的元素全为0的矩阵,即A[i][j] = 0,当i > j。
下三角矩阵则:指主对角线以上的元素全为0的矩阵,即A[i][j] = 0,当i < j。
对角矩阵:主对角线以外的元素全为0的矩阵。
非对角矩阵则:至少有一个主对角线以外的元素不为0的矩阵。
三元组结构
是一种常用的存储矩阵的方式,它将矩阵中的每个非零元素存储为一个三元组,包括该元素的行索引、列索引和值。
通常情况下,三元组结构中的元素按矩阵的行优先的方式进行存储,即先按行遍历矩阵,再按列遍历。因此,三元组结构的存储方式会将矩阵中的非零元素按照行的顺序排列,并保持它们在矩阵中的相对位置不变。
以一个4x5的矩阵为例:
1 0 0 2 0
0 0 3 0 4
0 5 0 0 0
6 0 0 7 8
用三元组结构进行存储的结果为:
(0, 0, 1)
(0, 3, 2)
(1, 2, 3)
(1, 4, 4)
(2, 1, 5)
(3, 0, 6)
(3, 3, 7)
(3, 4, 8)
其中,每个三元组表示一个非零元素的行索引、列索引和值。
广义表
广义表是一种扩展的线性表,它可以存储不同数据类型的元素,包括原子元素和子表元素。
在广义表中,原子元素指的是不可再分的基本元素,例如整数、字符、布尔值等。子表元素则是指广义表中的另一个广义表,也就是说广义表可以嵌套存储。
广义表的存储结构通常可以使用链表或数组实现。如果使用链表实现,每个节点的数据域可以存储原子元素或指向子表的指针;如果使用数组实现,通常需要预先确定广义表的最大深度,并为每个元素分配固定大小的空间。
广义表的操作包括创建、插入、删除、修改、遍历等。递归是广义表操作的常用方法,可以通过递归遍历广义表的每个元素,从而实现各种操作。
广义表在实际应用中有广泛的用途,例如在编程语言解析中,可以使用广义表来表示语法树;在图形学中,可以使用广义表来表示复杂的图形结构;在人工智能中,可以使用广义表来表示知识库等。
广义表一般记为:
LS
代表广义表的表名,
αi
代表广义表的元素,可以是表(子表)或者数据元素(原子)。
n
代表广义表的长度,即最外层包含的元素个数,当n=0时,广义表为空表。
递归定义的重数是广义表的深度,即定义中所包含括号的个数(单边括号的个数),原子的深度为0,空表的深度为1。
head()
和tail()
是广义表的两个基本操作。
head()
用于取得广义表的第一个元素,无论是子表还是原子;
tail()
用于取得广义表中除了第一个元素之外的所有元素构成的表。
注意:如果广义表是空表或只包含一个元素,则tail()
操作返回一个空表。
树(树形结构)
概念:
在数据结构中,树是一种非线性的数据结构,它由一组节点和一组连接节点的边组成。
节点
:树由节点
组成,每个节点
包含一个值和指向零个或多个子节点
。- J - - > 无
- A - - > B 、A - - > C
父节点 / 双亲节点(Parent Node)
:一个节点下如果存在其他节点,这个节点为父节点。- F、G的父节点:A
- H、I 的父节点:D
根节点(Root)
:树顶端的节点称为根节点,一般一棵树只有一个根节点。- 根节点
没有父节点
。根节点是树的起始点
。 - A为根节点,同时也是 B、C的父节点
- 根节点
子节点(Child Node)
:一个节点
下的其他节点
,这个节点
为其他节点
的子节点
- H 和 I 是 D 的孩子节点。
度(Degree)
:节点拥有的子树的数目
。- 节点 D 的度为 2
- 节点 E 的度为 1
叶子节点(Leaf Node)
:度为 0 的节点称为叶子节点。- 也可以描述为:
一个节点下没有任何节点时,称为叶子节点
- H、I、J、F、G 都是
叶子节点
- 也可以描述为:
兄弟节点( Brother Node)
:一个父节点
下的子节点
互为兄弟节点
。- H 和 I 为
兄弟节点
。
- H 和 I 为
节点层次(Level)
:根节点为第一层,它的子节点为第二层,依次向下递推,- H、 I、J 均为第3层。
树的深度(Level of Tree)
:树中节点的最大层次- 下图中树的深度为 3。
树的度(Degree of Tree)
:树中节点的度的最大值- 下图中树的度为 2。
- 总结:
- 如果某个节点不是叶子节点,则它至少有一个子节点
- 叶子节点也是该父节点的子节点
树的不同的类型:二叉树
、二叉搜索树
、红黑树
等。
树结构在计算机科学中有广泛的应用,例如文件系统的目录结构、数据库索引、编译器语法分析等。
二叉树(Binary Tree)
是一种特殊的树结构,每个节点最多有两个子节点:左子节点和右子节点,也就是树的度不大于2的。
二叉树都是由以下几种情况复合而成的
完美二叉树(Perfect Binary Tree)
除了叶子节点之外的每一个节点都有两个孩子节点 , 每一层(包含最后一层)都被完全填充
完全二叉树(Complete Binary Tree)
除了最后一层之外的每一层都被完全填充,并且所有节点都保持向左对齐。
完满二叉树(Full Binary Tree)
除了叶子节点之外的每一个节点都有两个孩子节点。