基于异常处理的事务存储访问机制的实现方法及所用系统 【技术领域】
本发明涉及事务存储访问机制的实现,所涉及的实现方法采用异常处理的机制,通过软件和硬件的协同配合,完成事务存储访问;属于计算机系统软件设计领域。
背景技术
事务存储访问机制是为了解决共享存储式多处理器系统中的存储同步问题而提出的。共享存储式多处理器系统中包含n(n>1)个处理器单元,它们可以各自执行不同的指令代码,对同一块存储空间发出读写请求。如图1所示,其中包含有n个处理器(处理器101-处理器103),并通过一条总线(或片上网络)(总线或片上网络104)将处理器连接起来。多个处理器可以共同访问同一个共享存储空间(存储单元105)。在这种结构中,多个处理器可以并行执行多段程序,运行多条指令流,与单处理器系统结构相比,其应用程序的并行性得到利用、系统性能得到提升。
共享存储式多处理器系统中,多个处理器分别运行不同的程序代码,不同的指令流,逻辑上对存储器访问是并行共享的。而系统中一条总线(或片上网络),一个共享存储器决定了物理上存储器访问是串行的。存储同步问题由此矛盾衍生而出。当不同处理器对同一块地址空间同时进行存储访问时,实际执行顺序的不同会造成程序运行结果的不同。
为了解决共享存储式多处理器系统结构中的同步问题,程序员在编写相应应用程序时,需要采用同步自旋锁或同步阻塞锁等手段保证多处理器访存顺序,协调处理器运行。软件同步锁的方法解决同步问题存在下列缺陷:
程序可读性不强。
程序编写困难,软件开发周期加长。
同步锁本身没有优先级之分,不利于大型程序的扩展。
避免死锁的算法一般复杂,而且开销大。
为了弥补同步锁方法的缺陷,事务存储访问机制由剑桥研究所的Herlihy和马萨诸塞大学的Moss最早提出。事务指某一指令段,每个在处理器上运行的事务都拥有各自的虚拟地址空间,其访存是互斥的。该机制使得程序员在编写程序时,将不同的原子指令段中访问的存储空间当作不同空间对待,而一致性由该机制本身保证,最终提高了程序的可读性。同时由于事务含有虚拟地址空间,可以在多处理器上并行执行,不需要互相等待,系统性能得到了提高。
事务一般分为事务开始、事务执行和事务提交三个阶段,事务开始和事务提交一般以特殊的指令代码加以区分。
事务存储访问机制实现的主要手段有:软件实现(STM:Software?TransactionalMemory)、硬件实现(HTM:Hardware?Transactional?Memory)、混合实现(HyTM:HybridTransactional?Memory)。尽管各种实现策略不尽相同,但其所达到的目标是相同的。即实现事务的以下三个特点:
原子性(atomicity):将需要原子性执行的指令段封装成一个事务,事务与事务之间需要互斥执行,也就是要保证事务的原子性。
隔离性(isolation):不同事务之间要相互隔离,当对同一片地址空间进行读写操作,也就是产生冲突时,需要由硬件或软件进行地址空间的?;?。
一致性(consistency):最后运行的结果不会由于事务运行先后顺序的改变而改变。
由软件实现的事务性存储访问机制侧重于软件程序的结构封装,通过软件抽象实现事务,有更好的结构扩展性,但不会提升多处理器系统效率,因此实际应用中一般会考虑由硬件实现一部分事务处理功能。而由硬件实现或混合实现的事务性存储访问机制侧重于事务缓冲区的构建,以硬件代替软件复杂度,提升了多处理器系统效率。但这两种实现方式的不足之处在于它们无法动态申请硬件缓存空间,无法解决事务的缓冲溢出问题。实际应用中对于此类问题的一般解决方案是当硬件事务存储发生溢出时,重启该事务,转而寻求软件进行事务机制的实现。由于在事务开始前无法判断是否会发生溢出,每次缓存溢出的事务处理都需要经过硬件和软件的重复执行,因此降低了多处理器系统性能。
【发明内容】
本发明要解决的技术问题是提供一种共享存储式多处理器系统以及利用上述系统进行的基于异常处理的事务存储机制实现方法,解决事务存储实现时的缓存溢出问题。
为了解决以上问题,本发明提供了一种共享存储式多处理器系统,该系统包括n个处理器(n>1),还包括总线(或片上网络)和存储器,总线(或片上网络)的一端与每个处理器相连、总线(或片上网络)的另一端与存储器相连;在每个处理器内分别设置一个事务读写缓存和一个事务属性缓存;在处理器内设置与每个处理器相一一对应的处理器局部缓存。
作为本发明的共享存储式多处理器系统的改进:事务属性缓存用于保存事务顺序编号、通用寄存器数据、处理器状态和事务起始时指令地址;事务读写缓存用于保存事务读写操作中涉及到的地址以及写操作中涉及到地数据。
本发明还同时提供了利用上述共享存储式多处理器系统进行的基于异常处理的事务存储机制实现方法,设置5种异?;?,分别为:事务初始异?;?、事务满异?;?、事务读写异?;?、事务提交异?;坪褪挛裰仄粢斐;?;
事务初始异?;莆迪质挛窨际钡娜碛布?,进行事务处理的数据结构初始化,以及事务中保存读写记录的双向链表的空间分配和初始化;
事务满异?;莆迪质挛裰葱惺钡男槟獯娲?;当识别到事务满异常后,将事务读写缓存中的数据拷贝到处理器局部缓存中,以数据结构的形式记录,之后清空硬件事务读写缓存;
事务读写异?;莆迪质挛裰葱惺钡男槟獯娲?;当识别到事务读写异常后,将该读写操作中涉及的地址信息与事务读写记录的双向链表中的记录进行比较;若匹配,则以事务读写记录的双向链表中的数据为准进行读写操作;若不匹配,则从主存储器中读取数据,更新事务读写缓存。
事务提交异?;莆迪质挛裉峤灰约笆挛癯逋患觳?;当识别到事务提交异常后,将事务读写缓存中未满的数据信息拷贝入处理器局部缓存,用事务读写记录的双向链表的数据结构来表示;此时检测是否发生事务读写地址冲突,并在发生冲突时对其他处理器产生事务重启异常;
事务重启异?;莆苑⑸逋缓蟮某逋唤饩鼋斜V?;当识别到事务重启异常后,清空处理器局部缓存中的数据结构,通过指令或地址的赋值启动事务的硬件自动恢复。
本发明将硬件实现和软件实现进行结合,通过五种异?;频纳杓?,实现了事务存储访问机制。这五种异?;品直鹞菏挛癯跏家斐?、事务满异常、事务读写异常、事务提交异常和事务重启异常。实现的步骤为:步骤1:添加事务用硬件缓存;步骤2:添加事务用软件缓存;步骤3:实现事务初始异?;?;步骤4:实现事务满异?;?;步骤5:实现事务读写异?;?;步骤6:实现事务提交异?;?;步骤7:实现事务重启异?;?。事务初始异常实现了事务开始时的软硬件协调,事务满异常和读写异常实现了事务执行时的虚拟存储,事务提交异常实现了事务提交以及事务冲突检测,事务重启异常对发生冲突后的冲突解决进行保证。
在本发明中,硬件缓存分事务属性缓存和事务读写缓存,都可以通过高速缓存、内部寄存器或地址配值的方式实现。软件缓存指处理器局部缓存,实现方法是在系统能够软件存储管理的程序代码中实现有关局部缓存的声明和操作函数;每个缓存对所有处理器开放读权限,仅对相应处理器开放写权限;权限由系统软件维护。
与一般的事务存储访问机制的实现相比,采用本发明实现事务存储访问,能够解决硬件缓存溢出问题,对于发生溢出的数据能够通过软件的异常处理进行保存。同时结合了软件实现和硬件实现事务存储的优点,程序可扩展性强,降低了多处理器的系统开销。
综上所述,本发明是一种基于异常处理的事务存储访问机制的实现方法。该方法适用于系统软件设计比较灵活的多处理器核系统,采用添加事务初始异常、事务满异常、事务读写异常、事务提交异常和事务重启异常的机制,通过软件和硬件的系统配合,完成事务存储设计,其优势在于结合了硬件实现事务存储和软件实现事务存储的各自优点,解决硬件实现的缓存溢出问题,提高系统性能。
【附图说明】
下面结合附图对本发明的具体实施方式作进一步详细说明。
图1是现有的共享存储式多处理器系统结构示意图;
图2为本发明的共享存储式多处理器系统结构示意图;
图3是本发明的基于异常处理的事务存储机制实现方法的流程示意图。
【具体实施方式】
图2给出了本发明所采用的共享存储式多处理器系统,包括n(n=3)个处理器,即处理器a201、处理器b202和处理器c203。每个处理器包含一个事务读写缓存和事务属性缓存,即处理器a201包含事务读写缓存204和事务属性缓存207;处理器a202包含事务读写缓存205和事务属性缓存208;处理器a203包含事务读写缓存206和事务属性缓存209。系统还包括总线(或片上网络)210和一个共享存储器,同时在共享存储器中分别划分出处理器a,b,c的局部缓存211,212,213。
本系统可以很容易的扩展为包含n个处理器的共享存储式多处理器系统。本发明也同样适用于这样的系统。在每个处理器上实现事务读写缓存和事物属性缓存,同时在共享存储器中分别划出对应处理器的局部缓存空间,即可实现本发明。
本发明基于五种异?;频氖迪?,达到解决缓存溢出,实现事务存储的发明目的。本发明中将其统称为事务异常。事务异常包括:事务初始异常、事务满异常、事务读写异常、事务提交异常以及事务重启异常。为实现五种事务异?;?,首先须进行硬件缓存和软件缓存的设计;其实现步骤如下:
步骤1:添加事务用硬件缓存
a)添加事务属性缓存(207-209)(TPB,Transaction?Property?Buffer)。即在处理器a201内添加了事务属性缓存207,在处理器b202内添加了事务属性缓存208,在处理器c203内添加了事务属性缓存209。
在硬件处理器内部,通过片内实现高速缓存、内部寄存器或者特殊地址配值的方式,添加事务属性缓存的硬件????;捍嬷行枰4鎀M_num,reg_data,pe_sta,start_pc四部分数据,如表1所示。
表1事务属性缓存中记录的数据
??TM_num??事务顺序编号??reg_data??通用寄存器数据??pe_stat??处理器状态??start_pc??事务起始时指令地址
b)添加事务读写缓存(204-206)(TRWB,Transaction?R/W?Buffer)。即在处理器a201内添加了事务读写缓存204,在处理器b202内添加了事务读写缓存205,在处理器c203内添加了事务读写缓存206。该缓存同样通过高速缓存cache,内部寄存器或者地址配值的方式实现。其包含多条事务读写操作的纪录。添加时需要根据面向的平台和具体的应用设定该缓存可以容纳记录条目的多少。每一条记录包含的数据信息如表2所示
表2事务读写缓存中一条记录包含的数据
?laddr??事务读操作中涉及到的读地址?saddr??事务写操作中涉及到的写地址?data??事务写操作中涉及到的写数据
步骤2:添加事务用软件缓存
在进行事务管理的系统软件函数中,添加维护事务用软件缓存。针对系统中的每个处理器,各分配一个处理器局部缓存(211-213)。即在存储器内分别设置针对处理器a201的a的处理器局部缓存211、针对处理器b202的b的处理器局部缓存212、针对处理器c203的c的处理器局部缓存213。方法是在系统软件存储管理的程序代码中,实现有关该局部缓存的声明和操作函数。比如在操作系统得程序代码中,添加下列数据结构表示:
??char*PrivateMem_Pe1;??char*PrivateMem_Pe2;??...??char*PviateMem_Pen;
维护该局部缓存所实现的操作函数,作用在于:每个缓存对所有处理器开放读权限,但仅对相应处理器开放写权限。例如PrivateMem_Pe2种的数据可以被所有处理器读,但仅能被2号处理器(即处理器b202)执行写操作。权限由系统软件维护。
以下内容如图3所示。
步骤3:实现事务初始异?;?br>
事务初始异常发生在事务初始时,机制分为硬件实现部分和软件实现部分。硬件实现部分的实现步骤如下:
i.(301)在处理器流水线的译码级添加事务初始指令的译码单元。当处理器识别到事务初始指令时,产生事务使能信号。
ii.(302)将事务使能信号送入总线(或片上网络)上的事务仲裁???,事务仲裁??楦荽砥鞑挛袷鼓苄藕诺南群笏承?,为每个事务分配一个编号TM_num,并将其记录在事务属性缓存中。以Ti,Tj来表示第i个和第j个事务在系统中出现的先后时间点,则
iii.(303)在事务属性缓存中记录通用寄存器数据reg_data,处理器状态pe_stat以及事务起始时指令地址start_pc,也就是事务起始时的程序上下文。
iv.(304)产生事务初始异常信号,将该处理器的指令指针跳转到事务初始异常处理的向量入口。
产生事务初始异常后由软件实现后续部分。软件实现部分的实现步骤如下:
i.(305)进行事务处理的数据结构初始化,主要指TMB数据结构的初始化。TMB结构的声明如下:
??struct?TMB??{??????int?tm_num;??????RW_REC*head;??}
其中tm_num是该事务的顺序编号,RW_REC是事务中保存读写记录的双向链表。
ii.(306)TMB结构中的RW_REC为一个双向链表,用来存储事务读写记录。在本步骤中对RW_REC进行空间分配和初始化。其声明如下:
??struct?RW_REC??{??????struct?RW_REC*prev;??????struct?RW_REC*next;??????int?rw_flag;??????int?addr;??????int?data;??}
其中prev以及next为双向链表的前后指针。rw_flag用来区分该记录记录了读操作或是写操作。addr记录了该读操作或写操作的地址。data记录了写操作时写操作的数据。
iii.异常返回。
由软件实现的上述两个数据结构,其空间在处理器局部缓存中分配。
步骤4:实现事务满异?;?br>
事务满异常发生在事务执行过程中,其硬件实现步骤为:
i.(307-311)事务执行中每当处理器流水线的译码级识别到对存储器的读写指令时,将读地址信息laddr,写地址信息saddr和写数据信息data记录在事务读写缓存中。
具体如下:
(307)识别到事务运行时,事务中的读写指令;
(308)判别处理器(例如处理器a201)内部事务读写缓存(例如事务读写缓存204)状态,判别为满或者未满;
ii.判断事务读写缓存是否未满,若满,则产生事务满异常(309),程序跳转到事务满异常的向量入口。
识别到事务满异常后,软件实现部分将事务读写缓存中的数据拷贝到处理器局部缓存中(310),以RW_REC数据结构的形式记录,之后清空硬件的事务读写缓存(311),返回异常。
具体如下:
(309)若满,产生事务满异常;
(310)将处理器(例如处理器a201)内部事务读写缓存(例如事务读写缓存204)中的数据,拷贝到处理器(例如处理器a201)对应的局部缓存(例如局部缓存211)中;
(311)清空事务读写缓存(例如事务读写缓存204)。
步骤5:实现事务读写异?;?br>
事务读写异常也发生在事务执行过程中,其硬件实现步骤为:
i.(312,313,315)将事务执行读写操作中涉及的地址信息taddr与事务读写缓存中记录的地址进行比较,若匹配,则以事务读写缓存中的记录为准进行读写操作。
具体如下:
(312)判断事务读写指令中的读写地址是否与事务读写缓存(例如事务读写缓存204)中的地址相匹配。
(313)若不匹配,产生事务读写异常,转由软件异常处理程序处理。
(315)若匹配,仅在事务读写缓存(例如事务读写缓存204)中修改读写数据,保存读写操作。
ii.若不匹配,产生事务读写异常,跳转到事务读写异常的向量入口。
识别到事务读写异常后,软件实现部分的步骤如下:
i.(314,316,317)将该读写操作中涉及的地址信息taddr与RW_REC中的记录进行比较,若匹配,则以RW_REC中的数据为准进行读写操作。若不匹配,则从主存储器中读取数据,更新硬件事务读写缓存。具体如下:
(314)将该读写指令中包含的读写地址与处理器(例如处理器a201)对应的局部缓存(例如局部缓存211)中保存的地址进行匹配查找。
(316)若匹配,仅在局部缓存(例如局部缓存211)中修改读写数据,保存读写操作。
(317)若不匹配,返回异常。
ii.(317)若从未匹配状态返回异常,则从存储器中读出读写数据,更新事务读写缓存(例如事务读写缓存204)。之后运行后续事务指令(318)。
若从匹配状态返回异常,则不做其他操作,直接运行后续事务指令(318)。
步骤6:实现事务提交异?;?br>
事务提交异常发生在事务的提交过程中,其硬件实现步骤为:
i.(319)在处理器流水线的译码级添加事务提交指令的译码单元。当处理器识别到事务提交指令时,产生事务提交信号。
ii.(320)产生事务提交异常,跳转到事务提交异常处理的向量入口。
软件识别到事务提交异常后,进入事务提交异常处理程序,软件部分检测是否发生事务读写地址冲突,并在发生冲突时对其他处理器产生事务重启异常。其实现步骤如下:
i.(321)将事务读写缓存中未满的数据信息拷贝入处理器局部缓存,用RW_REC数据结构来表示。
ii.检测其它处理器上是否仍在运行事务,判断系统中是否存在TM_num更小的事务(322)。若存在,则等待TM_num较小的事务的执行完毕(323)。
iii.若不存在或等待结束,根据RW_REC中的信息对系统中运行的所有事务进行检测(324)。若产生冲突,则通过软件向对应冲突处理器产生事务重启异常(325)(处理器不会对自己产生事务重启异常)。
iv.根据本事务中需要提交的访存信息对存储器进行更新(326)。初始化处理器局部缓存,使其可以被重用。
v.结束事务异常处理流程(327):初始化事务读写缓存以及事务属性缓存,使其可以被重用,处理器进入普通指令流处理状态。
步骤7:实现事务重启异?;?br>
系统中某处理器的事务重启异常由系统中其它处理器引发,本发明中将处理事务重启异常的处理器称作本地处理器,将引发事务重启异常的处理器称作远程处理器。事务重启异常在本发明中可以发生在本地处理器运行事务中的各个阶段。接收到该异常后,本地处理器跳转到事务重启异常的向量入口,异常处理程序实现的步骤如下:
i.清空处理器局部缓存中的各项数据结构。
ii.通过指令或地址的赋值启动事务的硬件自动恢复。
事务的硬件自动恢复包含以下几个步骤:
i.将事务属性缓存中的通用寄存器数据reg_data以及处理器状态pe_stat读出,恢复事务起始时系统的运行状态。
ii.根据事务属性缓存中的事务起始时指令地址start_pc恢复程序指令指针,使其指向事务起始地址。
图3是结合了以上几个异常处理的事务存储机制实现流程示意图。处理五种异?;频拇シ⑹笨碳按シ⑻跫绫?所示。
表3事务异常触发时刻及触发条件表
??异常名称??触发时刻??触发条件??事务初始异常??事务开始时??硬件识别到开始指令??事务满异常??事务运行时??事务读写缓冲区满??事务读写异常??事务运行时??事务读写操作??事务提交异常??事务提交时??硬件识别到提交指令??事务重启异常??事务从开始到提交的整个??过程??其它事务检测到冲突
最后,还需要注意的是,以上列举的仅是本发明的一个具体实施例。显然,本发明不限于以上实施例,还可以有许多变形。本领域的普通技术人员能从本发明公开的内容直接导出或联想到的所有变形,均应认为是本发明的?;し段?。