7.计算机是输入输出设备(IO设备)--组成篇
常见的输入设备
1.字符输入设备
最常见的就是键盘。
键盘可以分三种:
- 薄膜键盘:标配的主机一般都是薄膜键盘。键盘内部由有弹性的薄膜连接起来
- 机械键盘:每一个键位都是由独立的轴连接起来的,敲击时,感觉会好很多。机械键盘根据段落感,声音,压力,键程可以分为:黑轴,红轴,青轴,茶轴,樱桃轴。
- 电容键盘:比较高档
2.图形输入设备
最常见的是鼠标,数位板,扫描仪
数位板:主要包括输入板和压感笔。常用于绘图创作
扫描仪:将图形信息转化为数字信号
3.图像输出设备
主要有显示器,打印机,投影仪
显示器有两种:CRT显示器、液晶显示器
输入输出接口的通用设计
如何设计输入输出接口?
首先要支持读取数据,其次要能向设备发送数据,然后处理设备是否被占用,最后判断设备是否已经连接,设备是否已经启动
接口主要有: 【作用是和外设连接,并操作外设】
1.数据线:I/O设备与主机之间进行数据交换的传输线
根据设备的区别,可以分为单向传输线、双向传输线
2.状态线:IO设备状态向主机报告的信号线
查询设备是否已经正常连接并就绪
查询设备是否已经被占用
3.命令线:CPU向设备发送命令的信号线
发送读写信号,发送启动停止信号。例如主机中的光驱,计算机就是通过命令线向光驱发动启动停止信号
4.设备选择线:主机选择I/O设备进行操作的信号线
对连在总线上的设备进行选择。例如在对多个U盘进行选择,然后再进行读写操作,就是通过设备选择线。
CPU与IO设备的通信
首先要了解:CPU速度与IO设备速度不一致
1.程序中断
当外围的IO设备准备就绪时,向CPU发送中断信号
CPU内部有专门的电路响应中断信号
这里需要注意的是CPU响应中断,不是立即响应的,可能会有一定的延时!
提供低速设备通知CPU的一种异步方式
因为有了程序中断CPU可以在高速运转同时兼顾低速设备的响应
【就像是通知CPU临时接个任务,任务资料准备就绪,CPU就停下手上的活,来完成这个临时任务。任务完成后又继续手上的工作】
缺陷:频繁的打断CPU会降低CPU的使用效率
2.DMA(直接存储器访问)
1.DMA直接连接主存和IO设备
2.DMA工作时不需要CPU的参与
当主存与IO设备交换信息时,不需要中断CPU
通过DMA直接存储器访问,可以大大提高CPU的效率
平时的硬盘和显卡中都有DMA设备*
8.计算机存储器的分类--组成篇
1.存储器的分类:
【按存储介质分类】
半导体存储器:内存,U盘,固态硬盘
磁性存储介质:磁带,磁盘
【按照存取方式分类】
随机存储器(RAM) :1.随机读取 2.与 位置无关
串行存储器:1.与位置有关,2.按顺序查找
只读不写存储器(ROM):只读不写
2.存储器的层次结构
购买存储器考虑的因素:
读写速度:5400转、7200转
存储容量:2T,4G
价格
为了量化存储器的性价比,有了位价
容量+价格=>位价 :每比特位价格
我们可以根据位价和读写速度将存储器划分为几个层次:
缓存,主存,辅存这3个层次
缓存:CPU中的高速缓存和寄存器 位价高 速度块 容量低
主存:计算机中的内存 位价中 速度中 容量中
辅存:外部辅存设备。例如磁盘,U盘,移动硬盘 位价低 速度慢 容量高
CPU和缓存、主存3者可以直接通信,我们把这个层次称为缓存-主存 层次。
原理:局部性原理
实现:在CPU与内存之间增加一层速度快(容量小)的Cache(也就是高速缓存)
目的:解决主存与CPU速度不匹配的问题
局部性原理:局部性原理是指CPU访问存储器时,无论是存取指令还是存取书,所访问的存储单元都趋近于聚集在一个较小的连续区域中。
访问高速缓存这个较小的连续区域,读写速度快速提高
辅存只能与主存直接通信,CPU不参与,这个层次被称为主存-辅存层次。
原理:局部性原理
实现:主存之外增加辅助存储器(磁盘、SD卡、U盘)
目的:解决主存容量不足的问题
电脑中有一个20G的游戏,但是电脑内存只有8G,那游戏是这么运行起来的?
根据局部性原理,对应一些要使用的数据放入主存中,对于一些当前不使用的数据,放入辅存中。
9.计算机的主存储器与辅助存储器--组成篇
思考:
计算机断电,内存数据丢失?
计算机断电,磁盘数据不会丢失?
主存储器:内存(内存条)
1.它是RAM(随机存取存储器)
2.RAM通过电容存储数据,每隔一端时间必须刷新一次
3.如果掉电,那么一段时间后将丢失所有数据
刷新必须要有电的存在,如果有一段时间不刷新则电容中的电子也会丢失,数据也就因此丢失了
内存的组成
地址总线:指定数据的位置
数据总线:传输数据
内存与操作系统的关系:
32位系统: 2^32 =4^30 =4GB
这是32位系统的所能支持的最大内存,加更多的内存条也没有用,因为它的地址总线只有32位,因此它的寻址范围只有4GB的大小
64位系统: 2^64 =234*230 =2^34GB
因为它的地址总线是32位,因此它的寻址范围有2^34GB
辅助存储器:磁盘
盘片:磁材料存储数据
磁道:盘片一周的内容
扇区:磁道中一部分的内容
磁头的方向:例如磁头是往里走,还是往外走
磁头的位置:关注磁头当前是位于哪一个方向的
磁盘的组成:
1.表面是可磁化的硬磁特性材料
2.移动磁头径向读取磁道信息
磁盘的调度算法:
举例:
这里我们把最外面的磁道称之为第1磁道,最里面的磁道称之为第5个磁道
1.先来先服务算法:【命令/需求的顺序】
按先后顺序访问的磁道读写的需求
磁头由磁道4,移向磁道1。每次读取时,都是磁头移动到 相应的磁道进行访问
2.最短寻道时间优先算法:【一直访问的都是离磁头最近的】
与磁头当前位置有关
优先访问离磁头最近的磁道
首先是读取第4个磁道,因为它是优先访问离磁头最近的磁道
然后既可以是读取第5个磁道,也可以是读取第3个磁道,两者距离第4个磁道 一样近
3.扫描算法(电梯算法):【先是单向查找,然后反向查找】
每次只往一个方向移动(就和电梯一样,一次只能往一个方向载人)
到达一个方向需要服务的尽头再反方向移动
这里它先读取当前磁头所在的磁道,也就是第4磁道
之后,因为磁头的方向向外,再去读取的就是4磁道外侧的磁道,也就是第3磁道,然后就是第2磁道,然后是第1磁道。第1磁道读取2次,外侧已经到需要服务的尽头了,然后反方向读取到第2个磁道。。。直到移动到第5个磁道,读取第5个磁道。
4.循环扫描算法:【永远单向查找,这个方向到头后,直接返回到初始方向进行查找】
因为扫描算法并不公平,因此在它的基础上提出了循环扫描算法
它和扫描算法最大的区别:只向一个方向读取。而扫描算法会出现 反方向方向读取
假设这里设定它由外向内读
首先读取第4个磁道,然后是第5个磁道。到尽头了,直接将磁头移动到第1个磁道,然后开始读第1个磁道两次。然后第2个磁道,第3个磁道....这里没有反向读取
10.计算机的高速缓存--组成篇
回顾一下前面的内容:
高速缓存位于主存-缓存层,在CPU和主存之间
解决的问题:CPU与主存的速度不匹配
高速缓存的工作原理
为了了解高速缓存的工作原理,需要先了解一下主存中的一些概念:
字:【内存中的最小单元】
是指存放在一个存储单位中的二进制代码的组合
一个字可以表示:一个数据,一条指令,一个字符串
字块:【多个字连续组成一个字块】
存储在连续的存储单元中而被看作是连续一个单元的一组字
总字数*单一字位数=总容量
假设:
一个字有32位 【这里是bit位,不是比特数!这里的32位是假设的,不代表实际 的,毕竟4GB一个字,太大了】
一个字块有B个字
主存共有M个字块
B*M =主存总字数
总字数*32=主存总容量(bits)
有了字和字块就可以理解寻址的过程:
字的地址包括2个部分:
前m指的是字块的地址
后b位指定字在字块中的地址
下面的例子可能好理解一点m和M的关系
所谓地址实际上是可以理解位序号:【字块数、块内字数都一一对应着序号,也就对应着地址】
字块数有1024个,这里的字块地址也就有1024个,也就是1024个序号。
字块地址m,实际上指的是代表地址的序号,出现的最大序号的位数。1个表示1024的数,在二进制中有多少位。正如4在二进制中是2位一样,1024在二进制中是2^10,也就是2的10位。
同理,块内地址b,指的也是代表块内地址的最大序号的位数。这里最大序号是1048576,它在二进制中是2^20,也就是2的20位
高速缓存的存储逻辑结构类似(字和字块,地址。且运算方式相同)
缓存的容量较小,速度较快
缓存中的数据都是复制主存得来
CPU有两种情况下需要高速缓存(工作原理):
CPU需要的数据在缓存里【直接拿】
CPU需要的速度不在缓存中:
不在缓存需要去主存拿
以下内容大致了解即可,因为没有涉及具体是如何访问的,如,访问主存的同时也在访问高速缓存?访问效率的公式并不易理解!掌握命中率(总次数中的xx),知道有访问效率(缓存时间内的xx)即可
我们需要尽可能在高速缓存中去取数据:*
因此我们需要量化CPU从高速缓存中取数据的成功率:【也就是命中率】
缓存命中率:理论上CPU每次都能从高速缓存中取数据,命中率为1
这个只是理论上的,因为高速缓存的容量不如主存,因此永远不能为1 (why???容量和命中率的关系?)
因为两者都会访问,加起来的才是访问总次数,而命中率=访问高速缓存的速度/访问的总次数 因此永远不会为1
还有一个量化的指标也可以衡量CPU从高速缓存中取数据的成功率:【访问效率】
访问缓存的平均时间:访问缓存的命中率*访问缓存的时间
访问主存的平均时间:访问主存的命中率*访问主存的时间
整个层次的平均时间:访问主存的平均时间+访问缓存的平均时间
访问效率:e=访问缓存的时间/访问的整个层次的平均时间
平均访问时间为:
$$
0.97*50+(1-0.97)200=54.5ns
$$
访问主存和访问缓存的速度是不一样的,可能访问了缓存几十次,才访问了主存一次。
我们想要命中率越高越好就需要一个良好的缓存替换策略
高速缓存的替换策略
替换的时机:【缓存中没有数据,需要从主存中载入所需的数据】
替换的算法:【这几种算法,在其他处理缓存的领域也是常用的】
1.随机算法:【每次随机选取一个高速缓存中的位置,然后把相关的内容替换掉】
2.先进先出算法(FIFO):【把高速缓存看做最先的算法】
*把高速缓存看做是一个先进先出的队列
*优先替换最先进入队列的字块
3.最不经常使用算法(LFU)**:【替换最不经常使用的字块。看标记的频率】
*优先淘汰最不经常使用的字块
*需要额外空间记录每个字块的使用频率
每个缓存中的字块都有一个对应的频率。每次使用频率加1
然后淘汰时选择最少频率的淘汰
4.最近最少使用算法(LRU):【每次使用,若是缓存中有该字块,则将字块放到最前面,表示它是最近使用的】
和LFU算法产生的结果是很类似的,但区别在:
1.如果一个子块,先使用很多次,例如1万次,然后连续10多次没有被使用到,那它就被替换了 。
这个叫卸磨杀驴算法???或者说是末位淘汰算法???
2.可以解决访问频率相同的问题
*优先淘汰一段时间内没有使用的算法
*有多种实现方式,一般使用双向链表来实现
把当前访问节点置于链表前面(保证链表头部节点是最近使用的)
这里的节点可以是字块。用字块来想这个逻辑会更好理解一点
每次都是淘汰末位的,只不过再次被使用的字块会放到前面去
面试会问替换策略?!
11.计算机的指令系统--组成篇
根据这一章的学习标明,毕竟简易的笔记,十分不易于复习
1.机器指令形式
2.机器指令的操作类型
3.机器指令的寻址方式
*机器指令的形式
操作码,地址码组成
指明指令要完成的 操作
操作码的位数反映了机器可以做出的操作种类,每一个操作都 对象做着一种操作。操作码的位数实际上只的是操作码总数的位数。只是在计算机领域习惯性的省略了"总数的"这3个字,一般位数都是值总数的位数
假如:一个8位的操作码,它可以做出的种类如下
2^8=256 种
地址码
地址码直接给出操作数或者操作数的地址
这里的操作数指的是操作的数据
分类:1,2,3地址码指令
3地址码指令,指的是地址码字段有3个地址
| 操作码 | 地址码1 | 地址码2 | 地址码3 |
|---|---|---|---|
| 操作码(OP) | addr1 | addr2 | addr3 |
该条指令所执行的操作:(addr1)OP(addr2)→(addr3)
它表示地址1(对应的数据)和地址2(对应的数据)进行了OP操作,然后将值赋给了地址3
假设:OP是加法操作,那地址1对应的数据就是加数,而地址2对应的数据就是另一个加数,它们进行了加法操作,并用地址3来保存两者的和
在计算机领域中,只有复制和覆盖
底层比较简单,没有特殊的方法,这里的赋值就是覆盖
这里就是用和这个值覆盖了地址3原本对应的数据,那个数据可能对应的是0
2地址码指令,指的是地址码字段有2个地址
| 操作码 | 地址码 1 | 地址码2 |
|---|---|---|
| 操作码(OP) | addr1 | addr2 |
该条指令所执行的操作:(addr1)OP(addr2)→(addr1)或(addr2)
它表示地址1(对应的数据)和地址2(对应的数据)进行了OP操作,然后将值随机赋给了地址1或者是地址2
逻辑同上,地址1或者地址2对应的数据,被操作之后的数据所覆盖
1地址码指令,指的是地址码字段有1个地址
| 操作码(OP) | 地址码 |
|---|---|
| OP | addr1 |
该条指令所执行的操作:(addr1)OP→(addr1) 或者是 (addr1)OP(ACC)→(addr1)
第一个,它表示地址1(对应的数据)对自身进行了OP操作,然后将得到的值赋给了地址1。也就是原来对应的数据被新的值所覆盖了
第2个,可以理解为1个操作数(数据)操作一个默认行为,例如:"自增",它不需要第2个操作数参与
零地址指令
1.在机器指令中无地址码
2.空操作、停机操作、中断返回操作等
机器指令的操作类型
数据据传输:
*寄存器之间,寄存器与存储单元,存储单元(主存,辅助,高速缓存等)之间传输
*数据读写、交换地址数据、清0置1等
算术逻辑操作:【算术/逻辑运算】
1.操作数之间的加减乘除运算
2.操作数的与、或、非等逻辑位运算
移位操作: 【×2,÷2】
1.数据左移(乘2)、数据右移(除2)
2.完成数据在算术逻辑单元的必要操作
控制指令
等待指令、停机指令、空操作指令、中断指令等
机器指令的寻址方式
主要的指令寻址方式:
顺序寻址:一般是
跳跃寻址:顺序的基础之上的
由指令地址101对应的指令MOV RO,R1所对应的指令开始,按照地址大小,由101→102,再由102→103,再用103→104.........直到执行到105地址对应的指令JMP 102,它又跳转到执行地址102对应的指令
前面101~105,属于顺序寻址,后面105跳转到102属于跳跃寻址
数据寻址方式:【分为三种】 寻址指的就是根据机器指令的中的地址找数据
立即寻址:包含操作数(据)
机器指令示例:
| 操作码(OP) | 地址码1 | 操作(的)数(据) |
|---|---|---|
| OP | addr1 | 6 |
直接在机器指令中获得了操作数(据)
1.指令直接获得操作数
2.无需访问存储器
直接寻址:操作数(据)在地址
还是上面那张表,操作系统读取地址码addr1时,会在主存中寻找addr1这个地址码所对应的数据
1.直接给出操作数(据)在主存的地址
2.寻找操作数(据)简单,无需计算数据地址(间接寻址需要)
间接寻址:操作数(据)在地址中的地址
机器指令示例:
| 操作码 | 地址码1 | 地址码2 |
|---|---|---|
| OP | R1 | addr1 |
1.指令地址码给出的是操作数地址的地址
2.需要访问一次或者多次主存来获取操作数
这里addr1这个地址码对应的不是操作数(据),而是另一条在主存中的地址,根据这条地址,才能在主存中找到操作数(据)
**三种机器指令的寻址对比 **
| 寻址方式 | 优点 | 缺点 |
|---|---|---|
| 立即寻址 | 速度快 | 地址码位数限制操作数表示范围 |
| 直接寻址 | 寻找操作数简单 | 地址码位数限制操作数的寻址范围 |
| 间接寻址 | 寻址范围大 | 速度较慢 |
12.计算机的CPU之控制器--组成篇
程序计数器:存下一条指令的
时序发生器:电子工程领域,电子脉冲
指令译码器:翻译机器指令
指令寄存器:将指令读到寄存器中,和主存或者缓存进行通信
主存地址寄存器:存当前或者将要执行的指令在主存中所对应的地址
主存数据寄存器:存当前或者将要处理的数据
通用寄存器:比一般寄存器大,用于暂时存放数据或者指令(被当作备用的寄存器???),可以用来保存ALU运算的中间结果
13.计算机的CPU之运算器--组成篇
概念:运算器是用来进行数据进行数据运算加工的
组成:
数据缓冲器:【和外设做数据交互】
1.分为输入缓冲和输出缓冲
输入缓冲:暂时存放外设送过来的数据,然后将这些数据送往ALU
如果ALU正在运算,那么下一个需要运算的数据就保存在输入缓冲中
输出缓冲:暂时出存放ALU送来的数据,然后将这些数据送往外设
如果数据运算完,从ALU中出来,就先将其保存在ALU中,然后等待控制器的指令,输往相应的位置
ALU:算术逻辑单元,是运算器的主要组成
常见的位运算(左右移、与或非等)
算术运算(加减乘除)
ALU结构图:
通用寄存器:
和控制器中通用寄存器类似
用于暂时存放或传送数据或指令
可保存ALU的运算中间结果
容量比一般专用寄存器要大
状态字寄存器:
存放运算状态(条件码、进位、溢出、结果正负)
存放运算控制信息(调试跟踪标记位,允许 中断位)
最后是总线
14.计算机指令的执行过程
步骤:
取指令>>>分析指令>>>执行指令
15.进制基础--计算篇
二进制转十进制:按权展开法:
没有一个0就多一次方,1后面6个0就是2的6次方,1后面5个0就是2的5次方
$$
01100101=01000000+100000+100+1=26+25+2^2+1=101
$$
(整数)十进制转二进制:重复相除法
这里要注意的就是商为1后,还需要再除1次,知道商为0才算完结
| 重复除以2 | 得商 | 取余数 |
|---|---|---|
| 101/2 | 50 | 1 |
| 50/2 | 25 | 0 |
| 25/2 | 12 | 1 |
| 12/2 | 6 | 0 |
| 6/2 | 3 | 0 |
| 3/2 | 1 | 1 |
| 1/2 | 0 | 1 |
因此101=1010011
(小数)十制转二进制:重复相乘法
最后“提出的值”为0时代表结束
| 重复乘以2 | 得积 | 取1 |
|---|---|---|
| 25/32 | 50/32=1+9/16 | 1 |
| 9/16 | 18/16=1+1/8 | 1 |
| 1/8 | 1/4=0+1/4 | 0 |
| 1/4 | 1/2=0+1/2 | 0 |
| 1/2 | 1=1+0 | 1 |