CN110795231B - 一种虚拟cpu的处理方法及装置 - Google Patents
一种虚拟cpu的处理方法及装置 Download PDFInfo
- Publication number
- CN110795231B CN110795231B CN201810882095.2A CN201810882095A CN110795231B CN 110795231 B CN110795231 B CN 110795231B CN 201810882095 A CN201810882095 A CN 201810882095A CN 110795231 B CN110795231 B CN 110795231B
- Authority
- CN
- China
- Prior art keywords
- spin cycle
- pause instruction
- spin
- virtual cpu
- executing
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
- 238000003672 processing method Methods 0.000 title abstract description 12
- 238000000034 method Methods 0.000 claims abstract description 44
- 238000003860 storage Methods 0.000 claims description 51
- 230000015654 memory Effects 0.000 claims description 22
- 238000004590 computer program Methods 0.000 claims description 5
- 230000006870 function Effects 0.000 abstract description 11
- 238000005516 engineering process Methods 0.000 description 20
- 238000010586 diagram Methods 0.000 description 5
- 230000008569 process Effects 0.000 description 5
- 239000002699 waste material Substances 0.000 description 4
- 230000007246 mechanism Effects 0.000 description 3
- 230000008901 benefit Effects 0.000 description 2
- 230000005540 biological transmission Effects 0.000 description 2
- 230000003287 optical effect Effects 0.000 description 2
- 230000009466 transformation Effects 0.000 description 2
- 238000000844 transformation Methods 0.000 description 2
- 230000007704 transition Effects 0.000 description 2
- 230000004888 barrier function Effects 0.000 description 1
- 230000008859 change Effects 0.000 description 1
- 230000001186 cumulative effect Effects 0.000 description 1
- 238000013500 data storage Methods 0.000 description 1
- 238000001514 detection method Methods 0.000 description 1
- 230000007717 exclusion Effects 0.000 description 1
- 239000012634 fragment Substances 0.000 description 1
- 230000006872 improvement Effects 0.000 description 1
- 230000014759 maintenance of location Effects 0.000 description 1
- 238000007726 management method Methods 0.000 description 1
- 230000004048 modification Effects 0.000 description 1
- 238000012986 modification Methods 0.000 description 1
- 238000012544 monitoring process Methods 0.000 description 1
- 230000003068 static effect Effects 0.000 description 1
- 230000001960 triggered effect Effects 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/50—Allocation of resources, e.g. of the central processing unit [CPU]
- G06F9/5061—Partitioning or combining of resources
- G06F9/5066—Algorithms for mapping a plurality of inter-dependent sub-tasks onto a plurality of physical CPUs
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Executing Machine-Instructions (AREA)
Abstract
本申请公开了一种虚拟CPU的处理方法及装置。其中虚拟CPU的处理方法包括:确定虚拟CPU在同一个自旋循环中执行PAUSE指令的次数;判断所述执行PAUSE指令的次数是否满足次数条件;如果所述执行PAUSE指令的次数满足次数条件,则将所述虚拟CPU从所述虚拟CPU所占用的物理CPU资源上移除。采用本申请提供的方法,解决了当虚拟机中存在大量中断的时候,PLE功能失效的问题。
Description
技术领域
本申请涉及虚拟化技术领域,具体涉及一种虚拟CPU的处理方法及装置。
背景技术
云计算已经成为现代信息技术产业的核心技术框架,未来越来越多的信息技术应用会部署在云上。云计算的核心技术就是虚拟化。
自旋锁,即spin lock,是用于保护共享资源的一种锁机制。在虚拟机中,CPU在获取自旋锁失败的时候,会一直处于忙等待状态。虽然CPU制造厂商Intel在自旋锁的实现中引入了PAUSE指令,可以提高自旋锁的性能,并且在一定程度上降低了CPU忙等待的功耗,但是这些性能提高还不能满足要求。
为了提高物理CPU的利用率,Intel引入了PLE(Pause-Loop Exiting)技术。PLE技术是指当虚拟机监控程序发现虚拟CPU一直在进行忙等待,且忙等待的时间超过了预定的阈值,则虚拟机监控程序将该虚拟CPU上的物理CPU处理走,被处理走的物理CPU用于运行其他虚拟CPU或者其他任务。这样就避免了虚拟CPU一直处于忙等待时,物理CPU资源的浪费。但是目前Intel的PLE也存在问题,即当虚拟机中存在大量中断的时候,PLE功能就会失效。
发明内容
本申请提供一种虚拟CPU的处理方法及装置,以解决当虚拟机中存在大量中断的时候,PLE的功能失效的问题。
本申请提供的虚拟CPU的处理方法,包括:
确定虚拟CPU在同一个自旋循环中执行PAUSE指令的次数;
判断所述执行PAUSE指令的次数是否满足次数条件;
如果所述执行PAUSE指令的次数满足次数条件,则将所述虚拟CPU从所述虚拟CPU所占用的物理CPU资源上移除。
优选的,所述确定虚拟CPU在同一个自旋循环中执行PAUSE指令的次数,包括:
判断准备执行的PAUSE指令对应的自旋循环是否为之前执行的PAUSE指令对应的自旋循环,如果是,则针对所述执行PAUSE指令的次数进行递增操作,否则,针对所述执行PAUSE指令的次数进行重新计数。
优选的,所述判断准备执行的PAUSE指令对应的自旋循环是否为之前执行的PAUSE指令对应的自旋循环,包括:判断准备执行的PAUSE指令对应的第一自旋循环标识与第一存储空间预先存储的与之前执行的PAUSE指令对应的第二自旋循环标识是否相同;
所述如果是,则针对所述执行PAUSE指令的次数进行递增操作,包括:如果所述第一自旋循环标识与所述第二自旋循环标识相同,则针对所述执行PAUSE指令的次数进行递增操作;
所述否则,针对所述执行PAUSE指令的次数进行重新计数,包括:如果所述第一自旋循环标识与所述第二自旋循环标识不相同,则针对所述执行PAUSE指令的次数进行重新计数。
优选的,还包括:如果所述第一存储空间未存储任何一个自旋循环标识,则将所述第一自旋循环标识存入所述第一存储空间。
优选的,还包括:如果所述第一存储空间未存储任何一个自旋循环标识,则针对所述执行PAUSE指令的次数进行递增操作。
优选的,如果所述第一自旋循环标识与所述第二自旋循环标识不相同,则将所述第一自旋循环标识写入所述第一存储空间。
优选的,所述第一存储空间为MSR。
优选的,所述MSR位于虚拟CPU的Pause Control模块中。
优选的,还包括:
当虚拟CPU无法获取自旋锁时,在进入所述准备执行的PAUSE指令对应的自旋循环之前,获取操作系统为所述准备执行的PAUSE指令对应的自旋循环分配的所述第一自旋循环标识。
优选的,针对不同的自旋循环采用不同的自旋循环标识。
优选的,所述判断所述执行PAUSE指令的次数是否满足次数条件,包括:
判断所述执行PAUSE指令的次数是否达到次数阈值;
所述执行PAUSE指令的次数满足次数条件包括:所述执行PAUSE指令的次数达到所述次数阈值。
优选的,还包括:如果所述执行PAUSE指令的次数不满足次数条件,则所述虚拟CPU继续在所述同一个自旋循环中运行。
优选的,所述将所述虚拟CPU从所述虚拟CPU所占用的物理CPU资源上移除,包括:通过执行VM Exit操作将所述虚拟CPU从所述虚拟CPU所占用的物理CPU资源上移除。
相应的,本申请还提供一种虚拟CPU的处理装置,包括:
确定单元,用于确定虚拟CPU在同一个自旋循环中执行PAUSE指令的次数;
判断单元,用于判断所述执行PAUSE指令的次数是否满足次数条件;
移除单元,用于如果所述执行PAUSE指令的次数满足次数条件,则将所述虚拟CPU从所述虚拟CPU所占用的物理CPU资源上移除。
优选的,所述确定单元,具体用于:
判断准备执行的PAUSE指令对应的自旋循环是否为之前执行的PAUSE指令对应的自旋循环,如果是,则针对所述执行PAUSE指令的次数进行递增操作,否则,针对所述执行PAUSE指令的次数进行重新计数。
优选的,所述判断准备执行的PAUSE指令对应的自旋循环是否为之前执行的PAUSE指令对应的自旋循环,包括:判断准备执行的PAUSE指令对应的第一自旋循环标识与第一存储空间预先存储的与之前执行的PAUSE指令对应的第二自旋循环标识是否相同;
所述如果是,则针对所述执行PAUSE指令的次数进行递增操作,包括:如果所述第一自旋循环标识与所述第二自旋循环标识相同,则针对所述执行PAUSE指令的次数进行递增操作;
所述否则,针对所述执行PAUSE指令的次数进行重新计数,包括:如果所述第一自旋循环标识与所述第二自旋循环标识不相同,则针对所述执行PAUSE指令的次数进行重新计数。
优选的,自旋循环标识存入单元,具体用于:如果所述第一存储空间未存储任何一个自旋循环标识,则将所述第一自旋循环标识存入所述第一存储空间。
优选的,递增操作单元,具体用于:如果所述第一存储空间未存储任何一个自旋循环标识,则针对所述执行PAUSE指令的次数进行递增操作。
优选的,写入单元,具体用于:如果所述第一自旋循环标识与所述第二自旋循环标识不相同,则将所述第一自旋循环标识写入所述第一存储空间。
优选的,所述第一存储空间为MSR。
优选的,所述MSR位于虚拟CPU的Pause Control模块中。
优选的,自旋循环标识获取单元,具体用于:
当虚拟CPU无法获取自旋锁时,在进入所述准备执行的PAUSE指令对应的自旋循环之前,获取操作系统为所述准备执行的PAUSE指令对应的自旋循环分配的所述第一自旋循环标识。
优选的,针对不同的自旋循环采用不同的自旋循环标识。
优选的,所述判断单元,具体用于:
判断所述执行PAUSE指令的次数是否达到次数阈值;
所述执行PAUSE指令的次数满足次数条件包括:所述执行PAUSE指令的次数达到所述次数阈值。
优选的,所述判断单元,还用于:
如果所述执行PAUSE指令的次数不满足次数条件,则所述虚拟CPU继续在所述同一个自旋循环中运行。
优选的,所述移除单元,具体用于:
通过执行VM Exit操作将所述虚拟CPU从所述虚拟CPU所占用的物理CPU资源上移除。
本申请还提供一种用电子设备,其特征在于,所述电子设备包括:
处理器;
存储器,用于存储程序,所述程序在被所述处理器读取执行时,执行如下操作:
确定虚拟CPU在同一个自旋循环中执行PAUSE指令的次数;
判断所述执行PAUSE指令的次数是否满足次数条件;
如果所述执行PAUSE指令的次数满足次数条件,则将所述虚拟CPU从所述虚拟CPU所占用的物理CPU资源上移除。
本申请还提供一种计算机可读取存储介质,其上存储有计算机程序,其特征在于,该程序被处理器执行时,实现以下步骤:
确定虚拟CPU在同一个自旋循环中执行PAUSE指令的次数;
判断所述执行PAUSE指令的次数是否满足次数条件;
如果所述执行PAUSE指令的次数满足次数条件,则将所述虚拟CPU从所述虚拟CPU所占用的物理CPU资源上移除。
本申请还提供一种虚拟CPU中自旋循环的标识方法,其特征在于,包括:
获取自旋锁的调用命令;
根据所述调用命令,查询所述自旋锁是否可用;
若所述自旋锁不可用,在进入自旋循环之前向调用所述自旋锁的调用者提供用于标识所述自旋循环的自旋循环标识。
优选的,所述提供用于标识所述自旋循环的自旋循环标识,包括:针对不同的自旋循环提供不同的用于标识所述自旋循环的自旋循环标识。
优选的,所述提供用于标识所述自旋循环的自旋循环标识,包括:由运行在所述虚拟CPU上的操作系统提供用于标识所述自旋循环的自旋循环标识。
与现有技术相比,本申请具有如下优点:
本申请提供的虚拟CPU的处理方法,包括:确定虚拟CPU在同一个自旋循环中执行PAUSE指令的次数;判断所述执行PAUSE指令的次数是否满足次数条件;如果所述执行PAUSE指令的次数满足次数条件,则将所述虚拟CPU从所述虚拟CPU所占用的物理CPU资源上移除。采用本申请提供的方法,解决了当虚拟机中存在大量中断的时候,PLE功能失效的问题。
附图说明
图1是本申请一种虚拟CPU的处理方法的实施例的流程图。
图2是本申请一种虚拟CPU的处理方法的实施例涉及的虚拟机中自旋锁的传统实现的示意图。
图3是本申请一种虚拟CPU的处理方法的实施例涉及的引入PLE技术后,虚拟机中自旋锁实现的示意图。
图4是本申请一种虚拟CPU的处理方法的实施例涉及的虚拟化技术中VM Entry和VM Exit转换的示意图。
图5是本申请一种虚拟CPU的处理方法的实施例涉及的采用本申请方案的虚拟机中自旋锁实现的示意图。
图6是本申请一种虚拟CPU的处理装置的实施例的流程图。
图7是本申请一种虚拟CPU中自旋循环的标识方法的实施例的流程图。
具体实施方式
在下面的描述中阐述了很多具体细节以便于充分理解本申请。但是本申请能够以很多不同于在此描述的其它方式来实施,本领域技术人员可以在不违背本申请内涵的情况下做类似推广,因此本申请不受下面公开的具体实施的限制。
本申请第一实施例提供一种虚拟CPU的处理方法。请参看图1,该图为本申请第一实施例的流程图。以下结合图1对本申请第一实施例进行详细说明。所述方法包括如下步骤:
步骤S101:确定虚拟CPU在同一个自旋循环中执行PAUSE指令的次数。
本步骤用来确定虚拟CPU在同一个自旋循环中执行PAUSE指令的次数。
所述自旋循环是指自旋锁中用来检查锁是否可用的循环。下面的Intel X86汇编语言片段就是一个自旋锁中自旋循环的例子。
spin_loop:
pause
cmp eax,A
jne spin_loop
在计算机中,虚拟化(Virtualization)是一种资源管理技术,是将计算机的各种实体资源,如服务器、网络、内存及存储等,予以抽象、转换后呈现出来,打破实体结构间的不可切割的障碍,使用户可以比原本的组态更好的方式来应用这些资源。这些资源的虚拟部份不受现有资源的架设方式,地域或物理组态所限制。一般所指的虚拟化资源包括计算能力和资料存储。
虚拟处理器(vCPU),是指虚拟机中虚拟的CPU,一般会运行在具体的物理CPU上。
自旋锁是为实现保护共享资源而提出一种锁机制。自旋锁与互斥锁比较类似,它们都是为了解决对某项资源的互斥使用。无论是互斥锁,还是自旋锁,在任何时刻,最多只能有一个保持者,也就说,在任何时刻最多只能有一个执行单元获得锁。但是两者在处理机制上略有不同。对于互斥锁,如果资源已经被占用,资源申请者只能进入睡眠状态。但是自旋锁不会引起调用者睡眠,如果自旋锁已经被别的执行单元保持,调用者就一直循环在那里看是否该自旋锁的保持者已经释放了锁。
下面是使用汇编语言在Intel X86 CPU上实现的示意性自旋锁实现代码。
在上面的代码中可以看出,CPU在获取自旋锁失败的时候,也会一直处于忙等状态,这严重影响了CPU的性能。为了提高所述忙等状态下的CPU性能,Intel引入了PAUSE指令。
PAUSE指令提升了自旋循环的性能。当执行一个循环等待时,Intel P4或IntelXeon处理器会因为检测到一个可能的内存顺序违规(memory order violation)而在退出循环时使性能大幅下降。PAUSE指令给处理器提了个醒:这段代码序列是个自旋循环循环。处理器利用这个提示可以避免在大多数情况下的内存顺序违规,这将大幅提升性能。正是因为这个原因,在自旋循环中使用PAUSE指令。
PAUSE指令的另一个功能就是降低Intel P4在执行自旋循环时的耗电量。IntelP4处理器在循环等待时会执行得非常快,这将导致处理器消耗大量的电力,而在循环中插入一个PAUSE指令会大幅降低处理器的电力消耗。
下面是引入PAUSE指令后,用汇编语言实现的Intel X86 CPU上实现的示意性自旋锁实现代码。
虽然Intel在自旋锁的实现中引入了PAUSE指令(CPU会保持在idle状态30个时钟),可以提高自旋锁的性能、且一定程度上降低了CPU忙等的功耗,但对提高自旋锁的性能非常有限。因此,为了提高物理CPU的利用率,Intel又引入了一个新的PLE(Pause-LoopExiting)技术。即当虚拟机监控程序发现虚拟CPU一直忙等,且等待的时间超过了阈值,则虚拟机监控程序将该虚拟CPU上的物理CPU处理走,用于运行其他虚拟CPU或者任务。这样避免了虚拟CPU一直处于忙等时,物理CPU资源的浪费。
下面结合虚拟机中自旋锁的传统实现以及引入PLE技术后虚拟机中的自旋锁实现,针对虚拟机中自旋锁的实现引入自旋循环标识的原因进行详细说明。
图2是虚拟机中自旋锁的传统实现,结合图2对于自旋锁的传统实现进行说明。
当vCPU_0已经获取到自旋锁,且没有释放的时候,vCPU_1就无法获取,且需要一直处于忙等状态,直到vCPU_0释放锁资源,一定程度上造成了物理CPU资源的浪费。图2中,pCPU即物理CPU,指实际硬件CPU。vCPU,即虚拟CPU,指虚拟机中虚拟的CPU,一般会运行在具体的物理CPU上。Hypervisor即虚拟机监控程序,常见的有KVM/QEMU、XEN、VMWare等。GuestOS是指虚拟机中的操作系统。Virtual Machine是指虚拟机。
为了解决物理CPU资源的浪费的问题,Intel引入了PLE技术。图3是引入PLE技术后,虚拟机中的自旋锁实现。当vCPU_1无法获取锁,且忙等待一段时间后,则会触发VMExit,vCPU_1被从物理CPU上移走,这个时候该物理CPU资源就可用作其他用途,不会造成资源的浪费。由于自旋锁的实现中调用了PAUSE指令,可以在做PAUSE指令虚拟化实现的时候,完成以上功能。这里引入了两个参数,一个是ple_gap,如果两次调用PAUSE指令的时间间隔小于ple_gap,则CPU认为代码处在一个自旋循环中;另外一个参数是ple_window,在满足处在一个自旋循环的情况下,如果PAUSE指令累计调用的时间超过ple_window时,CPU则认为短时间内无法拿到锁资源,这时会触发VM Exit,将vCPU线程从物理CPU上处理走,这时物理CPU资源可做其他用途。而当vCPU_0释放锁后,vCPU_1又会被重新处理运行。
现有PLE技术方案中,当虚拟机中存在大量中断,vCPU_1的自旋循环被打断时,同一个自旋循环中,前后两次PAUSE指令的调用时间间隔变得不稳定,即便大于ple_gap值,也不能肯定这属于两次不同自旋循环中的PAUSE调用。因此在该场景下,PLE的功能就失效了。
本申请通过自旋循环标识的方式来标识不同的自旋循环实例,解决了由于虚拟机中中断引起的同一自旋循环中,两次PAUSE指令调用时间间隔不确定,从而导致PLE功能失效的技术问题。
所述自旋循环标识的获取步骤包括:
当虚拟CPU无法获取自旋锁时,在进入自旋循环之前,获取操作系统为所述自旋循环分配的自旋循环标识。
针对不同的自旋循环采用不同的自旋循环标识来标识。
自旋循环标识可以采用整数实现,一种比较简单的实现方案是采用获取系统的精确时间来实现。下面给出了在Linux环境下用C语言实现的获取精确度为纳秒级别的时间获取函数,可以满足一般情况下的使用。
所述确定虚拟CPU在同一个自旋循环中执行PAUSE指令的次数,包括:
判断准备执行的PAUSE指令对应的自旋循环是否为之前执行的PAUSE指令对应的自旋循环,如果是,则针对所述执行PAUSE指令的次数进行递增操作,否则,针对所述执行PAUSE指令的次数进行重新计数。
确定虚拟CPU在同一个自旋循环中执行PAUSE指令的次数是通过判断准备执行的PAUSE指令对应的自旋循环是否为之前执行的PAUSE指令对应的自旋循环,如果是,则针对所述执行PAUSE指令的次数进行递增操作,否则,针对所述执行PAUSE指令的次数进行重新计数来实现的。
所述判断准备执行的PAUSE指令对应的自旋循环是否为之前执行的PAUSE指令对应的自旋循环,包括:判断准备执行的PAUSE指令对应的第一自旋循环标识与第一存储空间预先存储的与之前执行的PAUSE指令对应的第二自旋循环标识是否相同;
所述如果是,则针对所述执行PAUSE指令的次数进行递增操作,包括:如果所述第一自旋循环标识与所述第二自旋循环标识相同,则针对所述执行PAUSE指令的次数进行递增操作;
所述否则,针对所述执行PAUSE指令的次数进行重新计数,包括:如果所述第一自旋循环标识与所述第二自旋循环标识不相同,则针对所述执行PAUSE指令的次数进行重新计数。
如果所述第一存储空间未存储任何一个自旋循环标识,则将所述第一自旋循环标识存入所述第一存储空间。
在虚拟机启动时,所述第一存储空间未存储任何一个自旋循环标识,此时第一存储空间为无效值状态,例如第一存储空间初始化状态为0,0不是有效的自旋循环标识。
如果所述第一存储空间未存储任何一个自旋循环标识,则针对所述执行PAUSE指令的次数进行递增操作。
如果所述第一自旋循环标识与所述第二自旋循环标识不相同,则将所述第一自旋循环标识写入所述第一存储空间。
当虚拟CPU无法获取自旋锁时,在进入所述准备执行的PAUSE指令对应的自旋循环之前,获取操作系统为所述准备执行的PAUSE指令对应的自旋循环分配的所述第一自旋循环标识。
针对不同的自旋循环采用不同的自旋循环标识。
所述第一存储空间为MSR。
MSR是Model Specific Registers的缩写。它和处理器的Model密切相关,不同的Model,MSR也不同。需要用CPUID指令读取DisplayFamily和DisplayModel,从而得知该处理器(包括不同的系列或model)能使用的MSR范围。MSR一般是为了设置CPU的工作环境和标示CPU的工作状态,包括温度控制,性能监控等,
MSR是一组64位寄存器,分别通过rdmsr和wrmsr指令进行读和写操作。使用rdmsr读取到的64比特数据分别放到edx和eax(分别为高低32比特)。而使用wrmsr写时,高低32比特数据分别放到edx和eax中,另外寄存器偏移存于ecx中。
所述MSR位于虚拟CPU的Pause Control模块中。
本申请在CPU内部增加Pause Control模块,在原有PLE技术的基础上,去掉了ple_gap参数,在Pause Control模块内部,为每个CPU配备一个MSR寄存器,用于保存当前的自旋循环标识,用以标识当前正在执行的自旋循环,在运行PAUSE指令的时候写入。
步骤S102:判断所述执行PAUSE指令的次数是否满足次数条件。
本步骤用于判断所述执行PAUSE指令的次数是否满足次数条件。
本申请在ple_window中利用PAUSE调用次数来表示允许CPU在Guest OS中运行自旋循环的最长时间,进一步保证了PLE功能的稳定性,避免了中断的干扰。
所述判断所述执行PAUSE指令的次数是否满足次数条件,包括:
判断所述执行PAUSE指令的次数是否达到次数阈值;
所述执行PAUSE指令的次数满足次数条件包括:所述执行PAUSE指令的次数达到所述次数阈值。
运行PAUSE指令的时候,虚拟CPU就会启动一个计数器,进行计数递增;当硬件判断计数器的值超过ple_window设定的阈值时,将vCPU线程从物理CPU上处理走,这时物理CPU资源可做其他用途。否则,所述虚拟CPU继续在所述自旋循环中运行。
步骤S103:如果所述执行PAUSE指令的次数满足次数条件,则将所述虚拟CPU从所述虚拟CPU所占用的物理CPU资源上移除。
本步骤用于如果所述执行PAUSE指令的次数满足次数条件,则将所述虚拟CPU从所述虚拟CPU所占用的物理CPU资源上移除。
所述将所述虚拟CPU从所述虚拟CPU所占用的物理CPU资源上移除通过执行VMExit操作实现。
下面对于VM Exit进行详细说明。
支持Intel虚拟化技术VT-x的CPU有两种运行模式,VMX模式和非VMX模式。VMX模式就是支持虚拟化技术的主要模式,而非VMX模式则与不支持VT-x技术的CPU运行模式完全相同。VMX模式又分为两种操作模式,VMX root模式和为VMX non-root模式,VMXroot模式是提供给VMM使用的,在这种模式下可以调用VMX指令集,VMM用以创建和管理虚拟机。而VMXnon-root模式就是虚拟机运行的模式,这种模式不支持VMX指令集。VMM是Virtual MachineMonitor的缩写,即虚拟机监控器。
虚拟化技术有两种转换,分别为VM Entry和VM Exit。VM Entry就是从VMX root模式切换到VMX non-root模式,简单的说,就是VMM切换到虚拟机这个转换过程。VM Exit就是从VMX non-root模式切换到VMX root模式,同理可理解为从虚拟机返回到VMM这个过程。虚拟化技术的两种转换如图4所示。
所述若所述计数操作的计数值超过预定的阈值,执行VM Exit操作包括:
将虚拟CPU线程从物理CPU上处理走,释放物理CPU资源。这时物理CPU资源可做其他用途。
如果所述执行PAUSE指令的次数不满足次数条件,则所述虚拟CPU继续在所述同一个自旋循环中运行。
本申请在ple_window中利用PAUSE调用次数来表示允许CPU在Guest OS中运行自旋循环的最长时间,进一步保证了PLE功能的稳定性,避免了中断的干扰。
下面是完整的实现本申请的技术方案的示意性代码。
图5是采用本申请的技术方案,在虚拟机中实现自旋锁的示意图。下面结合图5及上面的示意性代码对于采用本申请的技术方案实现虚拟机中的自旋锁进行详细说明。操作系统调在用自旋锁的时候,会向操作系统申请一个唯一的自旋循环标识,并进入自旋循环;如果获取锁失败,则判别该自旋循环标识和所述MSR中的值是否一致;如果不一致,则会将该自旋循环标识写入所述MSR,并复位所述计数器,然后执行PAUSE指令;如果一致,则直接执行PAUSE指令;运行PAUSE指令的时候,CPU就会启动一个计数器,进行计数递增;当硬件判断计数器的值超过ple_window设定的阈值时,则触发VM Exit,将vCPU线程从物理CPU上处理走,这时物理CPU资源可做其他用途;而当vCPU_0释放锁后,vCPU_1又会被重新处理运行。
在上述的实施例中,提供了一种虚拟CPU的处理方法,与之相对应的,本申请还提供一种虚拟CPU的处理装置。请参看图6,其为本申请的一种虚拟CPU的处理装置实施例的流程图。由于本实施例,即第二实施例,基本相似于方法实施例,所以描述得比较简单,相关之处参见方法实施例的部分说明即可。下述描述的装置实施例仅仅是示意性的。
本实施例的一种虚拟机中自旋锁的实现装置,包括:
确定单元601,用于确定虚拟CPU在同一个自旋循环中执行PAUSE指令的次数;
判断单元602,用于判断所述执行PAUSE指令的次数是否满足次数条件;
移除单元603,用于如果所述执行PAUSE指令的次数满足次数条件,则将所述虚拟CPU从所述虚拟CPU所占用的物理CPU资源上移除。
优选的,所述确定单元,具体用于:
判断准备执行的PAUSE指令对应的自旋循环是否为之前执行的PAUSE指令对应的自旋循环,如果是,则针对所述执行PAUSE指令的次数进行递增操作,否则,针对所述执行PAUSE指令的次数进行重新计数。
优选的,所述判断准备执行的PAUSE指令对应的自旋循环是否为之前执行的PAUSE指令对应的自旋循环,包括:判断准备执行的PAUSE指令对应的第一自旋循环标识与第一存储空间预先存储的与之前执行的PAUSE指令对应的第二自旋循环标识是否相同;
所述如果是,则针对所述执行PAUSE指令的次数进行递增操作,包括:如果所述第一自旋循环标识与所述第二自旋循环标识相同,则针对所述执行PAUSE指令的次数进行递增操作;
所述否则,针对所述执行PAUSE指令的次数进行重新计数,包括:如果所述第一自旋循环标识与所述第二自旋循环标识不相同,则针对所述执行PAUSE指令的次数进行重新计数。
优选的,自旋循环标识存入单元,具体用于:如果所述第一存储空间未存储任何一个自旋循环标识,则将所述第一自旋循环标识存入所述第一存储空间。
优选的,递增操作单元,具体用于:如果所述第一存储空间未存储任何一个自旋循环标识,则针对所述执行PAUSE指令的次数进行递增操作。
优选的,写入单元,具体用于:如果所述第一自旋循环标识与所述第二自旋循环标识不相同,则将所述第一自旋循环标识写入所述第一存储空间。
优选的,所述第一存储空间为MSR。
优选的,所述MSR位于虚拟CPU的Pause Control模块中。
优选的,自旋循环标识获取单元,具体用于:
当虚拟CPU无法获取自旋锁时,在进入所述准备执行的PAUSE指令对应的自旋循环之前,获取操作系统为所述准备执行的PAUSE指令对应的自旋循环分配的所述第一自旋循环标识。
优选的,针对不同的自旋循环采用不同的自旋循环标识。
优选的,所述判断单元,具体用于:
判断所述执行PAUSE指令的次数是否达到次数阈值;
所述执行PAUSE指令的次数满足次数条件包括:所述执行PAUSE指令的次数达到所述次数阈值。
优选的,所述判断单元,还用于:
如果所述执行PAUSE指令的次数不满足次数条件,则所述虚拟CPU继续在所述同一个自旋循环中运行。
优选的,所述移除单元,具体用于:
通过执行VM Exit操作将所述虚拟CPU从所述虚拟CPU所占用的物理CPU资源上移除。
本申请第三实施例提供一种电子设备,所述电子设备包括:
处理器;
存储器,用于存储程序,所述程序在被所述处理器读取执行时,执行如下操作:
确定虚拟CPU在同一个自旋循环中执行PAUSE指令的次数;
判断所述执行PAUSE指令的次数是否满足次数条件;
如果所述执行PAUSE指令的次数满足次数条件,则将所述虚拟CPU从所述虚拟CPU所占用的物理CPU资源上移除。
本申请第四实施例提供一种计算机可读取存储介质,其上存储有计算机程序,所述程序被处理器执行时,实现以下步骤:
确定虚拟CPU在同一个自旋循环中执行PAUSE指令的次数;
判断所述执行PAUSE指令的次数是否满足次数条件;
如果所述执行PAUSE指令的次数满足次数条件,则将所述虚拟CPU从所述虚拟CPU所占用的物理CPU资源上移除。
本申请第五实施例提供一种用于虚拟CPU中自旋循环的标识方法。请参看图7,该图为本申请第五实施例的流程图。以下结合图7对本申请第五实施例进行详细说明。所述方法包括如下步骤:
步骤S701,获取自旋锁的调用命令。
本步骤用于获取自旋锁的调用命令。
在自旋锁的使用过程中,首先由自旋锁的使用者发起调用自旋锁的调用命令。
步骤S702,根据所述调用命令,查询所述自旋锁是否可用。
本步骤用于根据所述调用命令,查询所述自旋锁是否可用。
在收到所述调用命令之后,会查询所述自旋锁是否正在被其他使用者使用。
步骤S703,若所述自旋锁不可用,在进入自旋循环之前向调用所述自旋锁的调用者提供用于标识所述自旋循环的自旋循环标识。
本步骤用于判断若所述自旋锁不可用,在进入自旋循环之前向调用所述自旋锁的调用者提供用于标识所述自旋循环的自旋循环标识。
所述提供用于标识所述自旋循环的自旋循环标识,包括:针对不同的自旋循环提供不同的用于标识所述自旋循环的自旋循环标识。
本申请提供的于虚拟CPU中自旋循环的标识方法,通过自旋循环标识(SPIN LOOPID)的方式来标识不同的自旋循环(SPIN LOOP)实例,避免了因中断导致同一SPIN LOOP中,两次PAUSE指令调用时间间隔不确定,从而导致硬件判断失效,最终导致PLE功能失效。
所述提供用于标识所述自旋循环的自旋循环标识,包括:由运行在所述虚拟CPU上的操作系统提供用于标识所述自旋循环的自旋循环标识。
所述自旋循环的自旋循环标识可以由运行在所述虚拟CPU上的操作系统提供。本申请虽然以较佳实施例公开如上,但其并不是用来限定本申请,任何本领域技术人员在不脱离本申请的精神和范围内,都可以做出可能的变动和修改,因此本申请的保护范围应当以本申请权利要求所界定的范围为准。
在一个典型的配置中,计算设备包括一个或多个处理器(CPU)、输入/输出接口、网络接口和内存。
内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(RAM)和/或非易失性内存等形式,如只读存储器(ROM)或闪存(flash RAM)。内存是计算机可读介质的示例。
1、计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括非暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
2、本领域技术人员应明白,本申请的实施例可提供为方法、系统或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
Claims (19)
1.一种虚拟CPU的处理方法,其特征在于,包括:
确定虚拟CPU在同一个自旋循环中执行PAUSE指令的次数;针对不同的自旋循环采用不同的自旋循环标识;
判断所述执行PAUSE指令的次数是否满足次数条件;
如果所述执行PAUSE指令的次数满足次数条件,则将所述虚拟CPU从所述虚拟CPU所占用的物理CPU资源上移除;
所述确定虚拟CPU在同一个自旋循环中执行PAUSE指令的次数,包括:
判断准备执行的PAUSE指令对应的第一自旋循环标识与第一存储空间预先存储的与之前执行的PAUSE指令对应的第二自旋循环标识是否相同;
如果所述第一自旋循环标识与所述第二自旋循环标识相同,则针对所述执行PAUSE指令的次数进行递增操作;
如果所述第一自旋循环标识与所述第二自旋循环标识不相同,则针对所述执行PAUSE指令的次数进行重新计数。
2.根据权利要求1所述的虚拟CPU的处理方法,其特征在于,还包括:如果所述第一存储空间未存储任何一个自旋循环标识,则将所述第一自旋循环标识存入所述第一存储空间。
3.根据权利要求1所述的虚拟CPU的处理方法,其特征在于,还包括:如果所述第一存储空间未存储任何一个自旋循环标识,则针对所述执行PAUSE指令的次数进行递增操作。
4.根据权利要求1所述的虚拟CPU的处理方法,其特征在于,如果所述第一自旋循环标识与所述第二自旋循环标识不相同,则将所述第一自旋循环标识写入所述第一存储空间。
5.根据权利要求1所述的虚拟CPU的处理方法,其特征在于,所述第一存储空间为MSR。
6.根据权利要求5所述的虚拟CPU的处理方法,其特征在于,所述MSR位于虚拟CPU的Pause Control模块中。
7.根据权利要求1所述的虚拟CPU的处理方法,其特征在于,还包括:
当虚拟CPU无法获取自旋锁时,在进入所述准备执行的PAUSE指令对应的自旋循环之前,获取操作系统为所述准备执行的PAUSE指令对应的自旋循环分配的所述第一自旋循环标识。
8.根据权利要求1所述的虚拟CPU的处理方法,其特征在于,所述判断所述执行PAUSE指令的次数是否满足次数条件,包括:
判断所述执行PAUSE指令的次数是否达到次数阈值;
所述执行PAUSE指令的次数满足次数条件包括:所述执行PAUSE指令的次数达到所述次数阈值。
9.根据权利要求1所述的虚拟CPU的处理方法,其特征在于,还包括:如果所述执行PAUSE指令的次数不满足次数条件,则所述虚拟CPU继续在所述同一个自旋循环中运行。
10.根据权利要求1所述的虚拟CPU的处理方法,其特征在于,所述将所述虚拟CPU从所述虚拟CPU所占用的物理CPU资源上移除,包括:通过执行VM Exit操作将所述虚拟CPU从所述虚拟CPU所占用的物理CPU资源上移除。
11.一种虚拟CPU的处理装置,其特征在于,包括:
确定单元,用于确定虚拟CPU在同一个自旋循环中执行PAUSE指令的次数;针对不同的自旋循环采用不同的自旋循环标识;
判断单元,用于判断所述执行PAUSE指令的次数是否满足次数条件;
移除单元,用于如果所述执行PAUSE指令的次数满足次数条件,则将所述虚拟CPU从所述虚拟CPU所占用的物理CPU资源上移除;
所述确定单元,具体用于:
判断准备执行的PAUSE指令对应的第一自旋循环标识与第一存储空间预先存储的与之前执行的PAUSE指令对应的第二自旋循环标识是否相同;
如果所述第一自旋循环标识与所述第二自旋循环标识相同,则针对所述执行PAUSE指令的次数进行递增操作;
如果所述第一自旋循环标识与所述第二自旋循环标识不相同,则针对所述执行PAUSE指令的次数进行重新计数。
12.根据权利要求11所述的虚拟CPU的处理装置,其特征在于,自旋循环标识存入单元,具体用于:如果所述第一存储空间未存储任何一个自旋循环标识,则将所述第一自旋循环标识存入所述第一存储空间。
13.根据权利要求11所述的虚拟CPU的处理装置,其特征在于,递增操作单元,具体用于:如果所述第一存储空间未存储任何一个自旋循环标识,则针对所述执行PAUSE指令的次数进行递增操作。
14.根据权利要求11所述的虚拟CPU的处理装置,其特征在于,写入单元,具体用于:如果所述第一自旋循环标识与所述第二自旋循环标识不相同,则将所述第一自旋循环标识写入所述第一存储空间。
15.根据权利要求11所述的虚拟CPU的处理装置,其特征在于,自旋循环标识获取单元,具体用于:
当虚拟CPU无法获取自旋锁时,在进入所述准备执行的PAUSE指令对应的自旋循环之前,获取操作系统为所述准备执行的PAUSE指令对应的自旋循环分配的所述第一自旋循环标识。
16.一种用电子设备,其特征在于,所述电子设备包括:
处理器;
存储器,用于存储程序,所述程序在被所述处理器读取执行时,执行如下操作:
确定虚拟CPU在同一个自旋循环中执行PAUSE指令的次数;针对不同的自旋循环采用不同的自旋循环标识;
判断所述执行PAUSE指令的次数是否满足次数条件;
如果所述执行PAUSE指令的次数满足次数条件,则将所述虚拟CPU从所述虚拟CPU所占用的物理CPU资源上移除;
所述确定虚拟CPU在同一个自旋循环中执行PAUSE指令的次数,包括:
判断准备执行的PAUSE指令对应的第一自旋循环标识与第一存储空间预先存储的与之前执行的PAUSE指令对应的第二自旋循环标识是否相同;
如果所述第一自旋循环标识与所述第二自旋循环标识相同,则针对所述执行PAUSE指令的次数进行递增操作;
如果所述第一自旋循环标识与所述第二自旋循环标识不相同,则针对所述执行PAUSE指令的次数进行重新计数。
17.一种计算机可读取存储介质,其上存储有计算机程序,其特征在于,该程序被处理器执行时,实现以下步骤:
确定虚拟CPU在同一个自旋循环中执行PAUSE指令的次数;针对不同的自旋循环采用不同的自旋循环标识;
判断所述执行PAUSE指令的次数是否满足次数条件;
如果所述执行PAUSE指令的次数满足次数条件,则将所述虚拟CPU从所述虚拟CPU所占用的物理CPU资源上移除;
所述确定虚拟CPU在同一个自旋循环中执行PAUSE指令的次数,包括:
判断准备执行的PAUSE指令对应的第一自旋循环标识与第一存储空间预先存储的与之前执行的PAUSE指令对应的第二自旋循环标识是否相同;
如果所述第一自旋循环标识与所述第二自旋循环标识相同,则针对所述执行PAUSE指令的次数进行递增操作;
如果所述第一自旋循环标识与所述第二自旋循环标识不相同,则针对所述执行PAUSE指令的次数进行重新计数。
18.一种虚拟CPU中自旋循环的标识方法,其特征在于,包括:
获取自旋锁的调用命令;
根据所述调用命令,查询所述自旋锁是否可用;
若所述自旋锁不可用,在进入自旋循环之前向调用所述自旋锁的调用者提供用于标识所述自旋循环的自旋循环标识;所述自旋循环标识用于确定虚拟CPU在同一个自旋循环中执行PAUSE指令的次数;
针对不同的自旋循环提供不同的用于标识所述自旋循环的自旋循环标识;
其中,所述确定虚拟CPU在同一个自旋循环中执行PAUSE指令的次数,包括:
判断准备执行的PAUSE指令对应的第一自旋循环标识与第一存储空间预先存储的与之前执行的PAUSE指令对应的第二自旋循环标识是否相同;
如果所述第一自旋循环标识与所述第二自旋循环标识相同,则针对所述执行PAUSE指令的次数进行递增操作;
如果所述第一自旋循环标识与所述第二自旋循环标识不相同,则针对所述执行PAUSE指令的次数进行重新计数。
19.根据权利要求18所述的虚拟CPU中自旋循环的标识方法,其特征在于,所述提供用于标识所述自旋循环的自旋循环标识,包括:由运行在所述虚拟CPU上的操作系统提供用于标识所述自旋循环的自旋循环标识。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810882095.2A CN110795231B (zh) | 2018-08-03 | 2018-08-03 | 一种虚拟cpu的处理方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810882095.2A CN110795231B (zh) | 2018-08-03 | 2018-08-03 | 一种虚拟cpu的处理方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN110795231A CN110795231A (zh) | 2020-02-14 |
CN110795231B true CN110795231B (zh) | 2023-12-22 |
Family
ID=69425847
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201810882095.2A Active CN110795231B (zh) | 2018-08-03 | 2018-08-03 | 一种虚拟cpu的处理方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN110795231B (zh) |
Families Citing this family (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN115145688B (zh) * | 2022-06-29 | 2023-06-16 | 科东(广州)软件科技有限公司 | 一种用户态虚拟机虚拟核的暂停方法及装置 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101364184A (zh) * | 2007-03-30 | 2009-02-11 | 英特尔公司 | 在虚拟机环境中检测自旋循环 |
CN103729238A (zh) * | 2012-10-12 | 2014-04-16 | 国际商业机器公司 | 管理对在多个处理器间共享的资源的锁的方法和系统 |
CN103744728A (zh) * | 2014-01-22 | 2014-04-23 | 上海交通大学 | 一种基于动态ple技术的虚拟机协同调度方法 |
CN105955796A (zh) * | 2016-04-22 | 2016-09-21 | 华中科技大学 | 一种云平台上高性能并行应用的调度方法及系统 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US9081629B2 (en) * | 2013-05-19 | 2015-07-14 | Frank Eliot Levine | Excluding counts on software threads in a state |
-
2018
- 2018-08-03 CN CN201810882095.2A patent/CN110795231B/zh active Active
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101364184A (zh) * | 2007-03-30 | 2009-02-11 | 英特尔公司 | 在虚拟机环境中检测自旋循环 |
CN103207803A (zh) * | 2007-03-30 | 2013-07-17 | 英特尔公司 | 在虚拟机环境中检测自旋循环 |
CN103729238A (zh) * | 2012-10-12 | 2014-04-16 | 国际商业机器公司 | 管理对在多个处理器间共享的资源的锁的方法和系统 |
CN103744728A (zh) * | 2014-01-22 | 2014-04-23 | 上海交通大学 | 一种基于动态ple技术的虚拟机协同调度方法 |
CN105955796A (zh) * | 2016-04-22 | 2016-09-21 | 华中科技大学 | 一种云平台上高性能并行应用的调度方法及系统 |
Non-Patent Citations (2)
Title |
---|
Jianchen Shan, Xiaoning Ding, Narain Gehani.APPLES: Efficiently Handling Spin-lock Synchronization on Virtualized Platforms.IEEE.2017,文章第1-3页. * |
杨中良 ; 蒋朝根 ; .Linux内核的可抢占性分析和研究.成都信息工程学院学报.2008,23(05),全文. * |
Also Published As
Publication number | Publication date |
---|---|
CN110795231A (zh) | 2020-02-14 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US7802250B2 (en) | Support for transitioning to a virtual machine monitor based upon the privilege level of guest software | |
US8607228B2 (en) | Virtualizing performance counters | |
JP4584315B2 (ja) | 仮想マシン環境におけるタイマ・オフセット機構 | |
JP4564536B2 (ja) | 仮想マシンモニタに関連するタイマへのサポートを提供する方法及び装置 | |
US8230203B2 (en) | Detecting spin loops in a virtual machine environment | |
US20060130061A1 (en) | Use of rollback RCU with read-side modifications to RCU-protected data structures | |
US9977690B2 (en) | Hypervisor-visible guest thread management | |
JP6367490B2 (ja) | プロセッサトランザクショナルメモリサポートを用いるメモリアクセス保護 | |
CN103473135B (zh) | 虚拟化环境下自旋锁lhp现象的处理方法 | |
US8286192B2 (en) | Kernel subsystem for handling performance counters and events | |
US9864708B2 (en) | Safely discovering secure monitors and hypervisor implementations in systems operable at multiple hierarchical privilege levels | |
CN110795231B (zh) | 一种虚拟cpu的处理方法及装置 | |
US9535772B2 (en) | Creating a communication channel between different privilege levels using wait-for-event instruction in systems operable at multiple levels hierarchical privilege levels | |
US11726807B2 (en) | Safe execution of virtual machine callbacks in a hypervisor | |
KR102443089B1 (ko) | 컴퓨팅 디바이스에서의 동기화 | |
US10289467B2 (en) | Error coordination message for a blade device having a logical processor in another system firmware domain | |
CN112131009B (zh) | 一种内存调度方法、装置及计算机可读存储介质 | |
CN113474754A (zh) | 有条件退让给管理程序指令 | |
US11782713B1 (en) | Security vulnerability mitigation using address space co-execution | |
EP4300307A1 (en) | Systems and method for processing privileged instructions using user space memory | |
CN118035030A (zh) | 一种基于Uboot的操作系统故障监控方法 | |
Oikawa et al. | Simultaneous virtual-machine logging and replay |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |