关 闭

新闻中心

EEPW首页>工控自动化>设计应用> 事务存储结构的实现

事务存储结构的实现

作者: 时间:2012-06-04 来源:网络 收藏

(2) 读00地址(十六进制地址)中的数据到寄存器r1中,00地址对应数据块的读(R)标志位置1表示此数据被读。

本文引用地址://m.amcfsurvey.com/article/202295.htm

(3) 将寄存器r2中数据(这里假设为56)存入c0地址中,由于c0地址中存在原始数据34,将c0地址和该原始数据一起根据LogBase中的日志入口地址存入日志中,并将LogPtr指针后移,指向用于存放下个数据的地址位,同时将c0地址对应块的写(W)标志位置1,代表一次写操作的完成,其他的状态不变。

(4) 读取40地址中数据到寄存器r3中,然后r3中数据加1,并将执行后的r3数据存回40地址中,该操作对40地址对应块执行了一次读操作和一次写操作,将读(R)和写(W)标志位置1,然后将原始40地址对应块中数据存入日志中,存入LogPtr指向的地址中,同时将LogPtr指针后移。

(5) 事务提交后状态——将与本事务相关的各个数据块对应读写标志位清0,将LogPtr置位到LogBase,TMcount置0。(本例仅针对单事务执行,如果是嵌套事务的执行,LogTM结构会更加复杂,具体支持嵌套事务的LogTM实现,请参考[2])

(6) 事务回滚后状态——事务在执行或提交过程中如果出错需要回滚,则将日志中记录的原始数据按照地址映射关系重新加载到对应cache数据块中,同时将各个块对应读写标志位清0,LogPtr重置并且TMcount置0。

1.jpg

图 4 事务版本管理过程——成功提交和回滚

2.2 冲突管理(Contention Management)

LogTM采用积极的冲突管理模式,而冲突管理中的一个重要概念目录,就是在内存中开辟的一片用来记录共享数据索引和相关状态信息的区域,也称为目录表。此冲突管理以目录为桥梁,通过目录的分析和消息转发机制来完成多处理机间的冲突检测。具体的实现步骤概括起来为:①请求操作的处理机发出一致性请求到目录;②目录响应请求并可能将请求转发到其他一个或多个处理机上;③每个响应请求的处理机检查自身状态看是否发生冲突;④每个响应请求的处理机给出应答信号,包括冲突应答(nack)和非冲突应答(ack);⑤发出请求的处理机解决冲突。

事务发生冲突后的替换行为须依据目录中有效的MOESI状态(MOESI 状态:Modified(M),Owned(O), Exclusive(E),Shared(S) or Invalidate(I))而定。

下面结合图5中的冲突检测实例对冲突管理的具体行为进行说明。

1.jpg

图 5 LogTM冲突检测实例

(1)事务开始——处理机P开始执行事务,TMcount增1;此时仅目录中存放的cache块信息有效。

(2)处理机P向目录请求数据信息——步骤①:P在自身的cache中找不到某数据,马上发送独占请求(GETX)到目录。步骤②:目录收到请求后根据相应数据的索引找到“老”版本数据传给处理机P,当“老”版本数据达到P时,P将此数据更为“新”版本数据同时将本机此数据块对应读/写标志位置1。步骤③:P接受数据完毕后,发送应答信号给目录表示已经成功接受数据。与此同时目录中的状态信息为M@P(Modified by P),表示此数据正在被处理机P更改。

(3)检测到事务冲突——步骤①:处理机Q发出请求某共享数据的信号(GETS)给目录。步骤②:由于目录中此数据的状态为M@P,目录则根据请求转发给处理机P。步骤③:P接受到请求后检查自己的状态,由于P中相应数据块的写标志位已置,表明P正在修改此数据,不能满足Q的请求,发生冲突。这时处理机P直接发送冲突信号给Q,当Q接受到冲突信号后进行冲突处理。步骤④:处理机Q同时将冲突信号发送给目录,表明此次请求失败。

(4)事务溢出的处理——处理机P通知目录要将修改后的数据存到内存中(目前,内存中存在的是对应数据修改前的“脏”数据)。步骤①:P发出PUTX请求给目录。步骤②:目录认可后发送应答信号给P,通知P可以发送。步骤③:P接收到此信号后将数据写回内存(WB_XACT)同时将溢出位置1(表明此数据已经不在cache中)。这样在写回操作完成后,P中相关数据块信息已置为无效,但是目录中仍然保持着原先P持有数据时的状态,内存中对应区域已为修改后的“干净”数据,目录中该数据相应的状态也由“老”变成了“新”,表明内存中此数据已为更新后的数据。

(5)溢出数据的事务冲突检测——步骤①:处理机Q重新发出请求数据信号给目录,由于目录中的状态还没有改变。步骤②:目录根据当前状态再次将请求转发给处理机P,而此时Q请求的数据块已经写回内存中去了,并不在P的cache中,P收到请求信号后检查到自身的溢出位已经置位,它认为此数据可能由于某种原因不在cache中,但是仍然与它相关。比如:由于此数据块大小大于cache规定块大小而不能放下,但仍需操作。步骤③:P发出冲突信号(NACK)给Q,但是这个冲突并不是真正意义上的冲突,而是P假设的冲突。步骤④:Q收到冲突信号后处理冲突同时发送信号给目录,表明此次请求再次失败。

(6)目录中数据状态的懒惰(Lazy)更新——处理机P提交事务后将TMcount减1,将对应cache块的读/写标志位和溢出标志位清零,但此时目录中的状态仍然为M@P。步骤①:此时一旦处理机Q重新发出请求此数据信号。步骤②:该信号会再一次通过目录转发给处理机P,但此时P的溢出位已经被清空。步骤③:P通过发送清除信息(CLEAN)给目录通知目录不必再转发请求信息,目录中的数据信息有效可以直接发送给请求的处理机Q。步骤④:目录根据索引关系找到相关数据发送给处理机Q。步骤⑤:Q收到数据后进行处理同时将应答信号发送给目录,表明请求成功同时将目录对应数据项状态置E@Q,表示此时处理机Q独占此数据资源。



关键词:存储结构

评论


技术专区

关闭