1.9 事务顺序
1.9.1 生产者/使用者模型
生产者/使用者模型可能是两台有请求能力的设备用来相互通信的常用方法。
1 一个网络适配器开始通过网络接收压缩的视频数据流,并执行一系列存储器写事务,将这些压缩的视频数据流存入存储器的数据缓冲区中。
2 生产者将数据存入存储器之后,它就执行一次存储器写事务,在某一存储器单元中设置一个标志,表示数据已经准备好,等待处理。
3 使用者定期对标志单元执行存储器读,以便查看是否有数据要处理。
4 当发现生产者已设置标志时,它执行一个存储器写清除标志,然后执行一次突发存储器读事务,从存储器的数据缓冲区中读取压缩的数据。
5 当使用者使用完数据后,它将完成状态写入状况单元。然后,它重新开始定期地读取标志单元,以确定何时需要处理更多的数据。
6 与此同时,生产者也定期地读取状况单元,查看其他请求者是否已经完成数据处理、在生产者读取状况并发现使用者已经完成数据处理时,生产者接着执行一个存储器写来清楚状况单元。
7只要生产者还有数据要处理,此过程便重复。
1.9.2 真正的PCIe顺序规则
真正的PCIe顺序规则可以概述为下面4条简单的规则:
1. PCIe要求具有相同TC分配的事务按照强顺序通过结构。因为分配了同一TC值的所有事务映射到一个给定的VC,因此这一规则也同样适用于每个VC内的事务。
2. 不同TC分配的事物之间不存在顺序关系。
3. 顺序规则同样适用于所有类型的事务:存储、IO、配置和消息。
4. 在有限的情况下,设置了“灵活的顺序”属性比特的事务能排在其他具有相同TC值的事务之前。
这些基本规则可以保证事务总是按照软件计划的顺序完成。然而,这些规则非常保守,并且无法提供最佳的性能。在这种情况下,为了提高性能,可以应用更冒险的规则。
1.9.3 灵活的顺序
PCIe支持PCI-X引入的灵活的顺序机制,但PCIe引入了一些变化。PCIe环境下灵活的顺序概念允许请求者和完成者之间路径上的交换器,将刚收到的一些事务重新排在其他先前已入队的事务之前。
支持生产者/使用者模型的顺序规则可能导致事务阻塞,事实上阻塞的事务与任何生产者/使用者事务序列无关。因此在某些情况下,设置了灵活的顺序属性比特的事务能重新排在其他事务之前。
如果设备驱动器允许,设备就可以设置灵活的顺序比特。
1.9.4 RO对存储器写和消息的影响
存储器写和消息事务都被当作报告操作,两者被接收到同一报告缓冲区,两者服从相同的顺序要求。当设置了RO比特时,交换器处理这些事务的步骤如下:
允许交换器将刚报告的存储器写事务重新排在之前的报告存储器写事务或消息事务之前。同样,刚报告的消息事务也可以排在之前的报告存储器写或消息事务之前。交换器也必须不修改RO比特的转发事务。
允许根联合体将刚报告的写事务及时地排在早先接收的其他写事务之前。同样,在接收写请求时,要求根联合体将数据有效载荷写入系统存储器内指定的地址单元,但允许以任意地址顺序将每个字节写入存储器。