专利名称:多处理器系统以及其中的排他控制方法
技术领域:
本发明涉及多处理器系统以及其中的排他控制方法,更具体地,涉及在执行排他控制之前获得锁并在执行排他控制之后释放锁的多处理器系统以及其中的排他控制方法。
背景技术:
以往,作为多线程程序设计的执行环境,需要MESI(ModifiedExclusive Shared Invalid,修改、排他、共享、无效)那样的高速缓存一致性协议和支持不可分(原子)传送的总线。但是,安装有它们的CPU(Central Processing Unit,中央处理单元)以及总线将是高成本的。
目前,作为低成本的CPU,也根据Linux支持的必要性而具有TLB(Translation Look-aside Buffer,转换后援缓冲器)。在使用了这种CPU的情况下,只要安装支持原子传送的总线,就能够构筑多处理器系统。在这种情况下,即使没有总线窥探(スヌ一プ)的硬件支持,如果利用与NUMA(Non-Uniform Memory Access非均匀存储器访问)相同的OS(Operating System操作系统),则也可以使用TLB的支持来维持高速缓存一致性。
在此,之所以需要支持原子传送的总线,是为了可以进行CPU之间的排他控制。例如为了排他地改写各CPU的TLB,需要对锁变量原子地进行读出修改写入。但是,准备单处理器而设计的、低成本的嵌入式处理器及其总线规则,并不支持原子读出修改写入。
下面,参照图5说明原子读出修改写入的必要性。其中,将锁变量lock分配到了存储器上。
首先,CPU从存储器读出锁变量lock(S1),判断是否lock=1(S2)。只要lock=1,即锁变量成为锁定状态(在S2为是),CPU就反复读出锁变量lock(S1)。另一方面,在lock=0、即锁变量为非锁定状态的情况下(在S2为否),CPU改写为lock=1,由此获得排他控制所需要的锁(S3)。在获得锁之后,CPU执行规定的排他控制(S4)。在完成排他控制之后,CPU改写为lock=0,由此释放锁(S5)。
但是,在从读出lock=0到改写为lock=1的期间,如果其他的CPU读出lock=0,则有可能误认为能够获得锁。为了防止这种情况,必须原子地执行上述的锁变量的读出操作S1和写入操作S3。
此外,用于使CPU执行上述的原子读出修改写入的程序,由于使用在原子传送中所需要的专用命令,所以不用C那样的高级语言,而必须用汇编语言来描述。
美国专利第5175829号说明书(以下记作专利文献1)公开了将原子传送组装到CPU以及局部总线内的装置。这种多处理器系统,为了消减总线带宽,而通过采用共享总线方式并使用MESI协议而使得不能获得锁的CPU不重复无用的读访问。
美国专利第5175829号说明书(以下记作专利文献2)公开了将用于管理锁的交换寄存器内置于CPU内的装置。该装置用存储在存储器中的锁变量时刻对存储在交换寄存器中的锁变量进行交换更新,并对该交换寄存器进行用于获得锁的读访问。该装置也是以高成本并且复杂的原子读出修改写入功能的存在为前提。
美国专利第5666515号说明书(以下记作专利文献3)公开了通过发送重试信号而加锁、减轻了总线带宽的饱和的装置。该装置也是以高成本并且复杂的原子读出修改写入功能的存在为前提。
专利文献1美国专利第5175829号说明书专利文献2美国专利第5535365号说明书专利文献3美国专利第5666515号说明书
发明内容
本发明的目的在于提供一种能够用简单的构成实现与具有锁变量的原子读出修改写入功能的高成本的系统同样的功能的多处理器系统以及其中的排他控制方法。
本发明的多处理器系统具备多个处理器和锁寄存器。处理器的各个在执行排他控制之前,为了获得锁而断言读出信号,并且在执行排他控制之后,为了释放锁而断言写入信号。锁寄存器与多个处理器连接。锁寄存器包括保存单元、锁变量输出单元和锁变量输入单元。保存单元保存锁定状态或者非锁定状态的第1锁变量。锁变量输出单元在处理器的1个断言读出信号时,输出此前保存在保存单元中的第1锁变量。锁变量输入单元在处理器的1个断言读出信号时,将锁定状态的第1锁变量设定到保存单元,并且在处理器的1个断言写入信号时,将非锁定状态的第1锁变量设定到保存单元。
在上述多处理器系统中,在某一处理器断言读出信号时,从锁寄存器读出第1锁变量,并且将锁定状态的第1锁变量写入到锁寄存器。在所读出的第1锁变量为非锁定状态的情况下,该处理器能够获得锁。由于读出第1锁变量并且写入锁定状态的第1锁变量,所以此后即使另一处理器断言读出信号,也会因为从锁寄存器读出锁定状态的第1锁变量,而使该另一处理器不能获得锁。这样,本发明的多处理器系统仅设置锁寄存器,就能够实现与具有锁变量的原子读出修改写入功能的高成本的系统相同的功能。
优选地,锁寄存器进一步包括总线重试单元。总线重试单元在第1锁变量被设定为锁定状态的期间,在处理器的1个断言读出信号时,生成用于提供给处理器的总线重试信号。
在此情况下,由于处理器接收总线重试信号并且由此认识到不可能获得锁,所以能够使其不会随便地断言读出信号。
优选地,多处理器系统进一步具备第1总线、存储器、第2总线。第1总线与多个处理器共同连接。存储器与第1总线连接。第2总线与多个处理器共同连接。锁寄存器连接到第2总线。
在此情况下,在由于某一处理器已获得了锁而另一处理器等待其释放锁时,该另一处理器经由第2总线断言读出信号而从锁寄存器读出第1锁变量,另一方面,获得了锁的处理器经由第1总线访问存储器。因而,不会妨碍从获得了锁的处理器对存储器的访问。
进而优选地,存储器存储1个、或者2个或2个以上的第2锁变量。处理器的各个断言读出信号而从锁寄存器读出第1锁变量,且在所读出的第1锁变量为非锁定状态的情况下,从存储器读出第2锁变量,在所读出的第2锁变量为非锁定状态的情况下,将第2锁变量改写为锁定状态。
在此情况下,处理器首先从锁寄存器读出第1锁变量而获得锁,接着从存储器读出第2锁变量而获得锁。这样,因为分阶段地获得锁,所以能够设定多个锁变量。
此外,本发明的排他控制方法,是具备多个处理器和与多个处理器连接的、保存锁定状态或者非锁定状态的第1锁变量的锁寄存器的多处理器中的排他控制方法,包括在处理器的1个为了获得锁而断言读出信号时,从锁寄存器读出第1锁变量并且将锁定状态的第1锁变量写入到锁寄存器的步骤;在所读出的第1锁变量为非锁定状态的情况下,由该1个处理器执行排他控制的排他控制步骤;以及在执行排他控制之后,在该1个处理器为了释放锁而断言写入信号时,将非锁定状态的第1锁变量写入到锁寄存器的步骤。
在上述排他控制方法中,如果某一处理器断言读出信号,则从锁寄存器读出第1锁变量,并且将锁定状态的第1锁变量写入到锁寄存器。在所读出的第1锁变量为非锁定状态的情况下,该处理器能够获得锁。由于读出第1锁变量并且写入锁定状态的第1锁变量,所以此后即使另一处理器断言读出信号,也会从锁寄存器读出锁定状态的第1锁变量。因而,该另一处理器不能获得锁。这样,本发明的排他控制方法仅设置锁寄存器,就能够实现与具有锁变量的原子读出修改写入功能的高成本的系统相同的功能。
优选地,排他控制方法进一步包括在第1锁变量为锁定状态的期间,在处理器的1个断言读出信号时,生成用于提供给处理器的总线重试信号的步骤。
在此情况下,由于处理器接收总线重试信号并由此认识到不可能获得锁,所以能够使其不会随便地断言读出信号。
优选地,多处理器系统进一步具备存储1个、或者2个或2个以上的第2锁变量的存储器。上述排他控制步骤包括在所读出的第1锁变量为非锁定状态的情况下,从存储器读出第2锁变量的步骤;在所读出的第2锁变量为非锁定状态的情况下,将第2锁变量改写为锁定状态的步骤;以及在将第2锁变量改写为锁定状态之后,执行排他控制的步骤。
在此情况下,处理器首先从锁寄存器读出第1锁变量而获得锁,接着从存储器读出第2锁变量而获得锁。这样,因为分阶段地获得锁,所以能够设定多个锁变量。
具体实施例方式
以下,参照附图详细地说明本发明的实施方式。图中,对于相同或者相当的部分标注相同符号而不重复其说明。
参照图1,本实施方式的多处理器系统10具备CPU11以及12;总线主控器13以及14;交叉总线15以及16;系统存储器17;锁寄存器18。
CPU11以及12、总线主控器13以及14共同连接到交叉总线15。CPU11以及12、总线主控器13以及14还共同连接到另一个交叉总线16。系统存储器17连接到交叉总线15,锁寄存器18连接到交叉总线16。CPU11或者12经由交叉总线15可以访问系统存储器17,经由交叉总线16还可以访问锁寄存器18。总线主控器13或者14经由交叉总线15可以访问系统存储器17,经由交叉总线16还可以访问锁寄存器18。
锁寄存器18是用于管理在排他控制中所需要的锁的寄存器。CPU11或者12在执行排他控制之前断言读出信号而从锁寄存器18获得锁,在执行排他控制之后断言写入信号而释放该锁。锁寄存器18虽然被映射到存储器上,但可以被分配与系统存储器17所不同的地址。
参照图2,锁寄存器18从CPU11或者12接收读出信号READ以及写入信号WRITE,输出读出数据总线信号READ databus以及总线重试信号BUS Retry。锁寄存器18具备延迟触发器(DFF)19以及20;OR电路21;AND电路22以及23;多路复用器24。OR电路21接收读出信号READ和DFF19的输出信号。AND电路22接收OR电路21的输出信号、写入信号WRITE的逻辑反相信号以及复位信号RESET的逻辑反相信号。DFF19与时钟信号CLK同步地锁存AND电路22的输出信号。在读出信号READ是H(逻辑高)电平“1”的情况下,多路复用器24选择输出DFF19的输出信号的输出信号。另一方面,在读出信号READ是L(逻辑低)电平“0”的情况下,多路复用器24选择输出DFF20的输出信号。DFF20与时钟信号CLK同步地锁存多路复用器24的输出信号,作为读出数据总线信号READ databus输出。AND电路23接收读出信号READ以及DFF19的输出信号,生成总线重试信号BUS Retry。
DFF19具有保存锁定状态“1”或者非锁定状态“0”的主锁变量LOCK的功能。OR电路21以及AND电路22具有在CPU11或者12断言读出信号READ时将锁定状态“1”的主锁变量LOCK设定到DFF19中,在CPU11或者12断言写入信号WRITE时将非锁定状态“0”的主锁变量LOCK设定到DFF19中的功能。多路复用器24以及DFF20具有在CPU11或者12断言读出信号READ时,输出此前保存在DFF19中的主锁变量LOCK的功能。AND电路23具有在主锁变量LOCK被设定为锁定状态“1”的期间、在CPU11或者12断言读出信号READ时,生成用于提供给CPU11以及12的总线重试信号BUS Retry的功能。
此外,在系统存储器17中,存储有1个、或者2个或2个以上的子锁变量lock。由于CPU11或者12不具有窥探高速缓存,所以将用于分配子锁变量lock的存储区域设定在非高速缓存区域。
以下,参照图3说明锁寄存器18的动作。
如果复位信号RESET被断言为H电平,则在时钟信号CLK上升的时刻t1,进行锁寄存器18的初始化。具体地,AND电路22与读出信号READ以及写入信号WRITE没有关系,输出L电平的信号,DFF19将之锁存。即,DFF19保存非锁定状态“0”的主锁变量LOCK。
接着,在为了确认1个CPU11或者12是否可以获得锁而将读出信号READ断言为H电平时,AND电路22的输出信号变成H电平。DFF19在时钟信号CLK上升的时刻t2,锁存并输出其H电平的信号。由于DFF19的输出信号被提供给OR电路21,所以在读出信号READ恢复为L电平之后,DFF19还继续锁存H电平的信号,由此保存锁存状态“1”的主锁变量LOCK。
在读出信号READ恢复为L电平时,多路复用器24选择DFF20的输出信号,由于DFF20继续锁存L电平的信号,所以读出数据总线信号READdatabus维持L电平不变。因而,认识到该CPU11或者12可以获得锁。
在认识到可以获得锁之后,即使为了确认其他的CPU12或者11是否能够获得锁而将读出信号READ断言为H电平,由于DFF19的输出信号已变成H电平,AND电路23也将总线重试信号BUS Rrery断言为H电平。因而,认识到该其他的CPU不能获得锁。此外,由于读出信号READ被断言为H电平并且多路复用器24选择DFF19的输出信号,所以在时钟信号CLK上升的时刻t3,DFF20锁存H电平的信号,由此将读出数据总线信号READ databus断言为H电平。
接着,在该CPU11或者12为了释放锁而将写入信号WRITE断言为H电平时,AND电路22的输出信号变成L电平。DFF19在时钟信号CLK上升的时刻t4锁存并输出其L电平信号。由此,主锁变量LOCK被清除为非锁定状态“0”。
其后,在为了再次确认CPU11或者12是否可以获得锁而将读出信号READ断言为H电平时,在时钟信号CLK上升的时刻t5,DFF19与前一次同样地锁存并输出H电平的信号。此时,由于多路复用器24选择L电平的信号,所以DFF20将之锁存并输出。因而,读出数据总线信号READdatabus恢复为L电平,从而认识到CPU11或者12可以获得锁。
以下,参照图4说明使用了该锁寄存器18的多处理器系统10全体的动作。
CPU11或者12从锁寄存器18读出主锁变量LOCK(S11),判断是否LOCK=1,即主锁变量LOCK是否为锁定状态“1”(S12)。在非锁定状态“0”的情况下(在S12为否),CPU11或者12从系统存储器17读出子锁变量lock(S13),判断是否lock=1,即子锁变量lock是否为锁定状态“1”(S14)。在非锁定状态“0”的情况下(在S14为否),CPU11或者12将“1”写入到子锁变量lock,由此获得锁(S15)。在锁的获得之后,CPU11或者12执行规定的排他控制(S16)。排他控制结束后,CPU11或者12将“0”写入到子锁变量lock,由此释放锁(S17)。
如上所述,如果采用本发明的实施方式,则在CPU11或者12断言读出信号READ时,由于从锁寄存器18读出主锁变量LOCK并且立即将锁定状态“1”的主锁变量LOCK写入到锁寄存器18,所以其后,即使另一CPU12或者11断言读出信号LOCK,也会从锁寄存器18读出锁定状态“1”的主锁变量LOCK。因此,另一CPU12或者11不能获得锁。因而,通过仅设置锁寄存器18就能够实现与具有锁变量的原子读出修改写入功能的高成本的多处理器系统相同的功能。
此外,在主锁变量LOCK被设定为锁定状态“1”的期间,如果CPU11或者12断言读出信号READ,则由于总线重试信号BUS Retry生成并且CPU11以及12接收该总线重试信号BUS Retry而认识到不可能获得锁,所以能够使其不会随便地断言读出信号READ。
此外,由于经由专用的交叉总线16进行用于获得或者释放锁的从CPU11或者12对锁寄存器18的访问,所以在由于CPU11或者12获得了锁而另一CPU12或者11等待其释放锁时,另一CPU12或者11经由交叉总线16断言读出信号READ而从锁寄存器18读出主锁变量LOCK,另一方面,获得了锁的CPU11或者12经由交叉总线15访问系统存储器17。因而,不会妨碍从获得了锁的CPU11或者12对系统存储器17的访问。
此外,由于以预先将1个、或者2个或2个以上的子锁变量lock存储在系统存储器17中、CPU11或者12首先从锁寄存器18读出主锁变量LOCK而获得锁、接着从系统存储器17读出子锁变量lock而获得锁的方式分阶段地获得锁,所以能够设定多个锁变量lock。
以上,说明了本发明的实施方式,但上述的实施方式只不过是用于实现本发明的示例。因而,本发明并不限于上述的实施方式,而是可以在不脱离其主旨的范围内适宜对上述的实施方式进行变形。
图1是表示本发明的实施方式的多处理器系统的整体结构的功能方框图;图2是表示图1中的锁寄存器的结构的电路图;图3是表示图2所示的锁寄存器的动作的时序图;图4是表示图1所示的多处理器系统的锁获得动作的流程图;以及图5是表示以往的多处理器的锁获得动作的流程图。
符号说明10多处理器系统11、12CPU15、16交叉总线17系统存储器18锁寄存器LOCK主锁变量lock子锁变量READ读出信号WRITE写入信号BUS Retry总线重试信号READ databus读出数据总线信号
权利要求
1.一种多处理器系统,其特征在于,具备多个处理器,其各个在执行排他控制之前,为了获得锁而断言读出信号,并且在执行排他控制之后,为了释放锁而断言写入信号;以及锁寄存器,其与上述多个处理器连接;其中,上述锁寄存器包括保存单元,其保存锁定状态或者非锁定状态的第1锁变量;锁变量输出单元,其在上述处理器的1个断言读出信号时,输出此前保存在上述保存单元中的第1锁变量;以及锁变量输入单元,其在上述处理器的1个断言读出信号时,将锁定状态的第1锁变量设定到上述保存单元,并且在上述处理器的1个断言写入信号时,将非锁定状态的第1锁变量设定到上述保存单元。
2.如权利要求1所述的多处理器系统,其特征在于,上述锁寄存器进一步包括总线重试单元,其在上述第1锁变量被设定为锁定状态的期间,在上述处理器的1个断言读出信号时,生成用于提供给上述处理器的总线重试信号。
3.如权利要求1所述的多处理器系统,其特征在于,进一步具备与上述多个处理器共同连接的第1总线;与上述第1总线连接的存储器;以及与上述多个处理器共同连接的第2总线;其中,上述锁寄存器连接到上述第2总线。
4.如权利要求1所述的多处理器系统,其特征在于,进一步具备存储1个、或者2个或2个以上的第2锁变量的存储器;上述处理器的各个断言读出信号而从上述锁寄存器读出第1锁变量,且在所读出的第1锁变量为非锁定状态的情况下,从上述存储器读出第2锁变量,在所读出的第2锁变量为非锁定状态的情况下,将第2锁变量改写为锁定状态。
5.一种多处理器系统中的排他控制方法,是具备多个处理器和与上述多个处理器连接的、保存锁定状态或者非锁定状态的第1锁变量的锁寄存器的多处理器中的排他控制方法,其特征在于,包括在上述处理器的1个为了获得锁而断言读出信号时,从上述锁寄存器读出第1锁变量并且将锁定状态的第1锁变量写入到上述锁寄存器的步骤;在所读出的第1锁变量为非锁定状态的情况下,由该1个处理器执行排他控制的排他控制步骤;以及在执行排他控制之后,在该1个处理器为了释放锁而断言写入信号时,将非锁定状态的第1锁变量写入到上述锁寄存器的步骤。
6.如权利要求5所述的多处理器系统中的排他控制方法,其特征在于,进一步包括在上述第1锁变量为锁定状态的期间,在上述处理器的1个断言读出信号时,生成用于提供给上述处理器的总线重试信号的步骤。
7.如权利要求5所述的多处理器系统中的排他控制方法,其特征在于上述多处理器系统进一步具备存储1个、或者2个或2个以上的第2锁变量的存储器;上述排他控制步骤包括在所读出的第1锁变量为非锁定状态的情况下,从上述存储器读出第2锁变量的步骤;在所读出的第2锁变量为非锁定状态的情况下,将第2锁变量改写为锁定状态的步骤;以及在将第2锁变量改写为锁定状态之后,执行排他控制的步骤。
全文摘要
本发明提供一种能够用简单的结构实现与具有锁变量的原子读出修改写入功能的高成本的系统同样的功能的多处理器系统。如果某一CPU断言读出信号READ,则从锁寄存器18读出锁变量LOCK,并且将锁定状态“1”的锁变量LOCK写入到锁寄存器18。在所读出的锁变量LOCK是非锁定状态“0”的情况下,该CPU能够获得锁。由于读出锁变量LOCK并且写入锁定状态“1”的主锁变量LOCK,所以此后即使另一CPU断言读出信号READ,也会因为从锁寄存器18读出锁定状态“1”的锁变量LOCK,而使该另一CPU不能获得锁。
文档编号G06F12/00GK101061462SQ20058004002
公开日2007年10月24日 申请日期2005年11月21日 优先权日2004年11月26日
发明者上田真 申请人:国际商业机器公司