总线
总线(Bus)是计算机各种功能部件之间传送信息的公共通信干线,它是cpu、内存、输入、输出设备传递信息的公用通道,主机的各个部件通过总线相连接,外部设备通过相应的接口电路再与总线相连接,从而形成了计算机硬件系统。
为什么要有总线?
假设没有总线这种设计,计算机设备都是分散连接的,如下图:
此时如果新增了一个输入设备2,此时需要分别连接存储器、控制器、运算器,设备一多线路就会十分复杂。
有了总线之后,设备直接连接总线,使得计算机内部结构变得十分清晰,设备的添加和卸载也变得容易。
总线的分类
片内总线
**高集成度芯片内部的信息传输线**,用于连接寄存器与寄存器、寄存器和控制器&运算器之间。
系统总线
CPU、主内存、IO设备、各组件之间的信息传输线。一般有三类:数据总线、地址总线、控制总线。
数据总线
双向传输各个部件的数据信息
数据总线的位数(总线宽度)是数据总线的重要参数,一般与CPU位数相同(32位、64位)
地址总线
指定源数据或目的数据在内存中的地址
地址总线的位数与存储单元有关
地址总线位数=n,寻址范围:0~^
控制总线
控制总线是用来发出各种控制信号的传输线
控制信号经由控制总线从一个组件发给另外一个组件
控制总线可以监视不同组件之间的状态(就绪/未就绪)
总线的仲裁
系统中多个设备或模块可能同时申请对总线的使用权,为避免产生总线冲突,需由总线仲裁机构合理地控制和管理系统中需要占用总线的申请者,在多个申请者同时提出总线请求时,以一定的优先算法仲裁哪个应获得对总线的使用权。
仲裁方法
链式查询
总线授权信号BG串行地从一个I/O接口传送到下一个I/O接口。假如BG到达的接口无总线请求,则继续往下查询;假如BG到达的接口有总线请求,BG信号便不再往下查询,该I/O接口获得了总线控制权。离中央仲裁器最近的设备具有最高优先级,通过接口的优先级排队电路来实现。
好处:只用很少几根线就能按一定优先次序实现总线仲裁,很容易扩充设备。
坏处:对询问链的电路故障很敏感,如果第i个设备的接口中有关链的电路有故障,那么第i个以后的设备都不能进行工作。查询链的优先级是固定的,如果优先级高的设备出现频繁的请求时,优先级较低的设备可能长期不能使用总线。
计时器定时查询
总线上的任一设备要求使用总线时,通过BR线发出总线请求。中央仲裁器接到请求信号以后,在BS线为“0”的情况下让计数器开始计数,计数值通过一组地址线发向各设备。每个设备接口都有一个设备地址判别电路,当地址线上的计数值与请求总线的设备地址相一致时,该设备 置“1”BS线,获得了总线使用权,此时中止计数查询。
每次计数可以从“0”开始,也可以从中止点开始。如果从“0”开始,各设备的优先次序与链式查询法相同,优先级的顺序是固定的。如果从中止点开始,则每个设备使用总线的优先级相等。
计数器的初值也可用程序来设置,这可以方便地改变优先次序,但这种灵活性是以增加线数为代价的。
独立请求
每一个共享总线的设备均有一对总线请求线BRi和总线授权线BGi。当设备要求使用总线时,便发出该设备的请求信号。中央仲裁器中的排队电路决定首先响应哪个设备的请求,给设备以授权信号BGi。
独立请求方式的优点:响应时间快,确定优先响应的设备所花费的时间少,用不着一个设备接一个设备地查询。其次,对优先次序的控制相当灵活,可以预先固定也可以通过程序来改变优先次序;还可以用屏蔽(禁止)某个请求的办法,不响应来自无效设备的请求。
缺点:设备连线多,总线控制复杂。
输入输出设备
常见的输入输出设备
鼠标、键盘、扫描仪、显示器等。
输入输出接口的通用设计
数据线
是I/O设备与主机之间进行数据交换的传送线
单向传输数据线
双向传输数据线
状态线
IO设备状态向主机报告的信号线
查询设备是否已经正常连接并就绪
查询设备是否已经被占用
命令线
CPU向设备发送命令的信号线
发送读写信号
发送启动停止信号
设备选择线
主机选择I/O设备进行操作的信号线
对连在总线上的设备进行选择
CPU与IO设备的通信
CPU和IO设备的速度是不一致的
程序中断
提供低速设备通知CPU的一种异步的方式,CPU可以高速运转同时兼顾低速设备的响应。
当外围IO设备准备就绪时,向CPU发送中断信号,CPU内部有专门的电路响应中断信号,CPU收到中断信号后就会中断当前工作转为处理外围设备的工作。待工作完成后,CPU加载之前的工作,继续处理。
DMA(直接存储器访问)
当主存与IO设备交换信息时,不需要中断CPU,可以提高CPU的效率。一般计算机的硬盘与显卡都有DMA设备。
存储器
存储器的分类
存储器的层次结构
缓存-主存层次
利用了局部性原理,在CPU和主存之间增加了一层速度快(容量小)的Cache,目的是为了解决主存速度不足的问题。
将程序经常访问的内存置换到高速缓存即可。
局部性原理
局部性原理是指CPU访问存储器时,无论是存取指令 还是存取数据,所访问的存储单元都趋于聚集在一个 较小的连续区域中。
主存-辅存层次
利用了局部性原理,在主存之外增加辅助存储器,目的是解决主存容量不足的问题。
将程序当前使用的数据加载到主存,不使用的数据加载到辅存。
主存储器与辅存储器
主存
RAM(随机存取存储器:Random Access Memory)
RAM通过电容存储数据,必须隔一段时间刷新一次
如果掉电,那么一段时间后将丢失所有数据
32位系统主存大小为:2^32 =4×2^30 =4
64位系统主存大小为:2^64 = 234 × 2^30 = 2^34
辅存
表面是可磁化的硬磁特性材料
移动磁头径向运动读取磁道信息
磁盘调度算法
先来先服务算法 :按顺序访问进程的磁道读写需求
最短寻道时间优先:与磁头当前位置有关,优先访问离磁头最近的磁道
扫描算法(电梯算法) :每次只往一个方向移动,到达一个方向需要服务的尽头再反方向移动
循环扫描算法:每次只往一个方向移动,到尽头后回到初始位继续扫描
高速缓存
在存储器的层次结构中,高速缓存在CPU和主存之间,主要是为了解决CPU和主存速度不匹配的问题。
高速缓存的工作原理
在往下看之前,先了解下下面的概念:
字: 指存放在一个存储单元中的二进制代码组合
字块:存储在连续存储单元中而被看作是一个单元的一组字
假设一个字有32位,一个字块有A个字,主存共有B个字块
那么:主存总字数 = A * B ,主存总容量(bits) = A * B * 32
高速缓存的结构和主存类似,但是主存的容量是远大于缓存的容量。
缓存中存储的数据是主存中的一份复制,当CPU需要的数据在缓存中,直接从缓存里拿,当CPU需要的数据不在缓存中,则需要从主存里拿。
所以就有了两个量化指标:
命中率:命中缓存的次数占CPU访问次数的比例
访问效率:访问缓存时间和访问缓存-主存平均时间之比
高速缓存的替换策略
当CPU所需要的数据不在高速缓存中时,就需要从主存载入数据到高速缓存。一般有四种替换策略。
随机算法
随机选取高速缓存中的一个位置再替换
先进先出算法(FIFO)
把高速缓存看做是一个先进先出的队列,优先替换最先进入队列的字块
最不经常使用算法(LFU)
优先淘汰最不经常使用的字块,需要额外的空间记录字块的使用频率
最近最少使用算法(LRU)
优先淘汰一段时间内没有使用的字块
有多种实现方法,一般使用双向链表,把当前访问节点置于链表前面(保证链表头部节点是最近使用的)