首页> 中国专利> 并行多核虚拟机的原子指令模拟方法及虚拟机装置

并行多核虚拟机的原子指令模拟方法及虚拟机装置

摘要

本发明公开了一种并行多核虚拟机的原子指令模拟方法及虚拟机装置。虚拟机根据目标CPU的内核个数,创建与CPU内核个数相等的多个CPU线程,方法步骤包括:所述多个CPU线程中的第一CPU线程向其他CPU线程发送请求等待信号;接收到所述请求等待信号的其它CPU线程在原执行地址暂停,并返回确认信号;第一CPU线程接收到所有其他CPU线程的确认信号后执行原子访存指令;向处于原执行地址暂停的CPU线程发送撤消等待信号;接收到所述撤消等待信号的CPU线程由原执行地址继续执行。本发明具有较高的通用性和执行效率。

著录项

  • 公开/公告号CN102662730A

    专利类型发明专利

  • 公开/公告日2012-09-12

    原文格式PDF

  • 申请/专利权人 龙芯中科技术有限公司;

    申请/专利号CN201210127348.8

  • 发明设计人 靳国杰;高翔;

    申请日2012-04-26

  • 分类号G06F9/455(20060101);G06F9/38(20060101);

  • 代理机构11309 北京亿腾知识产权代理事务所;

  • 代理人陈霁

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

  • 入库时间 2023-12-18 06:28:50

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2015-05-27

    授权

    授权

  • 2012-11-07

    实质审查的生效 IPC(主分类):G06F9/455 申请日:20120426

    实质审查的生效

  • 2012-09-12

    公开

    公开

说明书

技术领域

本发明涉及虚拟机技术领域,特别涉及一种并行多核虚拟机的原子 指令模拟方法及虚拟机装置。

背景技术

虚拟机(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的原子语义,目前主要有三 种手段:

1、加锁:即在访存动作之前加锁,访存动作之后解锁。这种手段 要求所有访存动作都要包含加锁行为,使得每次访存模拟代价较高,整 体效率较低。

2、采用本地CPU支持的原子访存指令:例如X86的lock,MIPS的 11/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线程的确认信号后执行原子访存指令。

本发明具有下列优点:

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线程 可以采用忙等待方式或阻塞等待方式在原执行地址暂停,同时向第一 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线程(编号0~3),每个CPU线程用于模拟一个目标CPU。 在每个CPU线程中,调用signal()函数注册三种不同信号(WAIT_REQ、 WAIT_ACK、WAIT_END)的处理函数。Linux操作系统一般均提供32种以 上的信号供程序使用,CPU线程可以选用任意3个空闲信号代表上述信 号类型,例如使用SIGUSR1代表WAIT_REQ信号、SIGUSR2代表WAIT_ACK 信号和SIGUSR3代表WAIT_END信号。

假设在某个目标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线程的执行,自动转入消息处理函数。CPU线程在消息处理 函数中执行暂停动作,直到退出消息处理函数之后,在Linux操作系统 支持下自动跳回WAIT_REQ信号到来之前的中断位置,继续原来的执行 线索。至此,基于消息处理函数机制的一次线程间通信方法执行结束。

在另一例子中,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线程n),每个CPU线程模拟一个目标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线程, 其中,第一CPU线程向其他CPU线程发送请求等待信号,接收到请求等 待信号的其它CPU线程在原执行地址暂停,并向第一CPU线程返回确认 信号,并向处于原执行地址暂停的CPU线程发送撤消等待信号。

线程调度模块22可以采用忙等待方式或阻塞等待方式使用接收到 请求等待信号的其他CPU线程在原执行地址暂停。

线程调度模块22可以采用消息处理函数机制、socket通讯机制、 消息队列机制、共享内存机制和windows的消息机制等来实现CPU线程 间的通讯。有关CPU线程间的通讯机制在上文已介绍,在此不再赘述。

执行模块23用于当第一CPU线程接收到所有其他CPU线程的确认 信号后执行原子访存指令。

最后应说明的是:以上实施例仅用以说明而非限制本发明的技术方 案,尽管参照上述实施例对本发明进行了详细说明,本领域的普通技术 人员应当理解:依然可以对本发明进行修改或者等同替换,而不脱离本 发明的精神和范围的任何修改或局部替换,其均应涵盖在本发明的权利 要求范围当中。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号