专利名称:多cpu对临界资源进行互斥访问的方法和装置的制作方法
技术领域:
本发明涉及多处理器技术领域,尤其涉及一种多CPU(Center ProcessingUnit,中央处理单元)对临界资源进行互斥访问的方法和装置。
背景技术:
支持多硬件线程技术的处理器等目前已经越来越广泛的应用,其特点是处理器拥有多个Hardware-Thread(硬件线程),每个Hardware-Thread拥有独立的指令针,共享Pipeline(管线资源)资源。Pipeline资源指能执行软件指令的物理电路,如整型运算单元、取指单元、译码单元等。支持多硬件线程的处理器使用特定的调度方式对Hardware-Thread进行调度,实现Hardware-Thread对Pipeline资源的时分复用。每个Hardware-Thread拥有独立的Context(上下文)如指令指针、寄存器组等,可以完成Hardware-Thread间快速切换。从软件角度,可以将支持多硬件线程的处理器视作多个CPU(Center Processing Unit,中央处理单元)并发的系统,将每个Hardware-Thread视为一个CPU,如对于单核4硬件线程CPU,可以视为4个CPU并发的系统,对于双核各有4硬件线程CPU,可以视为8个CPU并发的系统。
一般地,在处理系统中都存在着临界资源,临界资源是指多CPU必须互斥访问的资源,即某一时刻不允许多个CPU同时访问而只能单个CPU访问的资源。支持多硬件线程的处理器中多个CPU并发执行的特点决定了对临界资源的保护机制需要重点关注两个需求支持不同CPU间对临界资源进行互斥访问;等待资源时CPU应主动挂起,资源释放时CPU应能够被唤醒。如果某个CPU等待资源时未能挂起,则将占用Pipeline资源,影响其他CPU的性能。
目前,单CPU操作系统中的信号量、关中断操作等方法不能用于多CPU间的互斥访问。对于多CPU对临界资源进行互斥访问,普遍采用自旋锁实现。自旋锁的信号量包括两种状态,分别为空闲状态和被占用状态,空闲状态表示当前临界资源空闲,可以使用;被占用状态表示当前临界资源正在被使用中,需要等待被释放后才能使用。自旋锁的原理是,在临界资源被访问时,等待临界资源的CPU不断轮询检测信号量,直到自旋锁的信号量空闲,该CPU才能获得资源,称为信号量的P操作;CPU访问完临界资源后,释放信号量,称为信号量的V操作。
假设CPUi、CPUj、CPUk先后访问同一临界资源,申请访问资源的顺序是CPUi、CPUj、CPUk,如图1A所示,CPUi首先访问临界资源,在此期间,CPUj、CPUk轮询等待信号量被释放。当CPUi访问临界资源完毕时,如图1B所示,CPUi释放信号量,此时CPUj检测到信号量被释放,开始访问临界资源,而CPUk轮询等待信号量下一次被释放。
以上通过自旋锁实现CPUi、CPUj、CPUk先后访问同一临界资源的具体流程如图2所示,包括以下步骤步骤s101、与临界资源相关的自旋锁的信号量空闲。
步骤s102、CPUi请求访问临界资源时,检测信号量,发现信号量为空闲。
步骤s103、CPUi访问临界资源。
步骤s104、由于CPUi的访问,与临界资源相关的自旋锁的信号量被占用。
步骤s105、CPUj请求访问临界资源时,检测信号量,发现信号量被占用,轮询等待信号量被释放。
步骤s106、CPUk请求访问临界资源时,检测信号量,发现信号量被占用,轮询等待信号量被释放。
步骤s107、CPUi访问临界资源完毕,释放信号量。
步骤s108、与临界资源相关的自旋锁的信号量空闲。
步骤s109、CPUj检测到信号量为空闲。
步骤s110、CPUj访问临界资源。
步骤s111、由于CPUj的访问,与临界资源相关的自旋锁的信号量被占用。
步骤s112、CPUk继续轮询等待信号量被释放。
以上自旋锁方案的缺陷在于,在临界资源被访问期间,等待访问该临界资源的CPU不断轮询等待信号量被释放,一直占用Pipeline资源,大量Pipeline资源浪费在轮询检测上。因为只能通过轮询等待信号量被释放,没有唤醒/挂起机制,因此大大降低了系统的性能。
发明内容
本发明要解决的问题是提供一种实现多CPU对临界资源进行互斥访问的方法和设备,以在支持多CPU对临界资源进行互斥访问的同时,通过唤醒机制提高多CPU处理系统的性能。
为达到上述目的,本发明提供一种实现多CPU对临界资源进行互斥访问的方法,包括以下步骤配置与临界资源对应的消息锁队列的地址并通知各CPU;请求访问所述临界资源的CPU根据所述地址将自身的标识加入所述消息锁队列;所述CPU按照所述消息锁队列中标识的加入顺序访问所述临界资源。
其中,所述CPU按照所述消息锁队列中标识的加入顺序访问所述临界资源的步骤具体为所述请求访问临界资源的CPU根据所述地址将自身的标识加入所述消息锁队列后,若自身的标识前无其他CPU的标识,则所述CPU访问所述临界资源。
其中,所述CPU按照所述消息锁队列中标识的加入顺序访问所述临界资源的步骤具体为所述请求访问临界资源的CPU根据所述地址将自身的标识加入所述消息锁队列后,若自身的标识前有其他CPU的标识,则所述CPU进入挂机状态;所述处于挂机状态的CPU接收到其他CPU发送的通知消息时,进入唤醒状态并访问所述临界资源。
其中,所述CPU访问所述临界资源结束后,还包括访问所述临界资源结束后,所述CPU将自身的标识从所述消息锁队列中删除;所述CPU获取位于所述消息锁队列的队列头的CPU的标识;
所述CPU根据所述标识向下一请求访问所述临界资源的CPU发送通知消息。
其中,接收到所述通知消息的CPU从挂机状态进入唤醒状态并访问所述临界资源。
其中,所述通知消息为资源释放消息。
本发明还提供一种实现多CPU对临界资源进行互斥访问的装置,包括消息锁队列配置模块,用于存储临界资源与消息锁队列地址的对应关系;请求模块,用于在请求访问临界资源时,根据所述消息锁队列配置模块存储的对应关系,将自身CPU的标识加入与所述临界资源对应的消息锁队列;队列获取模块,用于在请求访问临界资源时,根据所述消息锁队列配置模块存储的对应关系,获取与所述临界资源对应的消息锁队列中自身CPU的标识前有无其他CPU的标识,无其他CPU的标识时,向所述临界资源访问模块发送消息;临界资源访问模块,根据接收到的消息访问所述临界资源。
其中,还包括状态切换模块,用于在所述队列获取模块获取到的消息锁队列中自身CPU的标识前有其他CPU的标识时,将当前状态切换为挂机状态;在所述接收模块接收到其他CPU发送的通知消息时,将当前状态切换为唤醒状态并向所述临界资源访问模块发送消息;接收模块,用于在接收到其他CPU发送的通知消息时,通知所述状态切换模块。
其中,还包括删除模块,用于在访问临界资源结束时,根据所述消息锁队列配置模块存储的对应关系,将自身CPU的标识从与所述临界资源对应的消息锁队列中删除;标识获取模块,用于在访问临界资源完成后,获取位于与所述临界资源对应的消息锁队列中下一请求访问所述临界资源的CPU的标识,并将所述下一请求访问所述临界资源的CPU的标识发送到发送模块;
发送模块,用于在接收到所述标识获取模块发送的CPU的标识时,根据所述接收到的CPU的标识通知下一请求访问所述临界资源的CPU。
本发明还提供一种实现多CPU对临界资源进行互斥访问的装置的消息锁,包括队列维护模块,用于维护请求对临界资源进行访问的CPU的标识的队列,并向已经结束访问所述临界资源的CPU提供下一个请求访问所述临界资源的CPU的标识。
与现有技术相比,本发明具有以下优点本发明支持多CPU间对临界资源进行互斥访问,并拥有挂起/唤醒机制,使等待临界资源的CPU能够主动挂起,在临界资源可用时才被唤醒,从而节省了Pipeline资源。
图1A和图1B是现有技术中通过自旋锁实现临界资源互斥访问的示意图;图2是现有技术中通过自旋锁实现临界资源互斥访问的方法流程图;图3是本发明实施例一中实现多CPU对临界资源进行互斥访问的方法的流程图;图4是本发明实施例二中实现多CPU对临界资源进行互斥访问的方法的示意图;图5A和图5B是本发明实施例三中实现多CPU对临界资源进行互斥访问的示意图;图6是本发明实施例三中实现多CPU对临界资源进行互斥访问的方法的流程图;图7是本发明实施例三中实现多CPU对临界资源进行互斥访问的装置结构示意图。
具体实施例方式
本发明的核心在于,多线程处理器中,等待访问临界资源的CPU将自身标识加入消息锁队列后主动挂起等待消息,在一CPU对临界资源的访问完成后,根据消息锁队列主动唤醒等待中的下一个CPU,依次传递,通过唤醒机制实现多CPU对临界资源进行互斥访问。
以下结合附图和具体实施例,对本发明的实施方式作进一步说明。
本发明的实施例一中,一种实现多CPU对临界资源进行互斥访问的方法,如图3所示,包括以下步骤,步骤s201、配置与临界资源对应的消息锁队列的地址并通知各CPU。
步骤s202、请求访问临界资源的CPU根据消息锁队列的地址将自身的标识加入消息锁队列。
步骤s203、CPU按照该消息锁队列中标识的加入顺序访问临界资源。
本发明的实施例二中,通过不同CPU通过消息锁队列访问临界资源的过程,描述本发明实现临界资源进行互斥访问的方法,如图4所示,包括以下步骤步骤s301、对消息锁队列的地址进行配置并通知各CPU。
该消息锁队列的地址可以为系统内存或其他存储单元中的一个指定位置,且该消息锁队列对应特定的临界资源。配置该消息锁队列的地址完毕后,还需通过系统消息等方式将该消息锁队列的地址以及该消息锁队列所对应的临界资源的信息通知系统中的各个CPU。以便系统中的CPU在需要访问该特定的临界资源时,对该消息锁队列进行读取、写入、删除等操作。
步骤s302、CPU申请访问临界资源,将自身的CPU ID插入到消息锁的队列的最后。
消息锁的队列为一FIFO(First Input First Output,先入先出)队列,队列中的内容是等待访问临界资源的CPU标识(CPU_ID)。CPU根据消息锁的队列中的内容,可以得到临界资源的被使用情况以及下一个等待访问临界资源的CPU的信息。
步骤s303、CPU检测消息锁队列中自身CPU_ID前是否存在其他的CPU_ID,如果存在则进行步骤s304,否则进行步骤s306。
步骤s304、CPU挂起,等待资源释放消息。
步骤s305、CPU检测是否接收到资源释放消息,如果接收到则进行步骤s306,否则返回步骤s304。
步骤s306、CPU访问临界资源,此时,CPU获得了临界资源的访问权。
步骤s307、CPU访问临界资源完毕,将自身的CPU_ID从消息锁队列删除。
步骤s308、CPU检测队列中是否有其他CPU_ID,如果存在则进行步骤s309,否则结束。
步骤s309、CPU向消息锁队列头的CPU_ID对应的CPU发送资源释放消息。该资源释放消息为一具有消息代码的硬件消息,通过该代码标识当前消息为一资源释放消息。
本发明的实施例三中,结合具体的应用场景,对本发明的实施方式进行进一步的说明。假设CPUi、CPUj、CPUk获得了与临界资源对应的消息锁队列的地址后,先后访问同一临界资源,申请访问该临界资源的顺序是CPUi、CPUj、CPUk。如图5A所示,CPUi首先访问临界资源,在此期间,CPUj、CPUk将自身的CPU标识加入消息锁队列并挂起。当CPUi访问临界资源完毕时,如图5B所示,CPUi向CPUj发送资源释放消息,CPUj开始访问临界资源,而CPUk仍保持挂机状态。
以上通过消息锁实现CPUi、CPUj、CPUk先后访问同一临界资源的具体流程如图6所示,包括以下步骤步骤s501、与临界资源相关的消息锁的队列为空。
步骤s502、CPUi请求访问临界资源,将CPU_i插入到消息锁的队列。
步骤s503、消息锁的队列中,CPU_i前无其他CPU的标识,CPUi访问临界资源。
步骤s504、与临界资源相关的消息锁队列中包括CPU_i。
步骤s505、CPUj请求访问临界资源,将CPU_j插入到消息锁的队列。此时消息锁队列中依次包括CPU_i、CPU_j,CPUj进入挂机状态。
步骤s506、CPUk请求访问临界资源,将CPU_k插入到消息锁的队列。此时消息锁队列中依次包括CPU_i、CPU_j、CPU_k,CPUk进入挂机状态。
步骤s507、CPUi访问临界资源完毕,将CPU_i从消息锁队列删除。
步骤s508、与临界资源相关的消息锁队列中包括CPU_j、CPU_k。
步骤s509、CPUi向CPUj发送资源释放消息。
步骤s510、CPUj进入唤醒状态,访问临界资源。
步骤s511、与临界资源相关的消息锁队列中包括CPU_j、CPU_k。
步骤s512、CPUj访问临界资源完毕,将CPU_j从消息锁队列删除。
步骤s513、与临界资源相关的消息锁队列中包括CPU_k。
步骤s514、CPUj向CPUk发送资源释放消息。
步骤s515、CPUk进入唤醒状态,访问临界资源。
步骤s516、与临界资源相关的消息锁队列中包括CPU_k。
步骤s517、CPUk访问临界资源完毕,将CPU_k从消息锁队列删除。
步骤s518、与临界资源相关的消息锁的队列为空。
通过使用上述实施例一至实施例三所描述的实现多CPU对临界资源进行互斥访问的方法,通过消息锁队列支持多CPU间对临界资源进行互斥访问,并拥有挂起/唤醒机制,使等待临界资源的CPU能够主动挂起,在临界资源可用时才被唤醒,从而节省了Pipeline资源。
本发明的实施例四中,一种实现多CPU对临界资源进行互斥访问的装置的结构如图7所示,包括消息锁队列配置模块11,请求模块12,队列获取模块13和临界资源访问模块14。具体地消息锁队列配置模块11,用于存储与临界资源对应的消息锁队列的地址,并在其他模块需要调用与临界资源对应的消息锁队列时,提供与临界资源对应的消息锁队列的地址。
请求模块12,用于在请求临界资源时,根据消息锁队列配置模块11存储的对应关系,将自身CPU的标识加入与临界资源对应的消息锁队列。
队列获取模块13,用于在请求访问临界资源时,根据消息锁队列配置模块11存储的对应关系,获取与临界资源对应的消息锁队列中自身CPU的标识前有无其他CPU的标识,无其他CPU的标识时,向临界资源访问模块14发送消息。
临界资源访问模块14,根据接收到的消息访问临界资源。
另外,该装置还包括状态切换模块15和接收模块16。具体地状态切换模块15,用于将CPU在挂机状态与唤醒状态间切换。具体的,在请求访问临界资源时,若队列获取模块13获取到的与该临界资源对应的消息锁队列中自身标识前有其他CPU的标识时,将当前状态切换为挂机状态;在接收模块16接收到其他CPU发送的资源释放消息时,将当前状态切换为唤醒状态并向临界资源访问模块14发送消息。
接收模块16,用于在接收到其他CPU发送的资源释放消息时,通知状态切换模块15。
另外,该装置还包括标识获取模块17,发送模块18和删除模块19。具体地标识获取模块17,用于在访问临界资源完成后,根据消息锁队列配置模块11存储的对应关系,获取位于与该临界资源对应的消息锁队列头的CPU的标识,并将该标识发送到发送模块18。
发送模块18,用于在访问临界资源结束时,根据消息锁队列向下一请求访问临界资源的CPU发送消息。具体的,根据标识获取模块17获取的位于与该临界资源对应的消息锁队列头的CPU的标识,向与该标识对应的CPU发送资源释放消息。
删除模块19,用于在访问临界资源结束时,根据消息锁队列配置模块11存储的对应关系,将自身CPU标识从与该临界资源对应的消息锁队列中删除。
本发明的实施例五中,提供了一种实现多CPU对临界资源进行互斥访问的消息锁,包括队列维护模块,用于维护请求对临界资源进行访问的CPU的标识的队列,通过该队列,实现多CPU对临界资源进行的依次互斥访问。同时,向已经结束访问临界资源的CPU提供了下一个请求访问临界资源的CPU的标识。该消息锁可以为一存储实体中的存储单元,可供不同的CPU读写调用。
通过使用以上实施例四和实施例五所描述的实现多CPU对临界资源进行互斥访问的装置以及消息锁,通过消息锁队列支持多CPU间对临界资源进行互斥访问,并拥有挂起/唤醒机制,使等待临界资源的CPU能够主动挂起,在临界资源可用时才被唤醒,从而节省了Pipeline资源。
以上公开的仅为本发明的几个具体实施例,但是,本发明并非局限于此,任何本领域的技术人员能思之的变化都应落入本发明的保护范围。
权利要求
1.一种实现多CPU对临界资源进行互斥访问的方法,其特征在于,包括以下步骤配置与临界资源对应的消息锁队列的地址并通知各CPU;请求访问所述临界资源的CPU根据所述地址将自身的标识加入所述消息锁队列;所述CPU按照所述消息锁队列中标识的加入顺序访问所述临界资源。
2.如权利要求1所述实现多CPU对临界资源进行互斥访问的方法,其特征在于,所述CPU按照所述消息锁队列中标识的加入顺序访问所述临界资源的步骤具体为所述请求访问临界资源的CPU根据所述地址将自身的标识加入所述消息锁队列后,若自身的标识前无其他CPU的标识,则所述CPU访问所述临界资源。
3.如权利要求1所述实现多CPU对临界资源进行互斥访问的方法,其特征在于,所述CPU按照所述消息锁队列中标识的加入顺序访问所述临界资源的步骤具体为所述请求访问临界资源的CPU根据所述地址将自身的标识加入所述消息锁队列后,若自身的标识前有其他CPU的标识,则所述CPU进入挂机状态;所述处于挂机状态的CPU接收到其他CPU发送的通知消息时,进入唤醒状态并访问所述临界资源。
4.如权利要求2或3所述实现多CPU对临界资源进行互斥访问的方法,其特征在于,所述CPU访问所述临界资源结束后,还包括访问所述临界资源结束后,所述CPU将自身的标识从所述消息锁队列中删除;所述CPU获取位于所述消息锁队列的队列头的CPU的标识;所述CPU根据所述标识向下一请求访问所述临界资源的CPU发送通知消息。
5.如权利要求4所述实现多CPU对临界资源进行互斥访问的方法,其特征在于,接收到所述通知消息的CPU从挂机状态进入唤醒状态并访问所述临界资源。
6.如权利要求3或5所述实现多CPU对临界资源进行互斥访问的方法,其特征在于,所述通知消息为资源释放消息。
7.一种实现多CPU对临界资源进行互斥访问的装置,其特征在于,包括消息锁队列配置模块,用于存储临界资源与消息锁队列地址的对应关系;请求模块,用于在请求访问临界资源时,根据所述消息锁队列配置模块存储的对应关系,将自身CPU的标识加入与所述临界资源对应的消息锁队列;队列获取模块,用于在请求访问临界资源时,根据所述消息锁队列配置模块存储的对应关系,获取与所述临界资源对应的消息锁队列中自身CPU的标识前有无其他CPU的标识,无其他CPU的标识时,向所述临界资源访问模块发送消息;临界资源访问模块,根据接收到的消息访问所述临界资源。
8.如权利要求7所述实现多CPU对临界资源进行互斥访问的装置,其特征在于,还包括状态切换模块,用于在所述队列获取模块获取到的消息锁队列中自身CPU的标识前有其他CPU的标识时,将当前状态切换为挂机状态;在所述接收模块接收到其他CPU发送的通知消息时,将当前状态切换为唤醒状态并向所述临界资源访问模块发送消息;接收模块,用于在接收到其他CPU发送的通知消息时,通知所述状态切换模块。
9.如权利要求7所述实现多CPU对临界资源进行互斥访问的装置,其特征在于,还包括删除模块,用于在访问临界资源结束时,根据所述消息锁队列配置模块存储的对应关系,将自身CPU的标识从与所述临界资源对应的消息锁队列中删除;标识获取模块,用于在访问临界资源完成后,获取位于与所述临界资源对应的消息锁队列中下一请求访问所述临界资源的CPU的标识,并将所述下一请求访问所述临界资源的CPU的标识发送到发送模块;发送模块,用于在接收到所述标识获取模块发送的CPU的标识时,根据所述接收到的CPU的标识通知下一请求访问所述临界资源的CPU。
10.一种实现多CPU对临界资源进行互斥访问的装置的消息锁,其特征在于,包括队列维护模块,用于维护请求对临界资源进行访问的CPU的标识的队列,并向已经结束访问所述临界资源的CPU提供下一个请求访问所述临界资源的CPU的标识。
全文摘要
本发明公开了一种实现多CPU对临界资源进行互斥访问的方法,包括以下步骤配置与临界资源对应的消息锁队列的地址并通知各CPU;请求访问临界资源的CPU根据消息锁队列的地址将自身的标识加入消息锁队列;CPU按照该消息锁队列中标识的加入顺序访问临界资源。本发明还公开了一种实现多CPU对临界资源进行互斥访问的装置和消息锁。通过使用本发明,实现了多CPU间对临界资源进行互斥访问,使等待临界资源的CPU能够主动挂起,在临界资源可用时才被唤醒,从而节省了Pipeline资源。
文档编号G06F9/46GK101051281SQ20071010698
公开日2007年10月10日 申请日期2007年5月16日 优先权日2007年5月16日
发明者李文群 申请人:杭州华三通信技术有限公司