CPU
- 运算器
算术逻辑单元(ALU)
- 核心- 累加寄存器
- 状态寄存器 (又称 标记寄存器)
- 寄存器组
- 多路转换器
- 控制器
- 指令控制逻辑
- 指令寄存器
- 程序寄存器
- 地址寄存器
- 指令译码器
- 时序控制逻辑
- 总线控制逻辑
- 中断控制逻辑
- 指令控制逻辑
- 寄存器组
- 内部总线
码制
整数数值取值范围 | |
---|---|
原码 | -(2^{n-1} -1) ~ 2^{n-1} -1 |
反码 | -(2^{n-1} -1) ~ 2^{n-1} -1 |
补码 | -2^{n-1} ~ 2^{n-1} -1 |
移码 | -2^{n-1} ~ 2^{n-1} -1 |
- 原码:正数是其二进制本身;最高位为符号位,该位0表示正数,1表示负数,数值部分取X绝对值的二进制。优点:原码简单直观,实现乘除运算规则简单。缺点:加减时出现错误。
- 反码:正数的反码和原码相同;负数是符号位为1,其它位是原码取反。
- 补码:正数的补码和原码,反码相同;负数是符号位为1,其它位是原码取反,未位加1。(或者说负数的补码是其绝对值反码未位加1),设计补码解决的减法的符号位问题。
- 移码:将符号位取反的补码(不区分正负)
总结:最适合进行数字加减运算的数字编码是补码,最适合表示浮点数阶码的数字编码是移码
示例:
+1:
原码:0 0000001
反码:0 0000001
补码:0 0000001
移码:1 0000001
-1:
原码:1 0000001
反码:1 1111110
补码:1 1111111
移码:0 1111111
逻辑运算
- 与运算:&& 或 ∧
- 或运算:|| 或 ∨
- 非运算:! 或 ¬
- 异或运算:^ 或 ⊕ (即为将两个二进制数的每一位进行比较,如果两位相同则结果为0,不同则结果为1)
- 左移运算:<<
- 右移运算:>>
- 无符号右移运算:>>>
X | Y | Z=X·Y | Z=X+Y | Z=X⊕Y |
---|---|---|---|---|
0 | 0 | 0 | 0 | 0 |
0 | 1 | 0 | 1 | 1 |
1 | 0 | 0 | 1 | 1 |
1 | 1 | 1 | 1 | 0 |
总线
计算机内部总线为三总线,
- 数据总线:传输数据信息,CPU一次传输的数据与数据总线带宽相等
- 控制总线:传输控制信号和时序信号,如读/写、片选、中断想要信号等
- 地址总线:传送地址,他决定了系统的寻址空间
RISC/CISC
RISC(精简指令集计算机)的主要特点包括:
- 指令系统中只包含使用频度较高但不负责的指令。
- 指令长度固定,指令格式种类少,寻址方式种类少。
- 只有取数/存数指令访问存储器,其余指令的操作都在寄存器内完成。
- CPU中增加了通用寄存器的数量。
- 大部分指令在一个时钟周期内完成,采用超标量和超流水线技术,可使每条指令的平均执行时间小于一个时钟周期。
- 控制器采用组合逻辑控制,不用微程序控制。 采用优化的编译程序。
寻址方式
- 立即寻址:指令的操作码之后跟着操作数本身。
- 直接寻址:提供的是操作数的地址。
- 间接寻址:提供的是操作数地址的地址。
- 寄存器寻址:操作码之后跟着的是寄存器的编号,寄存器中存放着操作数。
- 寄存器间接寻址:操作码之后跟着的是寄存器的编号,寄存器中存放着操作数的地址。
- 变址寻址:变址寄存器Rx的内容与指令中给出的地址相加 得到操作数的地址
- 基址寻址:基址寄存器Rb的内容与指令中给出的位移量D相加 得到操作数的地址
- 相对寻址:是基址地址的变通,由程序计数器提供基准地址,指令中的地址码作为位移量D ,相加得到操作数的地址。
多级存储器
- 储存系统分为内存储器和外存储器
- 虚拟存储器:具有部分装入对换功能,能从逻辑上对内存容量进行大幅度扩充,使用方便的一种存储器系统。虚拟存储器的容量与主存大小无关。虚拟存储器的基本思路是:作业提交时,先全部进入辅助存储器,作业投入运行时,不把作业的全部信息同时装入主存储器,而是将其中当前使用部分先装入主存储器,其余暂时不用的部分先存放在作为主存扩充的辅助存储器中,待用到这些信息时,再由系统自动把它们装入到主存储器中。
- CPU对注册的访问方式属于随机存取。
- 高速缓存(Cache)与主存间的地址映射由硬件自动完成。
输入输出
周期
- 指令周期:取出并执行一条指令的时间
- 总线周期:一个访存储器或I/O端口操作所用的时间
- 时钟周期:又称震荡周期,是处理操作的最基本单位
- 机器周期:又称CPU周期,是完成一个基本操作的时间单元,
- 取址周期:是指令周期的第一个阶段,主要关注的是从主存中读取指令的操作。
- 关系:
- 一个指令周期有若干个总线周期组成,一个总线周期又包含若干个时钟周期
- 一个总线周期可以包含一个取址周期或者多个机器周期
中断
- 中断向量:中断服务程序的入口地址
- 中断向量表:把系统中所有中断类型码与对应的中断向量存储到一个区域,这个区域就是中断向量表。
- CPU根据终端号获取中断向量址,即对应中断服务程序的入口地址值。
- 采用中断方式管理I/O设备,CPU和外设可以并行地工作。
- 中断包括
- 软件中断(不可屏蔽)
- 硬件中断
- 外部中断(可屏蔽,由CPU外部事件引起,一般为外设请求)
- 内部中断(不可屏蔽,由CPU内部事件引起,包括硬件出错[掉电、校验、传输等]和运算出错[非法数据、地址、越界、溢出等])
DMA
- DMA(直接内存存取)
- DMA是数据在内存与I/O设备间的直接成块传送,传送过程中不需要CPU的干涉,由DMA硬件直接执行。
校验码
- CRC循环冗余检验码
- 海明威码
单位转换
1B = 8bit
1KB = 2^10B
1MB = 2^10KB
1GB = 2^10MB
1TB = 2^10
基础知识
- 计算机的评价指标有:时钟频率,数据处理速率、运算精度、内存容量。
- 字长越长,计算机数据运算精度越高
- CRC码:即循环冗余校核,是一种根据网络数据包或电脑文件等数据产生简短固定位数校核码的快速算法,主要用来检测或校核数据传输或者保存后可能出现的错误。CRC利用除法及余数的原理,实现错误侦测的功能,具有原理清晰、实现简单等优点。
- ASCII 码:是一种标准的单字节字符编码方案。
- BCD码:用4位二进制数来表示1位十进制数中的0~9这10个数码,是一种二进制的数字编码形式,用二进制编码的十进制代码。
- 海明码:是在电信领域的一种线性调试码。由贝尔实验室设计的,利用奇偶性来检查和纠错的校验方法。海明码的构成方法是在数据位之间的确定位置上插入 k个校验码, 通过扩大码距来实现检错和纠错。
操作系统
- 分布式操作系统是网络操作系统的更高级形式,保持网络系统所拥有的全部功能,同时又具有透明性、可靠性和高性能等。
- DHCP(动态主机配置协议) 是一个局域网网络协议 ,使用UDP协议工作,主要有两个用途:给内部网络或网络服务供应商自动分配ip地址,给用户或内部网络管理员作为对所有计算机中央管理的手段 。在DHCP数据包中可以包含客户端 MAC地址、DHCP服务器 ip, 默认网关地址,DHCP租约时间 分配给客户端的ip地址和子网掩码以及一些其他的管理配置信息 。
三态模型
- 就绪态:具备运行条件,等待系统分配处理器以便运行
- 运行态:占用处理器正在运行
- 阻塞态:又称等待态或睡眠态 ,指不具备运行条件,正在等待某个时间完成的状态
- 运行态 -> 阻塞态:等待使用资源,如等待外设传输,等人工干预
- 等待态 -> 就绪态:资源得到满足,如外设传输结束,人工干预完成
- 运行态 -> 就绪态:运行时间片到,出现有更高优先权进程
- 就绪态 -> 运行态:CPU 空闲时选择一个就绪进程
P、V、S 机制
- P操作:将信号量S的值减1,如果S大于等于0,则进程继续执行,否则进程进入等待队列。
- V操作:将信号量S的值加1,如果S大于0,则进程继续执行,否则唤醒等待队列中的一个进程。
- 信号量S的值表示可用资源的数量。当S大于等于0时,表示资源可用;当S小于0时,表示资源不可用,进程需要等待。
表达式
- 后缀表达式:又称逆波兰式,指的是不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右进行(不再考虑运算符的优先规则,后序遍历:左右跟)
- 中缀表达式:操作符以中缀形式处于操作数的中间(中序遍历:左跟右)
各个排序的时间复杂度、空间复杂度
各种排序算法的时间复杂度和空间复杂度如下:
- 冒泡排序(Bubble Sort):
它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小、首字母从Z到A)错误就把他们交换过来。走访元素的工作是重复地进行,直到没有相邻元素需要交换,也就是说该元素列已经排序完成
def bubble_sort(nums):
for i in range(len(nums) - 1): # 这个循环负责设置冒泡排序进行的次数
for j in range(len(nums) - i - 1): # j为列表下标
if nums[j] > nums[j + 1]:
nums[j], nums[j + 1] = nums[j + 1], nums[j]
return nums
- 选择排序(Selection Sort):
第一次从R[0] ~ R[n-1]中选取最小值,与R[0]交换,第二次从R[1] ~ R[n-1]中选取最小值,与R[1]交换,…,第i次从R[i-1] ~ R[n-1]中选取最小值,与R[i-1]交换,…,第n-1次从R[n-2]~R[n-1]中选取最小值,与R[n-2]交换,总共通过n-1次,得到一个按排序码从小到大排列的有序序列
# selectionSort
def findSmallest(arr): # 找出数组中最小元素的函数
smallest = arr[0] # 将arr数组中的第一个元素作为最小值的初始化值
smallest_index = 0 # 对应上行代码,初始化存储最小元素的索引
for i in range(1,len(arr)): # 从数组中第二个元素开始遍历
if smallest > arr[i]:
smallest = arr[i]
smallest_index = i
retu