1
0
mirror of https://github.com/Didnelpsun/CS408.git synced 2026-02-10 06:05:51 +08:00

更新计算机组成原理

This commit is contained in:
Didnelpsun
2021-08-31 22:37:50 +08:00
parent 28f0ae83c3
commit d64ecfec57
3 changed files with 144 additions and 56 deletions

File diff suppressed because one or more lines are too long

View File

@@ -244,7 +244,7 @@ k|2|3|4|5|6|7
+ 若机器字长$n+1$位,则补码整数的表示范围是$[-2^n,2^n-1]$。
+ 若机器字长$n+1$位,则补码小数的表示范围是$[-1,1-2^{-n}]$。
+ 将负数补码转回原码的方法相同:尾数取反,末位加一。补码的补码就是原码。
+ 如果已知一个数值的补码,那么求这个值的负数的补码就是全部位取反,末位加一。
+ 如果已知一个数值的补码,那么求这个值的负数的补码就是全部包括位取反,末位加一。
+ 如果已知一个负数的补码,那个求这个值的原码就是数值位取反再加一,或是负数补码中,最右边的$1$以及右边不变,最右边的$1$的左边取反。
+ 补码算术移位:将补码的符号位与数值位一起右移一位并保持原符号位的值不变,表示除二。
+ 变形补码:又称为模四部分,双符号位的补码小数,用$00$表示正,$11$表示负,用于完成算术运算的$ALU$部件中。
@@ -359,26 +359,41 @@ k|2|3|4|5|6|7
#### 定点数乘法运算
对于原码的乘数运算可以参考十进制的乘数运算,将乘数一位一位的乘被乘数然后再全部相加得到的就是答案。而使用二进制的一位位乘法显然比十进制的一位位乘更简单。
对于原码的乘数运算可以参考十进制的乘数运算,将乘数一位一位的乘被乘数然后再全部错位相加得到的就是答案。而使用二进制的一位位乘法显然比十进制的一位位乘更简单。
+ 原码一位乘法:
+ 一般使用原码一位乘法,即每次只乘一位的数据。
+ 在原码乘法时,可以先符号位单独处理,将两个符号进行异或操作,得到的结果就是最后的结果的符号。然后对数据的绝对值(去除符号位)进行一位位的乘法(位积)然后相加
+ 由于运算时可能存在绝对值大于$1$但是不是溢出的情况,所以部分积和被乘数使用双符号位
+ 在运算器的组成时出现一个表格,说明在进行乘运算时,$ACC$保存乘积高位,$MQ$保存乘数与乘积低位,$X$保存被乘数
+ 原码一位乘法机器实现时就是按照这种方式计算:
1. 字长若为$n+1$位,则$ACC$、$MQ$、$X$全部初始化为$n$位,将被乘数的绝对值放入$X$中,$MQ$放入乘数的绝对值,$ACC$初始化为全$0$。
2. 将$MQ$的最右边的一位当做当前乘运算位,让其进行乘运算,运算规则是,若当前位是$1$,则$ACC$加上被乘数,即$ACC+=X$,若当前位是$0$,则$ACC$加上$0$(保持不变,跳过)
3. 将$ACC$和$MQ$的数据连接在一起,全部逻辑右移一位,$ACC$数据高位补0$ACC$最后一个低位移到$MQ$的最高位。将$MQ$的最后一位抛弃。若是第i轮逻辑右移则$MQ$的前$i$位是结果的后$i$个低位值
4. 从步骤二开始重复,字长若为$n+1$位,则重复$n$次,直到$MQ$的最后一位是符号位,则停止计算。此时$ACC$的全部和$MQ$的前$n$位是结果。
5. 定点小数的小数位隐藏在符号位后面第一位,定点正数的小数位隐藏在$MQ$符号位的前一位
6. 将两个符号位的异或结果赋值给积最高位。
+ 补码一位乘法:
+ 对于补码的乘法运算的逻辑也跟原码的类似,补码的计算就是使用$Booth$算法实现。
+ 辅助位其实就是在$MQ$最后再加上一位,辅助位初始为$0$。每次右移会使$MQ$的最低位顶替原本的辅助位(事实上$MQ$共$n+2$位)
+ 为了保证统一,所以$ACC$和$X$都会增加一位,变成$n+2$位,多出来的一位就可以实现双符号位补码运算,而$MQ$还是用原理的单符号位
+ 为了加快运算会有辅助电路实现$(-x)$的补码的运算
+ 最后一次不需要移位直接根据辅助位和$MQ$最后一位判断进行相加。从而让乘数的符号位也参数运算中来确定最后结果的符号
+ 一般使用原码一位乘法,即每次只乘一位的数据
+ 在原码乘法时,可以先符号位单独处理,将两个符号进行异或操作,得到的结果就是最后的结果的符号。然后对数据的绝对值(去除符号位)进行一位位的乘法(位积)然后相加
+ 由于运算时可能存在绝对值大于$1$但是不是溢出的情况,所以部分积和被乘数使用双符号位
+ 在运算器的组成时出现一个表格,说明在进行乘运算时,$ACC$保存乘积高位,$MQ$保存乘数与乘积低位,$X$保存被乘数。
+ 原码一位乘法机器实现时就是按照这种方式计算:
1. 字长若为$n+1$,则$ACC$、$MQ$、$X$全部初始化为$n$位,将被乘数的绝对值放入$X$中,$MQ$放入乘数的绝对值,$ACC$初始化为全$0$
2. 将$MQ$的最右边的一位当做当前乘运算位,让其进行乘运算,运算规则是,若当前位是$1$,则$ACC$加上被乘数,即$ACC+=X$,若当前位是$0$,则$ACC$加上$0$(保持不变,跳过)
3. 将$ACC$和$MQ$的数据连接在一起,全部逻辑右移一位,$ACC$数据高位补$0$$ACC$最后一个低位移到$MQ$的最高位。将$MQ$的最后一位抛弃。若是第i轮逻辑右移$MQ$的前$i$位是结果的后$i$个低位值
4. 从步骤二开始重复,字长若为$n+1$位,则重复$n$次,直到$MQ$的最后一位是符号位,则停止计算。此时$ACC$的全部和$MQ$的前$n$位都是结果
5. 定点小数的小数位隐藏在符号位后面第一位,定点正数的小数位隐藏在$MQ$符号位的前一位。
6. 将两个符号位的异或结果赋值给积最高位。
+ 原码一位乘法逻辑运算:
1. 初始化,左边为部分积,即计算的部分结果,最开始为$0$,右边为乘数的绝对值,最后边全部为丢失位
2. 根据丢失位前一位的值来判断加上什么,若是$1$则加上被乘数的绝对值,若是$0$则加与被乘数等长的全$0$
3. 右移部分积一位,高位补$0$,丢失位多一位
4. 继续计算,直到乘数全部被移出。字长为$n+1$位则需要移位计算$n$次。丢失位前的就是全部部分积
5. 将两个符号位的异或结果赋值给积最高位。
补码一位乘法:
+ 对于补码的乘法运算的逻辑也跟原码的类似,补码的计算就是使用$Booth$算法实现。
+ 辅助位其实就是在$MQ$最后再加上一位,辅助位初始为$0$。每次右移会使$MQ$的最低位顶替原本的辅助位(事实上$MQ$共$n+2$位)。
+ 为了保证统一,所以$ACC$和$X$都会增加一位,变成$n+2$位,多出来的一位就可以实现双符号位补码运算,而$MQ$还是用原来的单符号位。
+ 为了加快运算会有辅助电路实现$(-x)$的补码的运算。
+ 最后一次不需要移位直接根据辅助位和$MQ$最后一位判断进行相加。从而让乘数的符号位也参数运算中来确定最后结果的符号。
+ 补码一位乘法逻辑运算:
1. 初始化,左边为部分积,即计算的部分结果,最开始为全$0$,右边为乘数的绝对值,最后边全部为丢失位,丢失位第一个就是辅助位。
2. 根据辅助位和$MQ$最低位的差的值来判断加上什么,若是$1$则加上被乘数的补码,若是$0$则加与被乘数等长的全$0$,若是$-1$则加上被乘数的负数的补码。
3. 算术右移部分积一位,正数高位补$0$,负数高位补$1$,丢失位多一位。
4. 继续计算,直到乘数全部被移出。字长为$n+1$位则需要移位计算$n$次。丢失位前的就是全部部分积。
5. 最后一次不需要移位,再加一次。
$Booth$算法的移位法则:
@@ -389,6 +404,10 @@ $y_n$(高位)|$y_{n+1}$(低位)|操作
1|0|部分积加$[-X]_{\text{补}}$,右移一位
1|1|部分积右移一位
即辅助位减$MQ$最低位的值,若是$1$就加补码,若$0$则加$0$,若$-1$则加负数的补码。
两种乘法的区别:
 |原码|补码
:----:|:--:|:--:
计算流程|n轮加法、移位|n轮加法、移位最后进行一次加法
@@ -401,38 +420,63 @@ $y_n$(高位)|$y_{n+1}$(低位)|操作
#### 定点数除法运算
+ 进行除法操作时,都是为了找到一位能让商乘除数能最大即余数最小但大于$0$的值。若除数被除数都是小数,可以同时乘一个数变成整数再运算。
+ 所以可以忽略小数点,每确定一位商进行一次减法,若机器字长为$n$位,则得到$n-1$位余数,在余数末尾补$0再确定下一位商$0$或$1$,直到确定$n$位商即可停止。
+ 所以可以忽略小数点,每确定一位商进行一次减法,若机器字长为$n$位,则得到$n-1$位余数,在余数末尾补$0$,再确定下一位商$0$或$1$,直到确定$n$位商即可停止。
+ 在运算器的组成时出现一个表格,说明在进行除运算时,$ACC$保存被除数和余数,$MQ$保存商,$X$保存除数。
原码恢复余数法:
1. 字长若为n+1位则ACC、MQ、X全部初始化为n位将被除数的绝对值放入ACC中X放入除数的绝对值MQ初始化为全0。
2. 将MQ的最右边的一位当做当前除运算位让其进行除运算运算规则是默认商1ACC-=X即x的补码要加上除数的绝对值的负值的补码减法都由补码的加法实现判断是否有误。若结果高位为0则无误高位为1则有误错误则商改为0并恢复余数ACC加上X中除数的补码。
3. 将ACC和MQ的数据连接在一起全部逻辑左移一位MQ数据低位补0MQ最高位的0移到ACC的最低位。将ACC的最高一位抛弃。若是第i轮逻辑左移则MQ的后i位是当前计算的商的结果
4. 从步骤二开始重复字长若为n+1位则左移n次上商n+1次直到MQ中全部是计算结果则停止计算。此时MQ中保存商ACC中保存左移n位的余数值真正的余数应该是结果再乘上2的-n次方
物理上:
1. 字长若为$n+1$位,则$ACC$、$MQ$、$X$全部初始化为$n$位,将被除数的绝对值放入$ACC$中,$X$放入除数的绝对值,$MQ$初始化为全$0$
2. 将$MQ$的最右边的一位当做当前除运算位,让其进行除运算,运算规则是,默认商$1$$ACC-=X$,即$X$的补码要加上除数的绝对值的负值的补码(减法都由补码的加法实现),判断是否有误。若结果高位为$0$则无误,高位为$1$则有误,错误则商改为$0$,并恢复余数,$ACC$加上$X$中除数的补码
3. 将$ACC$和$MQ$的数据连接在一起,全部逻辑左移一位,$MQ$数据低位补$0$$MQ$最高位的$0$移到ACC的最低位。将$ACC$的最高一位抛弃。若是第$i$轮逻辑左移,则$MQ$的后$i$位是当前计算的商的结果。
4. 从步骤二开始重复,字长若为$n+1$位,则左移$n$次,上商$n+1$次,直到$MQ$中全部是计算结果,则停止计算。此时$MQ$中保存商,$ACC$中保存左移$n$位的余数值,真正的余数应该是结果再乘上$2$的$-n$次方。
5. 定点小数的小数位隐藏在符号位后面第一位,定点正数的小数位隐藏在最后一位后。
6. 将两个符号位的异或结果赋值给商最高位。
逻辑上:
1. 老余数减去除数的绝对值,得到新的余数。
2. 若新余数为负,即高位为$1$表示是负数,则商$0$,并重新加上除数的绝对值恢复为老余数。
3. 若新余数为正,则商$1$。
4. 余数逻辑左移,继续运算。
默认会商$1$,如果发现结果有问题就恢复余数(变成商$0$)。若字长为$n+1$,则只用左移$n$次,上商$n+1$次,最后一次上商余数不左移。
原码加减交替法:
+ 因为恢复余数很麻烦,所以会考虑是否不用恢复余数,直接进行运算得到后面的结果。
+ 假如令原始值为x,原始值加上-y绝对值的补码结果为ay绝对值的补码为b,按恢复余数法,a这个余数是一个负值,所以要加上b即a+b变成原始值a+b=x这时候商0然后计算下一个商余数a+b左移一位即(a+b)×2=2a+2b这时候商1看看结果是否正确即2a+2b要减去y绝对值的补码等价于加上-y绝对值的补码2a+2b-b=2a+b。
+ 所以如果得到了一个负的余数a可以直接转换到2a+b这个结果即直接左移一位余数再加上除数的补码就可以得到结果。
+ 假如令原始值为$x$,原始值加上$-y$绝对值的补码结果为$a$$y$绝对值的补码为$b$,按恢复余数法,$a$这个余数是一个负值,所以要加上$b$即$a+b$变成原始值$a+b=x$,这时候商$0$,然后计算下一个商,余数$a+b$左移一位,即$(a+b)\times2=2a+2b$,这时候商$1$看看结果是否正确,即$2a+2b$要减去y绝对值的补码等价于加上$-y$绝对值的补码)$2a+2b-b=2a+b$
+ 所以如果得到了一个负的余数$a$,可以直接转换到$2a+b$这个结果,即直接左移一位余数再加上除数的补码就可以得到结果。
+ 这就是加减交通法或不恢复余数法。
+ 从而恢复余数法就是当余数为负时商0,并+|除数|,再左移,再-|除数|,而加减交替法是当余数为负时商0,并左移,再+[除数|,若余数为正时商1,并左移,再-|除数|。
+ 值得注意的是,若在最后一步余数为负,需要商0,并加上除数的补码得到正确余数。
+ 从而恢复余数法就是当余数为负时商$0$并+|除数|,再左移,再-|除数|,而加减交替法是当余数为负时商$0$,并左移一位,再+[除数|,若余数为正时商$1$,并左移一位,再-|除数|。
+ 值得注意的是,若在最后一步余数为负,需要商$0$,并加上除数的补码得到正确余数。
<span style="color:orange">注意:</span>在定点小数运算时商只能是小数而不能是整数所以被除数一定要小于除数机器判断标准是看第一步计算的商若第一步计算的商是1则代表结果大于1机器就会报错。
逻辑上:
1. 被除数减去除数的绝对值,得到新的余数。
2. 余数为负,则商$0$,左移,加上除数绝对值。
3. 余数为正,则商$1$,左移,减去除数绝对值。
4. 在最后一步余数为负,需要商$0$,并加上除数的补码得到正确余数。
<span style="color:orange">注意:</span>在定点小数运算时,商只能是小数而不能是整数,所以被除数一定要小于除数,机器判断标准是看第一步计算的商,若第一步计算的商是$1$则代表结果大于$1$,机器就会报错。
补码加减交替法:
+ 符号位参与运算。
+ 被除数÷余数、除数采用双符号位。
+ 被除数和除数同号,则被除数减去除数,异号则被除数加上除数。
+ 余数和除数同号,商1,余数左移一位减去除数;
+ 余数和除数异号,商0,余数左移一位加上除数。
+ 重复n次。
+ 最后一次计算时末位商置为1,处理简单,而且精度误差也不会超过$2^{-n}$。
+ 余数和除数同号,商$1$,余数左移一位减去除数;
+ 余数和除数异号,商$0$,余数左移一位加上除数。
+ 重复$n$次。
+ 最后一次计算时末位商置为$1$,处理简单,而且精度误差也不会超过$2^{-n}$。
逻辑上:
1. 被除数和除数同号,则被除数减去除数,若异号则被除数加上除数。
2. 余数和除数异号,则商$0$,左移,加上除数。
3. 余数和除数同号,则商$1$,左移,减去除数。
4. 重复$n$次,末位商恒置为$1$。
除法类型|符号位参与运算|加减次数|移位方向|移位次数次数|上商和加减原则|说明
:------:|:------------:|:------:|:------:|:----------:|:-----------:|:---:
@@ -447,15 +491,15 @@ $y_n$(高位)|$y_{n+1}$(低位)|操作
#### 定点数数据存储与排列
+ 数据最左边的高位就是最高有效字节MSB。
+ 数据最右边的低位就是最低有效字节LSB。
+ 大端模式将MSB存到最低地址LSB存在最高地址。便于人类阅读。
+ 小端模式将MSB存到最高地址LSB存在最低地址。便于机器读取。
+ 数据最左边的高位就是最高有效字节$MSB$
+ 数据最右边的低位就是最低有效字节$LSB$
+ 大端模式:将$MSB$存到最低地址,$LSB$存在最高地址。便于人类阅读。
+ 小端模式:将$MSB$存到最高地址,$LSB$存在最低地址。便于机器读取。
+ 边界对齐:
+ 现代计算机通常是按字节编址即每个字节对应一个地址通常。也支持按字、按半字、按字节寻址。
+ 假设存储字长为32位1个字=32bit半字=16bit。每次访存只能读/写1个字。
+ 字地址转换为字节地址,只用逻辑左移两位就可以了,即乘以4因为字长为32而字节长8
+ 使用边界对齐方式会让每个数据都能一次性读完而不用跨行读取,多余的空间用0填充。
+ 假设存储字长为$32$位,则$1$个字=$32bit$,半字$=16bit$。每次访存只能读/写$1$个字。
+ 字地址转换为字节地址,只用逻辑左移两位就可以了,即乘以$4$,因为字长为$32$,而字节长$8$
+ 使用边界对齐方式会让每个数据都能一次性读完而不用跨行读取,多余的空间用$0$填充。
## 浮点数

View File

@@ -257,7 +257,7 @@ $D.$死锁
## 虚拟内存管理
### 虚拟内存的基本概念
<!-- ### 虚拟内存的基本概念 -->
### 请求分页管理方式
@@ -281,8 +281,36 @@ $D.$Ⅰ、Ⅱ和Ⅲ
解:$B$。用户进程访问内存时缺页,会发生缺页中断。发生缺页中断时,系统执行的操作可能是置换页面或分配内存。越界错误是编程时访问内存越界,系统内没有越界错误,不会进行越界出错处理。
**例题** 有一个矩阵`int A[100,100]`以行优先方式进行存储。计算机采用虚拟存储系统,物理内存共有三页,其中一页用来存放程序,其余两页用于存放数据。假设程序已在内存中占一页,其余两页空闲。若每页可存放$200$个整数,程序$1$、程序$2$执行的过程中各会发生多少次缺页?每页只能存放$100$个整数时,会发生多少次缺页?以上结果说明了什么问题?
```c
\\ 1:
for(i=0;i<100;i++)
for(j=0;j<100;j++)
A[i,j]=0;
\\ 2:
for(j=0;j<100;j++)
for(i=0;i<100; i++)
A[i,j]=0;
```
解:缺页与页数无关,与每页数据数量有关。
程序$1$按行优先的顺序访问数组元素,与数组在内存中存放的顺序一致,每个内存页面可存放$200$个数组元素。这样,程序$1$每访问两行数组元素就产生一次缺页中断,所以程序$1$的执行过程会发生$50$次缺页。
程序$2$按列优先的顺序访问数组元素,由于每个内存页面存放两行数组元素,因此程序$2$每访问两个数组元素就产生一次缺页中断,整个执行过程会发生$5000$次缺页。
若每页只能存放$100$个整数,则每页仅能存放一行数组元素,同理可以计算出:程序$1$的执行过程产生$100$次缺页;程序$2$的执行过程产生$10000$次缺页。
以上说明缺页的次数与内存中数据存放的方式及程序执行的顺序有很大关系;同时说明,当缺页中断次数不多时,减小页面大小影响并不大,但缺页中断次数很多时,减小页面大小会带来很严重的影响。
#### 资源利用情况
+ $CPU$利用率低,磁盘利用率高:物理内存短缺,反复换入换出,页面抖动。需要增大内存容量,减少多道程序并发数。
+ $CPU$利用率低,磁盘利用率低:$CPU$没有充分里利用。增加并非进程数
+ $CPU$利用率高,磁盘利用率低:系统正常。
**例题** 测得某个采用按需调页策略的计算机系统的部分状态数据为:$CPU$利用率为$20\%$,用于交换空间的磁盘利用率为$97.7\%$,其他设备的利用率为$5\%$。由此判断系统出现异常,这种情况()能提高系统性能。
$A.$安装一个更快的硬盘