计算机组成原理——总线性能和总线事务

(截图来自MOOC平台华中科技大学计算机组成原理课程)

将总线类比为高速公路,总线频率即是高速公路上车辆的速度;

总线宽度即是高速公路的车道数量,一般与处理器的字长相等;

总线传输速率即是高速公路的车流量,等于(总线宽度/8)* 总线频率。

总线事务就是一个总线周期中发生的一系列活动。

主设备拥有总线的控制权,从设备只能被动接受总线控制传送数据。

总线的一次数据传输,包括4个阶段:

申请与仲裁阶段:节点申请数据传输并经过仲裁判断是否获得总线使用权;

传输阶段;

寻址阶段;

结束阶段。

读修改后写操作:读出数据后修改,再送回原地址,减少访存次数;

写后读操作:写入数据后再读出原数据;

块操作:取出的数据并不是一个总线宽度,而是数据块。

 (创作不易,请点赞收藏哦~)

### DMA 的定义与基本概念 DMA(Direct Memory Access,直接存储器访问)是一种高效的数据传输机制,在此模式下,硬件可以直接在外设(如磁盘、网络设备等高速设备)内存之间进行数据交换,而无需 CPU 的频繁参与[^4]。这种技术显著减少了 CPU 在大规模数据传输过程中的负担,提升了系统的整体性能。 DMA 技术的核心在于引入了一个专门的硬件模块——DMA 控制器(DMAC),该控制器负责管理外设与内存之间的数据流。当需要执行数据传输时,CPU 只需向 DMAC 发送指令并指定源地址、目标地址以及传输字节数即可。随后,DMAC 将接管总线控制权,并完成实际的数据搬运任务[^1]。 --- ### DMA 的工作原理 #### 总体流程 DMA 数据传输的过程可以分为以下几个阶段: 1. **初始化阶段** 当应用程序请求启动一次 I/O 操作时,操作系统会配置 DMAC 并提供必要的参数,例如起始地址、结束地址传输长度。这些信息被加载到 DMAC 中以便后续操作[^3]。 2. **申请总线控制权** 在准备就绪之后,DMAC 向系统总线发出请求信号以获得对其的独占权限。一旦成功获取总线使用权,则进入正式的数据传送环节[^1]。 3. **数据传输阶段** 此期间由 DMAC 负责协调内外部资源间的交互动作,具体表现为按照预设规则逐位或者成块地移动资料包至目的地位置处[^4]。 4. **终止阶段** 完成了预定数量的信息传递后,DMAC 自动释放所占用的一切通道连接,并通知主机程序本次事务已圆满结束[^3]。 以上各步均体现了 DMA 方式的自动化程度较高这一特性,同时也反映了其相较于传统方法具备更高效率的原因所在。 --- ### DMA 的应用场景 由于 DMA 提供了一种快速可靠的方式来实现大容量数据集的迁移服务,因此广泛应用于现代计算环境中多个领域当中: - **硬盘驱动器接口**: SATA NVMe 协议都支持利用 DMA 来加速文件读写速度; - **图形卡渲染引擎**: GPU 使用纹理映射单元 (TMU) 结合 AGP 或 PCIe 链路来进行图像帧缓冲区更新; - **音频子系统**: 声卡依赖于周期性的采样率同步机制配合 DMA 实现流畅播放体验; - **网络通信设施**: NIC(Network Interface Card) 设备借助环形描述符表结构组织批量报文收发活动[^2]。 通过上述实例可以看出,凡是涉及到连续性高强度输入输出需求的地方都可以考虑采用 DMA 解决方案来优化资源配置策略达到最佳效能表现目的。 --- ```python # Python 示例:模拟简单的 DMA 过程 class DMAController: def __init__(self): self.source_address = None self.destination_address = None self.transfer_size = 0 def configure(self, src_addr, dest_addr, size): """设置传输参数""" self.source_address = src_addr self.destination_address = dest_addr self.transfer_size = size def start_transfer(self): """开始数据传输""" data_buffer = [] for i in range(self.transfer_size): byte_data = read_memory(self.source_address + i) write_memory(self.destination_address + i, byte_data) data_buffer.append(byte_data) return data_buffer def read_memory(address): # 模拟从内存中读取单个字节的操作 pass def write_memory(address, value): # 模拟将单个字节写入内存的操作 pass if __name__ == "__main__": dma = DMAController() dma.configure(0x1000, 0x2000, 1024) # 设置源地址、目标地址大小 result = dma.start_transfer() # 执行传输 ``` --- ###
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值