专利名称:并行多核虚拟机的原子指令模拟方法及虚拟机装置的制作方法
技术领域:
本发明涉及虚拟机技术领域,特别涉及一种并行多核虚拟机的原子指令模拟方法及虚拟机装置。
背景技术:
虚拟机(Virtual Machine)是对一种硬件设备进行模拟仿真的软件系统。近年来随着多核CPU的普及,虚拟机也开始增加对于多核CPU的模拟功能。早期主要采用串行的方法模拟多核CUP的运行,即虚拟机是单进程,在微观上以分时间片的方式轮询调度多个CPU,在宏观上模拟多个CPU的并行行为。在开源虚拟机系统(例如Bochs、QEMU、Simple-scalar等)中,均以串行方法模拟执行目标系统中多个CPU。这种方式实现简单,但是所有被模拟的CPU只能共享使用本地的一个CPU资源,每个模拟CPU可利用的CPU资源与总的模拟个数成反比,扩展性差。采用以这种结构实现的多核虚拟机一般难以支持几十个以上的模拟CPU。并行多核虚拟机有效克服了串行结构的局限性。在并行多核虚拟机中,创建多个线程,每个线程分别模拟一个目标CPU。这种方式能够充分利用本地CPU资源。在本地物理CPU个数大于被模拟的CPU个数时,能够得到接近线性的加速比。目前采用这种结构的虚拟机能够以较好的效率模拟几百甚至上千个CPU。并行多核虚拟机需要解决的一个问题是原子访存指令的模拟。原子访存指令是在硬件上实现互斥访存的支持机制,用于为多线程之间的自旋锁、互斥量等同步原语提供最底层的支持。例如,在X86指令中提供了 lock指令缀,CPU保证带有lock前缀的指令以原子方式实现对内存的一次读写操作。在串行结构的多核虚拟机中无需模拟lock的语义,而在并行多核虚拟机中必须保证模拟lock的原子语义,目前主要有三种手段I、加锁即在访存动作之前加锁,访存动作之后解锁。这种手段要求所有访存动作都要包含加锁行为,使得每次访存模拟代价较高,整体效率较低。2、采用本地CPU支持的原子访存指令例如X86的lock,MIPS的ΙΙ/sc,等等。这种方式只能针对特定的硬件平台,可移植性受到限制。3、以数学算法模拟原子指令例如并行研究领域中的CASN等算法。该算法对于使用环境有各方面限制,例如需要提供额外存储空间保存描述符(descriptor)、必须使用特殊函数读写内存等,通用性受到限制。
发明内容
本发明的目的在于提供一种可移植性强、执行效率高的原子访存指令的模拟方法和装置。为实现上述目的,一方面,本发明提供了一种并行多核虚拟机的原子指令模拟方法,该虚拟机根据目标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线程的确认信号后执行原子访存指令。本发明具有下列优点 I.方法通用性好,移植性高。本发明只使用本地操作系统支持的标准线程间通讯机制,不依赖于特定目标指令集,不依赖于特定的平台,对于访存宽度、位置不做任何限制。能够克服加锁、本地原子指令、CASN算法等方式的不足。2.执行效率高。本发明的开销主要体现在线程之间发送消息的代价,据实验测试效率较好,平均每次原子访存模拟代价低于毫秒级。
图I是本发明实施例一种并行多核虚拟机的原子指令模拟方法流程图;图2是本发明实施例一种并行多核虚拟机的原子指令模拟方法示意图;图3是本发明实施例一种虚拟机装置示意图。
具体实施例方式下面结合附图和具体实施方式
对本发明作进一步详细描述。图I是本发明实施例一种并行多核虚拟机的原子指令模拟方法流程图。该方法适用的虚拟机根据目标CPU的内核个数,创建与CPU内核个数相等的多个CPU线程。如图I所示,该方法包括步骤101-105。在步骤101,多个CPU线程中的第一 CPU线程向其他CPU线程发送请求等待信号。具体地,虚拟机在模拟执行原子访存指令时,首先由多个CPU线程中请求执行原子访存指令的一个CPU线程,如第一 CPU线程,向其他CPU线程发送请求等待信号。在步骤102,接收到所述请求等待信号的其它CPU线程在原执行地址暂停,并返回确认信号。具体地,接收到来自第一 CPU线程的请求等待信号的其它CPU线程可以采用忙等待方式或阻塞等待方式在原执行地址暂停,同时向第一 CPU线程返回确认信号。在步骤103,第一 CPU线程接收到所有其他CPU线程的确认信号后执行原子访存指令。具体地,当第一 CPU线程在接收到所有其他CPU线程返回的确认信号后,执行原子访存指令。第一 CPU线程在执行原子访存指令的过程中,其它CPU线程均处于暂停状态,当前只有第一 CPU线程可以访问内存,保证了本次内存访问的原子性。
在步骤104,向处于原执行地址暂停的CPU线程发送撤消等待信号。具体地,当第一 CPU线程执行原子访存指令结束后,则向处于原执行地址暂停的其它CPU线程发送撤消等待信号。在步骤105,接收到所述撤消等待信号 的CPU线程由原执行地址继续执行。具体地,接收到来自第一 CPU线程的撤消等待信号的其他CPU线程由原执行地址继续执行。上述步骤执行结束后,内存单元中的数值与被模拟的实际系统中原子指令执行结束后的内存数值保持一致。本发明实施例保证在任一时刻虚拟机中只有一个CPU线程获取原子指令的访问权。如果在某一时刻有多个CPU线程执行对同一内存单元的原子访问指令,则上述步骤保证最先发出请求等待信号的CPU线程获取内存访问权。直到有某一个CPU线程执行访存结束,向其它CPU线程发出撤消等待信号之后,其他CPU线程才再次竞争内存访问权。各CPU线程的原子指令将以串行方式执行。虚拟机提供了在CPU线程间发送消息的线程通讯机制,例如消息处理函数机制、socket通讯机制、消息队列机制、共享内存机制和windows的消息机制。以下针对线程通讯机制中的消息处理函数机制和socket通讯机制进行描述。在一个例子中,以在Linux操作系统平台上运行的X86虚拟机为例,说明以消息处理函数实现原子访存指令模拟的方法。Linux操作系统提供了线程的基本调用原语,包括线程创建函数(pthread_create)、线程间发送消息函数(pthread_kill)等,满足本方法适用的前提条件。假设虚拟机要模拟4核的X86CPU,则调用pthread_create创建4个独立的CPU线程(编号O 3),每个CPU线程用于模拟一个目标CPU。在每个CPU线程中,调用signal O函数注册三种不同信号(WAIT_REQ、WAIT_ACK、WAIT_END)的处理函数。Linux操作系统一般均提供32种以上的信号供程序使用,CPU线程可以选用任意3个空闲信号代表上述信号类型,例如使用SI⑶SRl代表WAIT_REQ信号、SI⑶SR2代表WAIT_ACK信号和SI⑶SR3代表WAIT_END 信号。假设在某个目标CPU的执行过程中出现一条原子访存指令LOCK INC
其语义为取出地址0x80000002的数据,做加I操作,再存回原处。这一“读取-修改-写回”过程必须具有原子性,即在执行写回操作之前没有其它CPU修改该内存单元的原始值。根据本发明实施例,各CPU线程调用pthread_kill函数以实现信号发送。在PthreacLkill函数的参数中指定不同的信号,用以区分三种不同的信号类型。对于发起WAIT_REQ信号的CPU线程,在执行内存访问动作时只需模拟目标指令的读、写语义,例如以C语言实现的INC指令的模拟语义int*p = 0x80000002 ;*p++;对于接收WAIT_REQ信号的CPU线程,Linux操作系统以中断方式暂停原来CPU线程的执行,自动转入消息处理函数。CPU线程在消息处理函数中执行暂停动作,直到退出消息处理函数之后,在Linux操作系统支持下自动跳回WAIT_REQ信号到来之前的中断位置,继续原来的执行线索。至此,基于消息处理函数机制的一次线程间通信方法执行结束。在另一例子中,Windows/Linux操作系统中均支持SOCKET通讯机制,本发明实施例的线程间通信方法同样可以基于这种SOCKET通讯机制来实现。同样假设虚拟机要模拟4核的X86CPU,则创建4个独立的CPU线程(编号O 3),每个CPU线程用于模拟一个目标CPU。虚拟机在两个CPU线程中使用网络报文来传递线程间的通讯内容,在通讯内容中以不同的数据类型代表三种不同信号(WAIT_REQ、WAIT_ACK、WAIT_END)。
各个CPU线程通过调用SOCKET函数以实现消息监听调用socket O函数创建一个用于监听的SOCKET,再调用bind()函数绑定到某一个网络端口,最后调用IistenO函数开始监听来自这一网络端口的全部数据请求。各CPU线程通过调用SOCKET函数以实现消息发送调用connect O函数向目标CPU线程已经监听的网络端口建立连接,调用SendO函数向目标线程的网络端口发送数据通讯内容。在数据通讯内容中指定不同的标识,用以区分三种不同的信号(WAIT_REQ、WAIT_ACK、WAIT_END)类型。目标CPU线程在接收到连接请求时,调用accpetO函数确认连接请求,再调用recvO函数接收数据通讯内容。至此,基于SOCKET通讯机制的一次线程间通信方法执行结束。在本发明实施例中,以消息处理函数机制和socket通讯机制为例来说明本发明的线程间通讯方法,应当理解,依照本发明方法,可以采用其它任何形式的线程间通讯(例如Windows的消息,Unix/Linux的消息队列、共享内存等),其都具有同样的结构和方式,这对于本领域技术人员来说是可以胜任的。图2是本发明实施例一种并行多核虚拟机的原子指令模拟方法示意图。如图2所
示,CPU执行多个线程(CPU线程O、CPU线程1,......,CPU线程η),每个CPU线程模拟一
个目标CPU上的指令执行任务。目标CPU的指令集中包含原子访存指令。在图2中,I表示在一次原子访存模拟过程中,发起者CPU线程的执行步骤;2表示发起者CPU线程向其他CPU线程发送请求等待信号(WAIT_RE0) ;3表示发起者CPU线程等待其他CPU线程返回确认信号(WAIT_ACK) ;4表示其他CPU线程返回的确认信号(WAIT_ACK) ;5表示返回确认信号(WAIT_ACK)的CPU线程处于原执行地址暂停;6表示发起者CPU线程执行原子访问动作;7表示发起者向其他CPU线程发送撤消等待信号(WAIT_END)。以伪代码描述发起者CPU线程和其它CPU线程的执行行为如下
权利要求
1.一种并行多核虚拟机的原子指令模拟方法,所述虚拟机根据目标CPU的内核个数,创建与所述CPU内核个数相等的多个CPU线程,其特征在于,所述方法包括以下步骤 所述多个CPU线程中的第一 CPU线程向其他CPU线程发送请求等待信号; 接收到所述请求等待信号的其它CPU线程在原执行地址暂停,并返回确认信号; 所述第一 CPU线程接收到所有其他CPU线程的确认信号后执行原子访存指令; 向处于原执行地址暂停的CPU线程发送撤消等待信号; 接收到所述撤消等待信号的CPU线程由原执行地址继续执行。
2.根据权利要求I所述的ー种并行多核虚拟机的原子指令模拟方法,其特征在于,所述虚拟机提供在CPU线程间发送消息的通讯机制。
3.根据权利要求2所述的ー种并行多核虚拟机的原子指令模拟方法,其特征在于,所述在CPU线程间发送消息的通讯机制是消息队列机制、共享内存机制、windows的消息机制和socket通讯机制中的一种。
4.根据权利要求I所述的ー种并行多核虚拟机的原子指令模拟方法,其特征在于,所述接收到请求等待信号的CPU线程以忙等待方式或者以阻塞等待方式在原执行地址暂停。
5.根据权利要求I所述的ー种并行多核虚拟机中基于线程同步的原子指令模拟方法,其特征在于,所述CPU线程在执行原子访存指令时,其它CPU线程处于暂停状态。
6.一种虚拟机装置,其特征在于,包括 线程创建模块,用于根据目标CPU的内核个数,创建与所述CPU内核个数相等的多个CPU线程,所述多个CPU线程包括第一 CPU线程和其他CPU线程; 线程调度模块,用于调度所述多个CPU线程,其中,所述第一 CPU线程向其他CPU线程发送请求等待信号,接收到所述请求等待信号的其它(PU线程在原执行地址暂停,并返回确认信号,所述第一 CPU线程在执行原子访存指令后,向处于原执行地址暂停的CPU线程发送撤消等待信号; 执行模块,用于当所述第一 CPU线程接收到所有其他CPU线程的确认信号后执行原子访存指令。
7.根据权利要求6所述的ー种虚拟机装置,其特征在于,所述线程调度模块采用的通讯机制是消息队列机制、共享内存机制、windows的消息机制和socket通讯机制中的ー种。
8.根据权利要求6所述的ー种虚拟机装置,其特征在干,所述线程调度模块采用忙等待方式或者阻塞等待方式使接收到所述请求等待信号的CPU线程在原执行地址暂停。
全文摘要
本发明公开了一种并行多核虚拟机的原子指令模拟方法及虚拟机装置。虚拟机根据目标CPU的内核个数,创建与CPU内核个数相等的多个CPU线程,方法步骤包括所述多个CPU线程中的第一CPU线程向其他CPU线程发送请求等待信号;接收到所述请求等待信号的其它CPU线程在原执行地址暂停,并返回确认信号;第一CPU线程接收到所有其他CPU线程的确认信号后执行原子访存指令;向处于原执行地址暂停的CPU线程发送撤消等待信号;接收到所述撤消等待信号的CPU线程由原执行地址继续执行。本发明具有较高的通用性和执行效率。
文档编号G06F9/455GK102662730SQ201210127348
公开日2012年9月12日 申请日期2012年4月26日 优先权日2012年4月26日
发明者靳国杰, 高翔 申请人:龙芯中科技术有限公司