具有硬件辅助的多处理器和多线程安全消息队列的制作方法

文档序号:6609440阅读:144来源:国知局
专利名称:具有硬件辅助的多处理器和多线程安全消息队列的制作方法
具有硬件辅助的多处理器和多线程安全消息队列技术领域本文件一般来说涉及电子计算机和数字处理系统中的程序间和处理间通信,且更明 确地说,涉及此类使用共享存储器的通信。
背景技术
在多个处理器交换消息时通常采用共享存储器。也就是说,当第一处理器(我们这 里将其命名为"CPU")将消息写入到所述共享存储器中以使得第二处理器(我们这里将 其命名为"COP")能接着从所述共享存储器读取所述消息时。维持由此交换的消息的完整性需要相对于软件执行线程"以原子方式"执行对消息内容的任何更新。通常使用此类共享存储器以及锁定和异步信令来实施多处理器安全消息队列。将消 息放置在共享存储器中,且接着仅在采取特定预防措施之后才对其进行读取和写入。举 例来说,建立所述消息的读取器或写入器软件线程将获得多处理器安全锁定(通常使用 "旋转锁定"来实施)。并且,当必要时,其还将获得单处理器多线程安全锁定(通常命 名为互相排斥锁定或"互斥")。图la-c是示意性方框图,其中图la在文体上描绘所关注的一般硬件(HW)环境, 且图lb-c描绘现有技术方案中所必需的常规软件(SW)操作。通常还存在一些需要考虑的"角落条件"。举例来说,需要处理在尝试读取但消息队 列为空时的特殊情况,且还需要处理在尝试写入但消息队列为满时的特殊情况。异步信 令通常用于处理这些条件(例如,在对空消息队列进行第一次写入之后发消息通知以唤 醒等待读取器线程)。通常通过一个处理器中断另一个处理器且接着在中断服务程序 (ISR)内用旗语来发消息通知以唤醒阻断线程来实施此类异步信令。遗憾的是,所有这些锁定和信令机制均需要相当大的软件设计及实施努力和相当大 的运行时间额外开销。我们来考虑一个基于旋转锁定的实例。如果在CPU (第一处理器)上运行的第一线 程已获得所述旋转锁定,并由CPU (所述第一处理器)上的另一线程预先占有,且接着 COP (第二处理器)上的第三线程设法得到所述旋转锁定,那么其将被阻断一长段时间, 直到所述第一线程再次变成活动且接着释放所述旋转锁定为止。旋转锁定通常被实施为 不断运行直到满足条件为止的环路内的轮询。如可理解的那样,此方案可导致临时的优
先级倒置,其中延迟COP上的优先级非常高的任务,因为CPU上的优先级较低的线程 具有CPU上的不相关的优先级较高的线程所预先占有的所有权。此方案还可容易引起相 当大的等待时间,其中COP在等待满意的轮询结果的同时变得基本上无用。 具有所有权的线程由CPU上不相关的优先级较高的线程预先占有。 类似地,使用互斥强加了另一额外开销。 一些操作系统(OS)和实时OS (RTOS) 花费大量时间来获得互斥,即使其正保护的资源可用时也是如此。因此,仍然需要一种用于多个处理器交换消息的更有效的系统。此系统应优选地去 除对采用基于软件的机制(例如旋转锁定和相互排斥锁定(互斥))的需要。发明内容因此,此处需要提供一种用于多个处理器交换消息的改进系统。简要地说,本发明的一个优选实施例是一种用于在第一计算机化处理器上运行的第 一软件组件将消息写入到在第二计算机化处理器上运行的第二软件组件可访问的共享存 储器的方法。所述第一软件组件尝试向消息队列写入寄存器加载消息标记,所述消息标 记是消息指示符(或消息本身)。由此触发的是,判断所述共享存储器中的消息队列中是 否存在用于所述消息标记的空间。相对于软件组件以原子方式执行此判断。如果空间可 用,那么也相对于软件组件以原子方式更新消息队列,这通过递增消息计数器,将所述 消息标记写入到所述消息队列中由写入指示符指定的位置处,且将所述写入指示符改变 为指向所述消息队列中的下一位置来进行。简要地说,本发明的另一优选实施例是一种用于在第二计算机化处理器上运行的第 二软件组件从在第一计算机化处理器上运行的第一软件组件可访问的共享存储器中读取 消息的方法。第二软件组件尝试从消息队列读取寄存器加载消息标记,其中所述消息标 记是存储在共享存储器中的消息队列中的消息指示符(或消息本身)。由此触发的是,判 断所述消息标记是否为新的,借此指示共享存储器中的所述消息队列中是否存在至少一 个新消息。相对于软件组件以原子方式来执行此判断。如果存在新消息,那么也相对于 软件组件以原子方式更新所述消息队列,这通过递减消息计数器,从所述消息队列中由 读取指示符指定的位置处读取所述消息标记,且将所述读取指示符改变为指向所述消息 队列中下一位置来进行。本发明的一个优点在于,其提供基于硬件的受保护的原子更新机制,所述机制完全 摆脱了软件旋转锁定和相互排斥锁定。本发明的另一优点在于,其使得在采用本发明的软件中实施多个处理器消息交换显
著地更为容易。并且,本发明的另一优点在于,其显著降低了与多个处理器消息交换相关联的运行 时间额外开销。鉴于如本文描述且如附式中说明的关于实行本发明的当前最佳已知模式和优选 实施例的工业适用性的描述,所属领域的技术人员将明了本发明的这些和其它期望特征。


从以下结合附式的详细描述中将容易了解到本发明的目的和优点,在附图中图la-c是示意性方框图,其中图la(背景技术)在文体上描绘所关注的一般硬件(HW) 环境,且图lb-c (现有技术)描绘现有技术方案中所必需的常规软件(SW)操作。图2是描绘根据本发明的硬件辅助系统的实施例如何与现代计算机系统相关的示意 性方框图。图3a-b是描述图2中本发明硬件辅助系统的实施例所使用的示范性数据结构的表格 附录。图4a-c是描绘图2的HW方面的初始化的流程图,其中图4a展示重设子程序,图 4b展示引导子程序,且图4c展示初始化子程序。图5a-c是描绘用于将消息写入到图2中的消息队列的消息写入子处理的流程图。 图6a-c是描绘用于从图2中的消息队列处读取消息的消息读取子处理的流程图。 图7是描绘在消息队列为满之后由读取引起中断时运行的满后读取中断服务程序 (ISR)的流程图。图8是描绘在消息队列18为空的同时由写入引起中断时运行的空后写入ISR的流程图。在附图的各种图式中,相同参考用于指示相同或类似元件或步骤。
具体实施方式
本发明的优选实施例是一种具有硬件辅助的多处理器和多线程安全消息队列。如本 文在各种图式中且特别是在图2的视图中说明,本发明的优选实施例由一般参考符号10 描绘。简要地说,本发明者己观察到对于多处理器消息传递的现有技术方法中的不足是由 于处理器且特别是处理器中的操作系统(OS)仅松散地连接到它们用于消息交换的实际 硬件资源(即,共享存储器和其中的消息队列)的缘故。相反,这已导致发明者意识到 用以获得整个系统的更佳使用的方式在于使硬件资源提供辅助。
回来简要参考图la且现还参考图2中的示意性方框图,可了解本发明硬件辅助系统 IO是如何与现代计算机系统12相关的。出于简化缘故,我们的示范性计算机系统12此 处仅包括两个处理器14 (CPU 14a和COP14b)、包括消息队列18的一组共享存储器16 和队列管理单元20。 一般来说且尤其出于以下揭示内容的缘故,可将计算机系统12视 为具有软件方面(一般来说,SW方面22,且详细地说,用于CPU 14a的SW组件22a 和用于COP 14b的SW组件22b)和硬件方面(HW方面24)。 SW方面22包括处理器 14 (CPU 14a和COP 14b),以及它们的辅助OS和软件执行线程(SW组件22a和SW组 件22b)。虽然在一般计算情形中稍微有些难处理,但出于将变得显而易见的原因而与本 文 -致,处理器14 (CPU 14a和COP 14b)包括在SW方面22中。相反,HW方面24 包括硬件资源(共享存储器16、消息队列18和队列管理单元20), SW方面22使用所述 硬件资源来在处理器14 (CPU 14a与COP 14b)之间交换消息。为说明本发明硬件辅助系统IO可如何去除旋转锁定、互斥和其它基于多处理器资源 共享软件的锁定机制的使用,现展现一种使用情形,其中软件(SW)与假设硬件(HW) 编程寄存器一起工作以实施处理器间消息队列。本文考虑五种主要情况情况l:设定HW方面24,具体地说包括初始化HW方面24 (仅在重设时进行一次);SW方面22使得HW方面24准备由计算机系统12使用(仅在引导时间进行一次)和SW方面22初始化HW方面24以供在运行时间期间使用(可能在任何两次重设之 间执行多次)。情况2: SW方面22将消息写入到消息队列18; 情况3: SW方面22从所述消息队列18读取消息;和情况4:满后读取中断服务例程(ISR),其在满足特定(稍后解释)条件时运行。 情况5:空后写入ISR,其在满足特定(稍后解释)条件时运行。 图3a-3b是描述待论述的本发明硬件辅助系统10的实施例所使用的示范性数据结构 的表格附录。这些数据结构一般需要可由两个处理器14 (CPU 14a和COP 14b)访问, 所以它们可构建在共享存储器16中。很多在此处是不解自明的,且现在将顺便论述多个 元件。但某些元件也值得在此处作以下介绍。表600是寄存器概要。表601是CPU.ThreadID的寄存器说明。表601是COP.ThreadID 的寄存器说明。CPU.ThreadID和COP.ThreadID具有相同的地址。其值是基于从哪个处 理器进行访问。表603描述了用于消息队列存储的基准地址(IPMQ.ADDR)。表604描 述了消息队列存储的大小(IPMQ.SIZE )。表605描述了消息队列读取请求 (IPMQ.ACCESS.RD)。表606描述了消息队列写入请求(IPMQ.ACCESS.WR)。表607 描述了用于写入满队列的异常处理机的地址(IPMQ.FULL.JMP)。表6087描述了读取空
队列的异常处理机的地址(IPMQ.EMPTY.JMP)。表609描述了消息队列控制寄存器。 应存在处理器专用线程识别寄存器(CPU.ThreadID),其在每次内容切换时由调度器更新。应存在寄存器以临时保持程序计数器(IPMQ.PC),以便SW方面22能在处理异常 情况时返回到开始点。应存在基准地址寄存器(IPMQ.ADDR)以编程消息队列("IPMQ")的存储空间的 丌始地址。应存在寄存器以编程消息队列的大小(IPMQ.SIZE)。应存在用于读取消息的寄存器(IPMQ.ACCESS.RD)。通常,其将被构建为含有存储 实际消息的位置的指示符,因为消息大小在大多数情况下将大于指示符大小,且此方法 将变得更为有效。应存在用于写入消息的寄存器(IPMQ.ACCESS.WR)。类似地,出于效率原因,其 通常也将被构建为含有指示符而并非实际消息。共享存储器16中应存在某些空间,所述共享存储器一般来说可由两个处理器(CPU 14a禾卩COP 14b)访问,在所述空间中存储消息和/或消息指示符。应存在控制寄存器(IPMQ.CONTROL)以控制HW方面24。应存在寄存器(IPMQ.FULL.JMP)以保持指令地址,其中在尝试对满消息队列进行 写入时发生跳跃(即,满后读取中断服务ISR)。应存在寄存器(IPMQ.EMPTYJMP)以保持指令地址,其中在尝试从空消息队列进 行读取时发生跳跃(即,空后写入ISR)。可以多种方式來实施消息队列18,但此处假定所述消息队列18被实施为环形缓冲 器。此处进一歩假定,HW方面24在内部管理消息计数器(IPMQ.NMSGS)、读取指示 符(IPMQ.RDPTR)和写入指示符(IPMQ.WRPTR)。此外,读取和写入旗语的等待列表 应山HW方面24提供。图4a-c是描绘HW方面24的初始化(情况l)的流程图,其中图4a展示重设子程 序100 (情况1A),图4b展示引导子程序130 (情况1B),且图4c展示初始化子程序160 (情况1C)。以图4a开始,在歩骤102中进入重设子程序100 (注意,消息队列18的此重设在 HW方面24已最初被重设或加电之后发生)。接着,在歩骤104中,HW方面24将其内 部消息计数器(IPMQ.NMSGS)初始化为零。且在步骤106中,退出重设子程序100。 HW方面24现在得到重设。接下来转向图4b,在歩骤132中进入引导子程序130。接着,在步骤134中,SW方 面22将到指令寄存器的第一跳跃(IPMQ.FULL.JMP)初始化为指向满处理机方法。类 似地,在步骤136中,SW方面22将到指令寄存器的第二跳跃(IPMQ.EMPTYJMP)初 始化为指向空处理机方法。并且在步骤138中,退出引导子程序130。 HW方面24现准 备进行初始化。并且转向图4c,在步骤162中进入初始化子程序160。接着,在步骤164中,SW方 面22编程共享存储器16中的消息队列18的基准地址(IPMQ.ADDR),且在步骤166中, SW方面22编程消息队列18的大小(IPMQ.SIZE)。在步骤168中,SW方面22规定用 于控制读取中断的优选模式,且在步骤170中,SW方面22规定用于控制写入中断的优 选模式。可在对空消息队列18进行第一次写入且己存在读取请求之后(即, IPMQ.C0NTR0L.MCQ.1 = 1)或者在己达到队列空条件且己存在读取请求之后消息队列 18的第一时间半部分变满之后(即,IPMQ.CONTROL.MCQ.1=0),产生"准备读取"中 断。可在从满消息队列18处进行第一次读取且己存在写入请求之后(即, IPMQ.CONTROL.MCQ.O=1)或者在已达到队列满条件且已存在写入请求之后消息队列 18的第一时间半部分变空之后(即,IPMQ.CONTROL.MCQ.O-O),产生"准备写入"中 断。在步骤172中,SW方面22在控制寄存器中设置启用位(IPMQ.CONTROL.MCQ.31)。 如果在设置此之前使用HW方面24,则造成异常(例如,数据中止异常)。同时,由于 SW方面22已编程基准地址(步骤164),因而在步骤174中,HW方面24初始化其内 部寄存器,所述内部寄存器跟踪消息队列18中的下一读取位置(IPMQ.RDPTR)和下一 写入位置(IPMQ.WRPTR)。现完成了针对设定HW方面24的情况1。图5a-c是描绘用于将消息写入到消息队列18 (情况2)的消息写入子程序200的流 程图。简要地说,SW方面22尝试将消息指示符(或消息本身)加载到消息队列写入寄 存器中开始一连串操作,其中将消息写入到消息队列18或将SW方面22中的执行线程 置于阻断等待条件中。在步骤202中进入消息写入子处理200。在步骤204中,SW方面22尝试向消息队 列写入寄存器(IPMQ.ACCESS.WR)加载消息指示符。在步骤206中,HW方面24判断 消息队列18中是否存在空间(此处将IPMQ.NMSGS与IPMQ.SIZE进行比较,尽管还可 使用其它技术)。如果存在空间,则在部分208 (在图5b中详细展示)中,HW方面24在内部更新消 息队列18(步骤206和部分208两者均相对于SW方面22为原子的且专属于单个处理器 (CPU 14a或COP 14b))。在步骤210中,HW方面24递增消息计数器(IPMQ.NMSGS)。
在步骤212中,HW方面24将写入到IPMQ.ACCESS.WR寄存器的值复制到IPMQ.WRPTR 寄存器所指向的存储器。在步骤214中,HW方面24将IPMQ.WRPTR递增一个单位(例 如,如果自然指示符大小为4字节,则递增4字节)。在步骤216中,HW方面24判断 IPMQ.WRPTR值是否指向环形缓冲器中消息队列18中的最后空间之后的一个单位。如 果是,则在步骤218中,HW方面24将所述指示符重设到环形缓冲器的开始(IPMQ.ADDR)。并且接着,或者如果不是,则在步骤220中,HW方面24返回(即, 用于写入消息的消息写入子处理200退出)。如果不存在空间(在步骤206中判断得到;消息计数器等于队列大小),则消息队列 18为满的,且在部分222 (在图5c中详细展示)中,HW方面24准备处理此(步骤206 和部分222两者也相对于SW方面22为原子的且专属于单个处理器14)。在步骤224中, HW方面24将程序计数器复制到临时空间(IPMQ.PC),在步骤226中,HW方面24停 用中断,且在步骤228中,HW方面24将程序计数器设置为满处理机方法(经由 IPMQ.FULL.JMP)。总的来说,在消息写入子处理200内,步骤230-242构成所述满处理机方法244。 在步骤230中,SW方面22读取(当前)线程ID且制作临时程序计数器寄存器 (IPMQ.PC)的本机副本(tempPC)。在步骤232中,SW方面22找到与此线程相关联 的写入旗语,且在步骤234中,SW方面22将所述旗语放置在等待列表中。[注意,在某 些OS中,可能对于单个旗语存在多个等待者。对于此类情况来说,SW实施者可选择针 对所有线程使用同一旗语而不使用等待线程列表,因为OS本身在内部将保持等待线程 列表。]在步骤236中,SW方面22启用中断,且在步骤238中,SW方面22被阻断以等待 所述旗语。在某点上,当另一处理器从消息队列18读取消息时(或读取队列中的一半消 息时,这取决于控制寄存器设置),其将造成产生中断且所述中断将发信号通知此旗语(见 图7和下文提供的论述)。因此,在步骤240中,发信号通知所述旗语且对SW方面22 解除阻断。在步骤242中,SW方面22将程序计数器设置为程序计数器的已保存临时副 本(在IPMQ.PC中)。此最终结果在于,SW方面22在其开始处结束,从而将消息写入 到写入消息寄存器。并且,既然消息队列18具有空间,那么此尝试应当为成功的。总而言之,SW方面22"认为"(1)步骤204之后是步骤220 (如果存在空间且将消 息写入到消息队列18中),因为步骤206和部分208相对于SW方面22为原子的。或者 (2) SW方面22 "认为"步骤204之后是步骤230-242 (如果不存在空间),因为步骤 206和部分222相对于SW方面22为原子的。现在完成了用于将消息写入到消息队列18 的情况2。图6a-c是描绘用于从消息队列18读取消息(情况3)的消息读取子处理300的流程 图。简要地说,尝试从消息队列读取寄存器加载消息指示符(或消息本身)的SW方面 22开始一连串操作,其中从消息队列18处读取消息或将SW方面22中的执行线程置于 阻断等待条件中。在步骤302中进入消息读取子处理300。在步骤304中,SW方面22尝试从消息队 列读取寄存器(IPMQ.ACCESS.RD)加载消息指示符。在步骤306中,HW方面24判断 消息队列18中是否存在未读消息(此处通过检查IPMQ.NMSGS)。如果消息队列18中存在至少一个消息,则在部分308 (在图6b中详细展示)中, HW方面24在内部更新消息队列18 (步骤306和部分308两者均相对于SW方面22为 原子的且专属于单个处理器)。在步骤310中,HW方面24递减消息计数器 (IPMQ.NMSGS)。在步骤312中,HW方面24将IPMQ.RDPTR寄存器所指向的存储器 的值复制到读取指令规定的通用寄存器。在步骤314中,HW方面24将IPMQ.RDPTR 递增一个单位(例如,如果自然指示符大小为4字节,则递增4字节)。在步骤316中, HW方面24判断IPMQ.RDPTR值是否指向环形缓冲器中消息队列18中的最后空间之后 的一个单位。如果是,则在步骤318中,HW方面24将指示符重设到环形缓冲器的开始 处。还有,或者如果不是,则在步骤320中,HW方面24返回(即,用于读取消息的消 息读取子处理300退出)。如果消息计数器是零(步骤306),那么消息队列18是空的且在部分322 (如图6c 中详细展示)中,HW方面24准备处理此事(步骤306和部分322两者也是相对于SW 方面22为原子的且专属于单个处理器14)。在步骤324中,HW方面24将程序计数器复 制到临时空间(IPMQ.PC),在步骤326中,HW方面24停用中断,且在步骤328中, HW方面24将程序计数器设置为空处理机方法(经由IPMQ.EMPTY.JMP)。总的来说,在消息读取子处理300内,步骤330-342构成空处理机方法344。在步骤330中,SW方面22读取(当前)线程ID且制作临时程序计数器寄存器 (IPMQ.PC)的本机副本(tempPC)。在步骤332中,SW方面22找到与此线程相关联 的读取旗语,且在步骤334中,SW方面22将所述旗语放置在等待列表中。[注意,在某 些OS中,可能对于单个旗语存在多个等待者。对于此类情况来说,SW实施者可选择针 对所有线程使用同一旗语而不使用等待线程列表,因为OS本身在内部将保持等待线程在步骤336中,SW方面22启用中断,且在步骤338中,SW方面22被阻断以等待 所述旗语。在某点上,当另一处理器将消息写入消息队列18中(或填充消息队列18的 一半,这取决于控制寄存器设置)时,将造成产生中断且所述中断将发信号通知此旗语 (见图8和下文提供的论述)。因此,在步骤340中,发信号通知所述旗语,且对SW方 面22解除阻断。在步骤342中,SW方面22将程序计数器设置为程序计数器的已保存临 时副本(在IPMQ.PC中)。最终结果在于SW方面22在其开始处结束,从而从读取消息 寄存器处读取消息。并且,既然消息队列18具有消息,那么此尝试将为成功的。总而言之,SW方面22 "认为"(1)步骤304之后是步骤320 (如果在消息队列18 中存在至少一个消息),因为步骤306和部分308相对于SW方面22为原子的。或者(2) SW方面22"认为"步骤304之后是步骤330-342 (如果不存在任何消息),因为步骤306 和部分322相对于SW方面22为原子的。现在完成了用于从消息队列18读取消息的情 况3。图7是描绘在消息队列18满了之后由读取造成中断时运行的满后读取ISR 400 (情 况4)的流程图。简要地说,当一个处理器(例如,COP 14b)从消息队列18读取时, 在另一处理器(CPU 14a)上发生中断以便能在所述处理器(CPU 14a)上发生写入操作。 为发生此,消息队列18必须变为满的且必须存在向消息队列18写入消息的请求。取决 于控制寄存器中的设置(在此实施例中,其为可编程的),这可发生在满足以上条件之后 进行第一次读取之后或在已读取足够消息而使得所述消息队列18中的一半空间为空之 后。[或者,可能存在另一寄存器,其规定应当在多少次读取之后发生此中断。没有理由 必须将本发明硬件辅助系统10的实施例限制为仅单个读取或半满条件。半满条件仅仅是 一种可能性,且在另一寄存器中使用另一确切数目是另一种可能性。]在步骤402中进入满后读取ISR400,且SW方面22执行以下步骤。在步骤404中, SW方面22判断在第一次读取之后还是在消息队列18的一半变成空的之后发生中断(此 处核査IPMQ.CONTROL.MCQ.0位,尽管还可使用其它技术)。如果是在一个消息之后,则在步骤406中,SW方面22发信号通知处于等待线程列 表顶部的旗语,且在步骤408中,SW方面22从等待线程列表中取出(移除)所述顶部 元素。[如果所有线程使用同一旗语,那么将不存在等待线程列表且仅一个线程将变成解 除阻断的,这取决于OS实施方案。]并且,在步骤410中,SW方面22返回(即,完成 了所述满后读取ISR400)。
如果在消息队列18的一半变为空的之后发生所述中断(在步骤404中判断得到), 则在步骤412中,SW方面22发信号通知等待线程列表中的所有旗语,且在步骤414中, SW方面22清除等待线程列表。[如果所有线程使用同一旗语,那么将不存在等待列表。 SW方面22应接着对所述旗语使用不同方法,以通知所有等待者,或者SW方面22能跟 踪等待者数目且以同样多的次数发信号通知同一旗语并重设所述值。]此处同样,在步骤 410中,SW方面22返回。现在完成了针对满后读取ISR 400的情况4。图8是描绘在消息队列18为空的同时在由写入造成中断时运行的空后写入ISR 500 (情况5)的流程图。简要地说,当一个处理器(例如,COP 14b)对消息队列18进行 写入时,在另一处理器(CPU 14a)上发生中断,以便能在所述处理器(CPU 14a)上发 生读取操作。为了发生此情况,消息队列18必须变成空的,且必须存在从消息队列18 读取消息的请求。取决于控制寄存器中的设置(在此实施例中其为可编程的),此可发生 在满足以上条件之后进行第一次写入之后或在已写入足够消息而使得消息队列18中的 一半空间为满的之后。[此处同样,或者可能存在另一寄存器,其规定应当在多少次写入 之后发生此中断。没有理由必须将本发明硬件辅助系统10的实施例限制为仅单个写入或 半满条件。半满条件仅仅是一种可能性,且在另一寄存器中使用另一确切数目是另一种 可能性。]在步骤502中进入空后写入ISR500,且SW方面22执行以下步骤。在步骤504中, SW方面22判断在第一次写入之后还是在消息队列18的一半变满之后发生中断(此处核 查IPMQ.CONTROL.MCQ.l位,尽管还可使用其它技术)。如果是在一个消息之后,则在步骤506中,SW方面22发信号通知处于等待线程列 表顶部的旗语,且在步骤508中,SW方面22从等待线程列表中取出(移除)所述顶部 元素。[如果所有线程使用同一旗语,那么将不存在等待线程列表且仅一个线程将变成解 除阻断的,这取决于OS实施方案。]并且,在步骤510中,SW方面22返回(即,完成 了所述空后写入ISR500)。如果在消息队列18的一半变满之后发生所述中断(在步骤504中判断得到),则在 步骤512中,SW方面22发信号通知等待线程列表中的所有旗语,且在步骤514中,SW 方面22清除等待线程列表。[如果所有线程使用同一旗语,那么将不存在等待列表。SW 方面22应接着对所述旗语使用不同方法,以通知所有等待者,或者SW方面22能跟踪 等待者数目且以同样多的次数发信号通知同一旗语并重设所述值。]此处同样,在步骤510 中,SW方面22返回。现在完成了针对空后写入ISR 500的情况5。 作为简短概述,此文件已揭示以下内容。概念1一种用于在第一计算机化处理器上运行的第一软件组件将消息写入到在第二 计算机化处理器上运行的第二软件组件可访问的共享存储器的方法,所述方法包含-所述第一软件组件尝试向消息队列写入寄存器加载消息标记,所述消息标记是所述 消息的指示符或所述消息本身;判断所述共享存储器中的消息队列中是否存在用于所述消息标记的空间,其中所述 判断是由所述己发生的尝试触发的且相对于所述软件组件以原子方式执行的;如果所述判断指示所述空间可用,则更新所述消息队列,其中所述更新也是相对于 所述软件组件以原子方式进行的,且包括递增消息计数器;将所述消息标记写入到所述消息队列中由写入指示符指定的位置处;和 将所述写入指示符改变为指向所述消息队列中的下一位置。 概念2根据概念l所述的方法,其进一步包含 否则,如果所述判断指示所述空间不可用,贝U: 使所述待决的第一软件组件等待所述消息队列中发生改变;且 循环回到所述尝试。概念3根据概念2所述的方法,其中所述第一计算机化处理器具有程序计数器,且 所述方法进一步包含在所述等待之前,准备通过以下步骤将所述第一软件组件以原子方式置于等待条件中保存所述程序计数器的临时副本; 在所述第一计算机化处理器中停用中断;和 将所述程序计数器设置为满处理机子方法;且其中所述判断包含所述满处理机子方法,且包括保存所述临时副本的本机副本;将与所述第一软件组件相关联的写入旗语放置在等待列表中; 在所述第一计算机化处理器中启用中断;阻断所述第一软件组件,直到发信号通知所述写入旗语为止;和 将所述第一计算机化处理器中的所述程序计数器设置回到所述本机副本,借此返回 到所述(a)。概念4根据概念1所述的方法,其进一步包含在所述更新之后,中断在所述第二计 算机化处理器上运行的所述第二软件组件以在所述第二计算机化处理器上启用读取操 作。概念5根据概念4所述的方法,其中所述中断包括-发信号通知处于等待列表中最上方的读取旗语; 从所述等待列表中移除所述处于最上方的所述读取旗语;和 使所述第二计算机化处理器的控制返回到所述第二软件组件。 概念6根据概念4所述的方法,其中所述中断包括-判断等待列表中是否存在预设量的读取旗语,且如果存在,贝U:发信号通知所述等待列表中的所有所述读取旗语,且 从所述等待列表中移除所有所述读取旗语;和 使所述第二计算机化处理器的控制返回到所述第二软件组件。概念7 —种用于在第二计算机化处理器上运行的第二软件组件从在第一计算机化处 理器上运行的第一软件组件可访问的共享存储器处读取消息的方法,所述方法包含所述第二软件组件尝试从消息队列读取寄存器中加载消息标记,其中所述消息标记是所述消息的指示符或所述消息本身,其存储在所述共享存储器中的消息队列中;判断所述消息标记是否为新的,借此指示所述消息队列中是否存在至少一个新消息, 且其中所述判断是由所述已发生的尝试触发的且相对于所述软件组件以原子方式执行的;如果所述判断指示所述消息为新的,则更新所述消息队列,其中所述更新也是相对 于所述软件组件以原子方式进行的,且包括 递减消息计数器;从所述消息队列中由读取指示符指定的位置处读取所述消息标记;和 将所述读取指示符改变为指向所述消息队列中的下一位置。 概念8根据概念7所述的方法,其进一步包含 否则,如果所述判断指示不存在所述新消息,贝IJ-使所述待决的第二软件组件等待在所述消息队列中发生改变且 循环回到所述尝试。
概念9根据概念8所述的方法,其中所述第二计算机化处理器具有程序计数器,且 所述方法进一步包含在所述等待之前,准备通过以下步骤以原子方式将所述第二软件组件置于等待条件中保存所述程序计数器的临时副本; 在所述第二计算机化处理器中停用中断;和 将所述程序计数器设置为空处理机子方法;且其中所述"否则,如果所述判断指示"包含所述空处理机子方法,且包括 保存所述临时副本的本机副本;将与所述第二软件组件相关联的读取旗语放置在等待列表中; 在所述第二计算机化处理器中启用中断;阻断所述第二软件组件,直到发信号通知所述读取旗语为止;和将所述第二计算机化处理器中的所述程序计数器设置回到所述本机副本,借此返回 到所述尝试步骤。概念IO.根据概念7所述的方法,其进一步包含在所述更新步骤之后,中断在所 述第一计算机化处理器上运行的所述第一软件组件,以在所述第一计算机化处理器上启用读取操作。概念ll.根据概念10所述的方法,其中所述中断包括 发信号通知处于等待列表中最上方的写入旗语; 从所述等待列表中移除所述处于最上方的写入旗语;和 使所述第一计算机化处理器的控制返回到所述第一软件组件。 概念12.根据概念10所述的方法,其中所述中断包括 判断等待列表中是否存在预设量的所述写入旗语,且如果存在,贝IJ: 发信号通知所述等待列表中的所有所述写入旗语,且 从所述等待列表中移除所有所述写入旗语;和 使所述第一计算机化处理器的控制返回到所述第一软件组件。概念13. —种用于在第一计算机化处理器上运行的第一软件组件与第二计算机化 处理器上运行的第二软件组件之间交换消息的方法,其中所述第一计算机化处理器和所 述第二计算机化处理器能够访问共享存储器,所述方法进一步包含所述第一软件组件尝试向消息队列写入寄存器加载消息标记,所述消息标记是所述 消息的指示符或所述消息本身;判断在所述共享存储器中的消息队列中是否存在用于所述消息标记的空间,其中所 述判断是由所述已发生的尝试触发的且相对于所述软件组件以原子方式执行的;如果所述判断指示所述空间可用,则更新所述消息队列,其中所述更新也是相对于 所述软件组件以原子方式进行的,且包括递增消息计数器;将所述消息标记写入到所述消息队列中由写入指示符指定的位置处;和 将所述写入指示符改变为指向所述消息队列中的下一位置; 所述第二软件组件尝试从消息队列读取寄存器中加载所述消息标记; 判断所述消息标记是否为新的,借此指示所述消息队列中是否存在至少一个新消息, 且其中所述判断是由所述已发生的尝试触发的且相对于所述软件组件以原子方式执行的;如果对所述消息标记是否为新的所述判断指示所述消息为新的,则更新所述消息队 列,其中所述更新也是相对于所述软件组件以原子方式进行的,且包括 递减所述消息计数器;从所述消息队列中由读取指示符指定的位置处读取所述消息标记;和 将所述读取指示符改变为指向所述消息队列中的下一位置。概念14. 一种用于在第一计算机化处理器上运行的第一软件组件将消息写入到在 第二计算机化处理器上运行的第二软件组件可访问的共享存储器的系统,所述系统包含加载构件,其用于所述第一软件组件尝试向消息队列写入寄存器加载消息标记,所 述消息标记是所述消息的指示符或所述消息本身;消息队列管理单元,其包括判断构件,其用于相对于所述软件组件以原子方式判断所述共享存储器中的消息队 列中是否存在用于所述消息标记的空间;和响应于所述判断构件的更新构件,其用于相对于所述软件组件以原子方式更新所述消息队列,其中所述更新构件包括用于递增消息计数器的构件;用于将所述消息标记写入到所述消息队列中由写入指示符指定的位置处的构件;和用于将所述写入指示符改变为指向所述消息队列中的下一位置的构件。概念15.根据概念14所述的系统,其进一步包含响应于所述判断构件的无效性构
件,所述无效性构件用于使所述待决的第一软件组件等待在所述消息队列中发生改变且 接着使所述第一软件组件返回到所述加载构件。概念16.根据概念15所述的系统,其中所述第一计算机化处理器具有程序计数器, 且所述系统进一步包含满处理机逻辑;用于准备以原子方式将所述第一软件组件置于等待条件中的构件,其中所述准备构 件包括-用于保存所述程序计数器的临时副本的构件; 用于在所述第一计算机化处理器中停用中断的构件;和 用于将所述程序计数器设置为运行所述满处理机逻辑的构件;且 其中所述满处理机逻辑包括 用于保存所述临时副本的本机副本的构件;用于将与所述第一软件组件相关联的写入旗语放置在等待列表中的构件; 用于在所述第一计算机化处理器中启用中断的构件;用于阻断所述第一软件组件直到发信号通知所述写入旗语为止的构件;和 用于将所述第一计算机化处理器中的所述程序计数器设置回到所述本机副本的构件。概念17. —种用于在第二计算机化处理器上运行的第二软件组件从在第一计算机 化处理器上运行的第一软件组件可访问的共享存储器中读取消息的系统,所述方法包含 加载构件,其用于所述第二软件组件尝试从消息队列读取寄存器中加载消息标记,其中所述消息标记是存储在所述共享存储器中的消息队列中的所述消息的指示符或所述 消息本身;消息队列管理单元,其包括判断构件,其用于相对于所述软件组件以原子方式判断所述消息标记是否为新的;禾口响应于所述判断构件的更新构件,其用于相对于所述软件组件以原子方式更新所述消息队列,其中所述更新构件包括 用于递减消息计数器的构件用于从所述消息队列中由读取指示符指定的位置处读取所述消息的构件;和 用于将所述读取指示符改变为指向所述消息队列中的下一位置的构件。
概念18.根据概念17所述的系统,其进一步包含响应于所述判断构件的新消息构 件,所述新消息构件用于使所述待决的第二软件组件等待所述消息队列中发生改变且接 着使所述第一软件组件返回到所述加载构件。概念19.根据概念18所述的系统,其中所述第二计算机化处理器具有程序计数器, 且所述系统进一步包含空处理机逻辑;用于准备以原子方式将所述第二软件组件置于等待条件中的构件,其中所述准备构 件包括用于保存所述程序计数器的临时副本的构件; 用于在所述第二计算机化处理器中停用中断的构件;和 用于将所述程序计数器设置为运行所述空处理机逻辑的构件;且 其中所述空处理机逻辑包括 用于保存所述临时副本的本机副本的构件;用于将与所述第二软件组件相关联的读取旗语放置在等待列表中的构件; 用于在所述第二计算机化处理器中启用中断的构件;用于阻断所述第二软件组件直到发信号通知所述读取旗语为止的构件;和 用于将所述第二计算机化处理器中的所述程序计数器设置回到所述本机副本的构件。广义地说,此文件揭示一种用于处于不同处理器上的软件组件的消息交换系统。第 一组件尝试向写入寄存器中加载消息指示符(或消息本身)会触发对共享存储器队列中 是否存在空间的判断。如果存在,则通过递增消息计数器、将所述消息/指示符写入到所 述队列的由写入指示符指定的位置中且将所述写入指示符改变到下一队列位置来更新所 述队列。第二组件尝试从读取寄存器加载所述消息/指示符会触发对所述队列中是否存在 至少一个新消息的判断。如果存在,则通过递减所述消息计数器、从所述队列的由读取 指示符指定的位置读取所述消息/指示符且将所述读取指示符改变为指向下一队列位置 来更新所述队列。所述判断和队列更新是相对于所述软件组件以原子方式执行的。尽管上文己描述了各种实施例,但应了解已仅以实例方式来展现所述实施例,且本 发明的宽度和范围不应受上述示范性实施例中的任一者限制,而是应代替地仅根据所附 权利要求书和其等效物来界定。
权利要求
1.一种用于由运行于第一计算机化处理器上的第一软件组件将消息写入到可由运行于第二计算机化处理器上的第二软件组件访问的共享存储器的方法,所述方法包含用所述第一软件组件尝试向消息队列写入寄存器加载消息标记,所述消息标记是所述消息的指示符或所述消息本身;判断所述共享存储器中的消息队列中是否存在用于所述消息标记的空间,其中所述判断是由所述已发生的尝试触发且相对于所述软件组件以原子方式执行;如果所述判断指示所述空间可用,则更新所述消息队列,其中所述更新也是相对于所述软件组件以原子方式进行的,且包括递增消息计数器;将所述消息标记写入到所述消息队列中由写入指示符指定的位置处;和将所述写入指示符改变为指向所述消息队列中的下一位置。
2. 根据权利要求l所述的方法,其进一步包含否则,如果所述判断指示所述空间不可用,贝U-使所述第一软件组件等待,直至所述消息队列中发生改变;且 循环回到所述尝试。
3. 根据权利要求2所述的方法,其中所述第一计算机化处理器具有程序计数器,且所 述方法进一步包含在所述等待之前,准备通过以下步骤将所述第一软件组件以原子方式置于等待条 件中保存所述程序计数器的临时副本; 在所述第一计算机化处理器中停用中断;和 将所述程序计数器设置为满处理机子方法;且 其中所述判断包含所述满处理机子方法,且包括 保存所述临时副本的本机副本;将与所述第一软件组件相关联的写入旗语放置在等待列表中; 在所述第一计算机化处理器中启用中断;阻断所述第一软件组件,直到发信号通知所述写入旗语为止;和将所述第一计算机化处理器中的所述程序计数器设置回到所述本机副本,借此 返回到所述(a)。
4. 根据权利要求1所述的方法,其进一步包含在所述更新之后,中断在所述第二计 算机化处理器上运行的所述第二软件组件以在所述第二计算机化处理器上启用读 取操作。
5. 根据权利要求4所述的方法,其中所述中断包括发信号通知处于等待列表中最上方的读取旗语; 从所述等待列表中移除所述处于最上方的所述读取旗语;和 使所述第二计算机化处理器的控制返回到所述第二软件组件。
6. 根据权利要求4所述的方法,其中所述中断包括判断等待列表中是否存在预设量的读取旗语,且如果存在,贝U:发信号通知所述等待列表中的所有所述读取旗语,且从所述等待列表中移除所有所述读取旗语;和 使所述第二计算机化处理器的控制返回到所述第二软件组件。
7. —种用于由运行于第二计算机化处理器上的第二软件组件从可由运行于第一计算 机化处理器上的第一软件组件访问的共享存储器中读取消息的方法,所述方法包含用所述第二软件组件尝试从消息队列读取寄存器中加载消息标记,其中所述消息 标记是所述消息的指示符或是存储在所述共享存储器中的消息队列中的所述消息本身;判断所述消息标记是否为新的,借此指示所述消息队列中是否存在至少一个新消 息,且其中所述判断是由所述己发生的尝试触发且相对于所述软件组件以原子方式 执行;如果所述判断指示所述消息为新的,则更新所述消息队列,其中所述更新也是相对于所述软件组件以原子方式进行的,且包括: 递减消息计数器;从所述消息队列中由读取指示符指定的位置处读取所述消息标记;和 将所述读取指示符改变为指向所述消息队列中的下一位置。
8. 根据权利要求7所述的方法,其进一步包含-否则,如果所述判断指示不存在所述新消息,贝lj: 使所述第二软件组件等待,直至所述消息队列中发生改变;且 循环回到所述尝试。
9. 根据权利要求8所述的方法,其中所述第二计算机化处理器具有程序计数器,且所 述方法进一步包含在所述等待之前,准备通过以下步骤以原子方式将所述第二软件组件置于等待条 件中保存所述程序计数器的临时副本; 在所述第二计算机化处理器中停用中断;和 将所述程序计数器设置为空处理机子方法;且 其中所述"否则,如果所述判断指示"包含所述空处理机子方法,且包括 保存所述临时副本的本机副本;将与所述第二软件组件相关联的读取旗语放置在等待列表中; 在所述第二计算机化处理器中启用中断;阻断所述第二软件组件,直到发信号通知所述读取旗语为止;和 将所述第二计算机化处理器中的所述程序计数器设置回到所述本机副本,借此 返回到所述尝试步骤。
10. 根据权利要求7所述的方法,其进一步包含在所述更新步骤之后,中断在所述第 一计算机化处理器上运行的所述第一软件组件,以在所述第一计算机化处理器上启用读取操作。
11. 根据权利要求IO所述的方法,其中所述中断包括发信号通知处于等待列表中最上方的写入旗语; 从所述等待列表中移除所述处于最上方的写入旗语;和 使所述第一计算机化处理器的控制返回到所述第一软件组件。
12. 根据权利要求IO所述的方法,其中所述中断包括判断等待列表中是否存在预设量的所述写入旗语,且如果存在,贝IJ:发信号通知所述等待列表中的所有所述写入旗语,且从所述等待列表中移除所有所述写入旗语;和 使所述第一计算机化处理器的控制返回到所述第一软件组件。
全文摘要
本发明提供一种用于不同处理器上的软件组件的消息交换系统。第一组件尝试向写入寄存器加载消息指示符(或消息本身)会触发判断在共享存储器队列中是否存在空间。如果存在,则通过递增消息计数器、将所述消息/指示符写入到所述队列中由写入指示符指定的位置且将所述写入指示符改变到下一队列位置来更新所述队列。第二组件尝试从读取寄存器加载所述消息/指示符会触发判断在所述队列中是否存在至少一个新消息。如果存在,则通过递减所述消息计数器、从所述队列中由读取指示符指定的位置读取所述消息/指示符且将所述读取指示符改变为指向下一队列位置来更新所述队列。所述判断和队列更新是相对于所述软件组件以原子方式执行的。
文档编号G06F9/46GK101114235SQ20071010727
公开日2008年1月30日 申请日期2007年5月23日 优先权日2006年5月25日
发明者格克汗·阿夫卡罗古拉里 申请人:辉达公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1