2024年6月12日发(作者:)

(19)中华人民共和国国家知识产权局

(12)发明专利说明书

(21)申请号 CN2.8

(22)申请日 2012.04.26

(71)申请人 龙芯中科技术有限公司

地址 100190 北京市海淀区中关村科学院南路10号

(72)发明人 靳国杰 高翔

(74)专利代理机构 北京亿腾知识产权代理事务所

代理人 陈霁

(51)

G06F9/455

G06F9/38

(10)申请公布号 CN 102662730 A

(43)申请公布日 2012.09.12

权利要求说明书 说明书 幅图

(54)发明名称

并行多核虚拟机的原子指令模拟方

法及虚拟机装置

(57)摘要

本发明公开了一种并行多核虚拟机

的原子指令模拟方法及虚拟机装置。虚拟

机根据目标CPU的内核个数,创建与CPU

内核个数相等的多个CPU线程,方法步骤

包括:所述多个CPU线程中的第一CPU

线程向其他CPU线程发送请求等待信号;

接收到所述请求等待信号的其它CPU线程

在原执行地址暂停,并返回确认信号;第

一CPU线程接收到所有其他CPU线程的

确认信号后执行原子访存指令;向处于原

执行地址暂停的CPU线程发送撤消等待信

号;接收到所述撤消等待信号的CPU线程

由原执行地址继续执行。本发明具有较高

的通用性和执行效率。

法律状态

法律状态公告日

法律状态信息

法律状态

权 利 要 求 说 明 书

1.一种并行多核虚拟机的原子指令模拟方法,所述虚拟机根据目

所述多个CPU线程中的第一CPU线程向其他CPU线程发送请求等待

接收到所述请求等待信号的其它CPU线程在原执行地址暂停,并返

所述第一CPU线程接收到所有其他CPU线程的确认信号后执行原子

向处于原执行地址暂停的CPU线程发送撤消等待信号;

接收到所述撤消等待信号的CPU线程由原执行地址继续执行。

2.根据权利要求1所述的一种并行多核虚拟机的原子指令模拟方

3.根据权利要求2所述的一种并行多核虚拟机的原子指令模拟方

访存指令;

回确认信号;

信号;

标CPU的内核个数,创建与所述CPU内核个数相等的多个CPU线程,其

特征在于,所述方法包括以下步骤:

法,其特征在于,所述虚拟机提供在CPU线程间发送消息的通讯机制。

法,其特征在于,所述在CPU线程间发送消息的通讯机制是消息队列机

制、共享内存机制、windows的消息机制和socket通讯机制中的一种。

4.根据权利要求1所述的一种并行多核虚拟机的原子指令模拟方

5.根据权利要求1所述的一种并行多核虚拟机中基于线程同步的

6.一种虚拟机装置,其特征在于,包括:

法,其特征在于,所述接收到请求等待信号的CPU线程以忙等待方式或

者以阻塞等待方式在原执行地址暂停。

原子指令模拟方法,其特征在于,所述CPU线程在执行原子访存指令时,

其它CPU线程处于暂停状态。

线程创建模块,用于根据目标CPU的内核个数,创建与所述CPU内

线程调度模块,用于调度所述多个CPU线程,其中,所述第一CPU

核个数相等的多个CPU线程,所述多个CPU线程包括第一CPU线程和其

他CPU线程;

线程向其他CPU线程发送请求等待信号,接收到所述

它CPU线程在原执行地址暂停,并返回确认信

执行原子访存指令后,向处于原执行地址

信号;

请求等待信号的其

号,所述第一CPU线程在

暂停的CPU线程发送撤消等待

执行模块,用于当所述第一CPU线程接收到所有其他CPU线程的确

认信号后执行原子访存指令。

7.根据权利要求6所述的一种虚拟机装置,其特征在于,所述线

8.根据权利要求6所述的一种虚拟机装置,其特征在于,所述线

程调度模块采用的通讯机制是消息队列机制、共享内存机制、windows

的消息机制和socket通讯机制中的一种。

程调度模块采用忙等待方式或者阻塞等待方式使接收到所述请求等待

信号的CPU线程在原执行地址暂停。

说 明 书

技术领域

本发明涉及虚拟机技术领域,特别涉及一种并行多核虚拟机的原子

拟方法及虚拟机装置。

背景技术

虚拟机(Virtual Machine)是对一种硬件设备进行模拟仿真的软

来随着多核CPU的普及,虚拟机也开始增加对于多核CPU

早期主要采用串行的方法模拟多核CUP的运行,即虚拟机

微观上以分时间片的方式轮询调度多个CPU,在宏观上模

的并行行为。在开源虚拟机系统(例如Bochs、QEMU、

等)中,均以串行方法模拟执行目标系统中多个CPU。

但是所有被模拟的CPU只能共享使用本地的一个

件系统。近年

的模拟功能。

是单进程,在

拟多个CPU

Simple-scalar

指令模

这种方式实现简单,

CPU资源,每个模

展性差。采用以这种

模拟CPU。

拟CPU可利用的CPU资源与总的模拟个数成反比,扩

结构实现的多核虚拟机一般难以支持几十个以上的

并行多核虚拟机有效克服了串行结构的局限性。在并行多核虚拟机

建多个线程,每个线程分别模拟一个目标CPU。这种方式能够充

中,创

分利用

能够得

效率模

本地CPU资源。在本地物理CPU个数大于被模拟的CPU个数时,

到接近线性的加速比。目前采用这种结构的虚拟机能够以较好的

拟几百甚至上千个CPU。

并行多核虚拟机需要解决的一个问题是原子访存指令的模拟。原子

令是在硬件上实现互斥访存的支持机制,用于为多线程之间的自

互斥量等同步原语提供最底层的支持。例如,在X86指令中提供

指令缀,CPU保证带有lock前缀的指令以原子方式实现对内存

访存指

旋锁、

了lock

的一次读写操作。在串行结构的多核虚拟机中无需模拟lock

而在并行多核虚拟机中必须保证模拟lock的原子语义,目前

种手段:

的语义,

主要有三

1、加锁:即在访存动作之前加锁,访存动作之后解锁。这种手段

有访存动作都要包含加锁行为,使得每次访存模拟代价较高,整

较低。

要求所

体效率

2、采用本地CPU支持的原子访存指令:例如X86的lock,MIPS的

等等。这种方式只能针对特定的硬件平台,可移植性受到限制。

3、以数学算法模拟原子指令:例如并行研究领域中的CASN等算法。

发明内容

本发明的目的在于提供一种可移植性强、执行效率高的原子访存指

拟方法和装置。

为实现上述目的,一方面,本发明提供了一种并行多核虚拟机的原

模拟方法,该虚拟机根据目标CPU的内核个数,创建与CPU内核

等的多个CPU线程。该方法步骤包括:所述多个CPU线程中的第

CPU线程向其他CPU线程发送请求等待信号;接收到所述请求等待的

11/sc,

该算法对于使用环境有各方面限制,例如需要提供额外存储空间保存描

述符(descriptor)、必须使用特殊函数读写内存等,通用性受到限制。

令的模

子指令

个数相

其它CPU线程在原执行地址暂停,并返回确认信号;第一CPU线程接收

到所有其他CPU线程的确认信号后执行原子访存指令;向处于原执行地

址暂停的CPU线程发送撤消等待信号;接收到所述撤消等待信号的CPU

线程由原执行地址继续执行。

另一方面,本发明提供了一种虚拟机装置,包括线程创建模块、线

模块和执行模块。线程创建模块用于根据目标CPU的内核个数,

程调度

创建与

第一

的信息

所述CPU内核个数相等的多个CPU线程,所述多个CPU线程包括

CPU线程和其他CPU线程;线程调度模块用于所述多个CPU线程间

交互,其中,所述第一CPU线程向其他CPU线程发送请求等待信

号,接收到所述请求等待信号的其它CPU线程在原执行地址

回确认信号,所述第一CPU线程在执行原子访存指令后,向

地址暂停的CPU线程发送撤消等待信号;执行模块用于当所

线程接收到所有其他CPU线程的确认信号后执行原子访存指

暂停,并返

处于原执行

述第一CPU

令。

本发明具有下列优点:

1.方法通用性好,移植性高。本发明只使用本地操作系统支持的 标准线

对于访

算法等

程间通讯机制,不依赖于特定目标指令集,不依赖于特定的平台,

存宽度、位置不做任何限制。能够克服加锁、本地原子指令、CASN

方式的不足。

2.执行效率高。本发明的开销主要体现在线程之间发送消息的代

实验测试效率较好,平均每次原子访存模拟代价低于毫秒级。

附图说明

图1是本发明实施例一种并行多核虚拟机的原子指令模拟方法流程

图2是本发明实施例一种并行多核虚拟机的原子指令模拟方法示意

价,据

图;

图;

图3是本发明实施例一种虚拟机装置示意图。

具体实施方式

下面结合附图和具体实施方式对本发明作进一步详细描述。

图1是本发明实施例一种并行多核虚拟机的原子指令模拟方法流程

方法适用的虚拟机根据目标CPU的内核个数,创建与CPU内核个

的多个CPU线程。如图1所示,该方法包括步骤101-105。

在步骤101,多个CPU线程中的第一CPU线程向其他CPU线程发送

待信号。

具体地,虚拟机在模拟执行原子访存指令时,首先由多个CPU线程

执行原子访存指令的一个CPU线程,如第一CPU线程,向其他CPU

线程发送请求等待信号。

在步骤102,接收到所述请求等待信号的其它CPU线程在原执行地

并返回确认信号。

具体地,接收到来自第一CPU线程的请求等待信号的其它CPU线程

用忙等待方式或阻塞等待方式在原执行地址暂停,同时向第一

线程返回确认信号。

在步骤103,第一CPU线程接收到所有其他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线程(编号0~3),每个CPU线程用于模拟一个目标CPU。

CPU线程中,调用signal()函数注册三种不同信号(WAIT_REQ、

WAIT_ACK、WAIT_END)的处理函数。Linux操作系统一般均提供32种以

上的信号供程序使用,CPU线程可以选用任意3个空闲信号代表上述信

号类型,例如使用SIGUSR1代表WAIT_REQ信号、SIGUSR2代表

信号和SIGUSR3代表WAIT_END信号。 WAIT_ACK

假设在某个目标CPU的执行过程中出现一条原子访存指令:

LOCK INC[Ox80000002]

其语义为:取出地址Ox80000002的数据,做加1操作,再存回原

一“读取-修改-写回”过程必须具有原子性,即在执行写回操作

CPU修改该内存单元的原始值。

根据本发明实施例,各CPU线程调用pthread_kill函数以实现信

在pthread_kill函数的参数中指定不同的信号,用以区分三

类型。

处。这

之前没有其它

号发送。

种不同的信号

对于发起WAIT_REQ信号的CPU线程,在执行内存访问动作时只需

标指令的读、写语义,例如以C语言实现的INC指令的模拟语义:

int*p=Ox80000002;

*p++;

对于接收WAIT_REQ信号的CPU线程,Linux操作系统以中断方式暂

模拟目

停原来CPU线程的执行,自动转入消息处理函数。

函数中执行暂停动作,直到退出消息处理函数之

支持下自动跳回WAIT_REQ信号到来之前的中

线索。至此,基于消息处理函数机制的一次线程

CPU线程在消息处理

后,在Linux操作系统

断位置,继续原来的执行

间通信方法执行结束。

在另一例子中,Windows/Linux操作系统中均支持SOCKET通讯机

发明实施例的线程间通信方法同样可以基于这种SOCKET通讯机

现。

同样假设虚拟机要模拟4核的X86CPU,则创建4个独立的CPU线

号0~3),每个CPU线程用于模拟一个目标CPU。虚拟机在两个

制,本

制来实

程(编

CPU

同的数

线程中使用网络报文来传递线程间的通讯内容,在通讯内容中以不

据类型代表三种不同信号(WAIT_REQ、WAIT_ACK、WAIT_END)。

各个CPU线程通过调用SOCKET函数以实现消息监听:调用socket()

函数创建一个用于监听的SOCKET,再调用bind()函数绑定到某一个网

络端口,最后调用listen()函数开始监听来自这一网络端口的全部数据

请求。

各CPU线程通过调用SOCKET函数以实现消息发送:调用connect()

目标CPU线程已经监听的网络端口建立连接,调用send()函数

线程的网络端口发送数据通讯内容。在数据通讯内容中指定不同

函数向

向目标

的标识,

类型。用以区分三种不同的信号(WAIT_REQ、WAIT_ACK、WAIT_END)

目标CPU线程在接收到连接请求时,调用accpet()函数确认连接

再调用recv()函数接收数据通讯内容。至此,基于SOCKET通讯

一次线程间通信方法执行结束。

在本发明实施例中,以消息处理函数机制和socket通讯机制为例

本发明的线程间通讯方法,应当理解,依照本发明方法,可以采

任何形式的线程间通讯(例如Windows的消息,Unix/Linux的消

共享内存等),其都具有同样的结构和方式,这对于本领域技

可以胜任的。

图2是本发明实施例一种并行多核虚拟机的原子指令模拟方法示意

图2所示,CPU执行多个线程(CPU线程0、CPU线程1,......,

请求,

机制的

来说明

用其它

息队列、

术人员来说是

图。如

CPU

CPU线程n),每个CPU线程模拟一个目标CPU上的指令执行任务。目标

的指令集中包含原子访存指令。

在图2中,1表示在一次原子访存模拟过程中,发起者CPU线程的

骤;2表示发起者CPU线程向其他CPU线程发送请求等待信号

执行步

(WAIT_REO);3表示发起者CPU线程等待其他CPU线程返回确认信号

(WAIT_ACK);4表示其他CPU线程返回的确认信号(WAIT_ACK);5表

示返回确认信号(WAIT_ACK)的CPU线程处于原执行地址暂停;6表示

发起者CPU线程执行原子访问动作;7表示发起者向其他CPU线程发送

撤消等待信号(WAIT_END)。

以伪代码描述发起者CPU线程和其它CPU线程的执行行为如下:

通过上述实施例的描述,验证了本发明实施例具有适用于并行多核

的完善功能,以及高可移植性、高效率的明显优点,可行性好。

图3是本发明实施例一种虚拟机装置示意图。如图3所示,虚拟机

括线程创建模块21、线程调度模块22和执行模块23。

线程创建模块21用于根据目标CPU的内核个数,创建与CPU内核

等的多个CPU线程,所述多个CPU线程包括请求执行原子访存指

一CPU线程和其他CPU线程。

线程调度模块22用于调度由线程创建模块21创建的多个CPU线程,

线程调度模块22可以采用忙等待方式或阻塞等待方式使用接收到

待信号的其他CPU线程在原执行地址暂停。

线程调度模块22可以采用消息处理函数机制、socket通讯机制、

列机制、共享内存机制和windows的消息机制等来实现CPU线程

讯。有关CPU线程间的通讯机制在上文已介绍,在此不再赘述。

执行模块23用于当第一CPU线程接收到所有其他CPU线程的确认

执行原子访存指令。

信号后

消息队

间的通

请求等

其中,第一CPU线程向其他CPU线程发送请求等待信号,接收到请求等

待信号的其它CPU线程在原执行地址暂停,并向第一CPU线程返回确认

信号,并向处于原执行地址暂停的CPU线程发送撤消等待信号。

个数相

令的第

装置包

虚拟机

最后应说明的是:以上实施例仅用以说明而非限制本发明的技术方

管参照上述实施例对本发明进行了详细说明,本领域的普通技术

当理解:依然可以对本发明进行修改或者等同替换,而不脱离本

精神和范围的任何修改或局部替换,其均应涵盖在本发明的权利

案,尽

人员应

发明的

要求范

围当中。