CN109857677A - 内核栈的分配方法及装置 - Google Patents
内核栈的分配方法及装置 Download PDFInfo
- Publication number
- CN109857677A CN109857677A CN201811626288.8A CN201811626288A CN109857677A CN 109857677 A CN109857677 A CN 109857677A CN 201811626288 A CN201811626288 A CN 201811626288A CN 109857677 A CN109857677 A CN 109857677A
- Authority
- CN
- China
- Prior art keywords
- stack
- page
- address space
- thread
- kernel
- 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.)
- Granted
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F12/00—Accessing, addressing or allocating within memory systems or architectures
- G06F12/02—Addressing or allocation; Relocation
- G06F12/08—Addressing or allocation; Relocation in hierarchically structured memory systems, e.g. virtual memory systems
- G06F12/0802—Addressing of a memory level in which the access to the desired data or data block requires associative addressing means, e.g. caches
- G06F12/0877—Cache access modes
- G06F12/0882—Page mode
-
- 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/5005—Allocation of resources, e.g. of the central processing unit [CPU] to service a request
- G06F9/5011—Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resources being hardware resources other than CPUs, Servers and Terminals
- G06F9/5016—Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resources being hardware resources other than CPUs, Servers and Terminals the resource being the memory
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F3/00—Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
- G06F3/06—Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
- G06F3/0601—Interfaces specially adapted for storage systems
- G06F3/0628—Interfaces specially adapted for storage systems making use of a particular technique
- G06F3/0638—Organizing or formatting or addressing of data
- G06F3/0644—Management of space entities, e.g. partitions, extents, pools
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F3/00—Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
- G06F3/06—Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
- G06F3/0601—Interfaces specially adapted for storage systems
- G06F3/0628—Interfaces specially adapted for storage systems making use of a particular technique
- G06F3/0662—Virtualisation aspects
- G06F3/0664—Virtualisation aspects at device level, e.g. emulation of a storage device or system
-
- 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/48—Program initiating; Program switching, e.g. by interrupt
- G06F9/4806—Task transfer initiation or dispatching
- G06F9/4843—Task transfer initiation or dispatching by program, e.g. task dispatcher, supervisor, operating system
- G06F9/4881—Scheduling strategies for dispatcher, e.g. round robin, multi-level priority queues
-
- 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/54—Interprogram communication
- G06F9/545—Interprogram communication where tasks reside in different layers, e.g. user- and kernel-space
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F3/00—Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
- G06F3/06—Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
- G06F3/0601—Interfaces specially adapted for storage systems
- G06F3/0602—Interfaces specially adapted for storage systems specifically adapted to achieve a particular effect
- G06F3/0604—Improving or facilitating administration, e.g. storage management
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F3/00—Input arrangements for transferring data to be processed into a form capable of being handled by the computer; Output arrangements for transferring data from processing unit to output unit, e.g. interface arrangements
- G06F3/06—Digital input from, or digital output to, record carriers, e.g. RAID, emulated record carriers or networked record carriers
- G06F3/0601—Interfaces specially adapted for storage systems
- G06F3/0668—Interfaces specially adapted for storage systems adopting a particular infrastructure
- G06F3/0671—In-line storage system
- G06F3/0683—Plurality of storage devices
- G06F3/0685—Hybrid storage combining heterogeneous device types, e.g. hierarchical storage, hybrid arrays
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Software Systems (AREA)
- Human Computer Interaction (AREA)
- Memory System Of A Hierarchy Structure (AREA)
Abstract
本发明公开了内核栈的分配方法及装置,涉及计算机技术领域。本发明的内核栈的分配方法及装置采用按需分配的模式分配内存,当线程的栈指针下溢出地址空间内的页边界时,产生缺页异常,在缺页异常处理程序中,对内核栈分配一新的存储页,并将新的存储页映射到内核栈指向的目标地址空间,从而极大的优化线程内核栈的内存消耗,提升了对内核栈下溢异常的检测能力;通过预先划分一段虚拟地址空间供线程内核栈使用有效的避免内存碎片化的问题。
Description
技术领域
本发明涉及计算机技术领域,尤其涉及一种内核栈的分配方法及装置。
背景技术
栈是C语言环境下程序运行时,存放函数局部变量的内存区域。栈是向下生长的,如当前执行的函数调用子函数时,编译器会生成压栈指令,在进入到子函数时保存父函数的上下文以及在栈中为子函数中用到的局部变量分配存储空间,这个时候栈指针的值减小,即栈向下生长。当子函数执行完毕后,编译器会在子函数返回时生成对应的出栈指令,从栈中恢复父函数保存的上下文,并将栈指针增加回父函数所在的位置。
图1给出了一个函数调用过程中的栈变化示例。在这个示例中,函数调用关系为函数A(Function A)调用函数B(Function B),函数B调用函数C(Function C)。在函数A运行开始前,系统会预先为函数A设定好一个栈顶(Stack top)栈指针,以及对应的栈底(Stackfloor)。当函数A开始执行时,栈指针sp下移,它和栈顶之间的差值即为函数A中局部变量所需的栈空间,即图中的第a部分。当函数A调用函数B的时候,栈指针sp会再次下移,即图中的第b部分,图中新增的区域为函数B中局部变量所需的栈空间。当函数B调用函数C时,栈指针sp会继续下移,即图中的第c部分,图中新增的区域即为函数C中局部变量所需的栈空间。当函数C执行完毕返回函数B时,栈指针sp会上移到之前的位置,即图中的第d部分。
显然,图1中未填充的空白部分即为未使用的栈空间。当然如果函数调用深度过深,比如存在递归调用时,栈指针sp会一直下移。如果栈指针超出了栈底的值,则可能会破坏掉其它地方的数据,造成系统不稳定,这就是栈下溢出错误。
在Linux环境下,Linux内核会为每个运行的线程分配线程运行所需的栈,称为内核栈,Linux的内核栈不仅负责为函数调用过程中的局部变量提供存储空间,还负责在任务调度、异常处理提供保存上下文所需的内存空间。内核栈在每个线程被创建的时候分配好,并挂接到与线程相关的数据结构中。
内核栈的大小受芯片体系以及OS的位宽等因素影响。在ARM64架构上,内核栈的大小默认是16KB。即内核在创建每个线程的时候,都会为其分配16KB的栈。
Linux内核提供了一些对内核栈的调试手段。宏CONFIG_DEBUG_STACK_USAGE可以用来评估每个线程对内核栈的使用情况。它的基本原理就是得到16KB的内核栈之后,将栈的数据全部清零,之后可以通过从栈底向上查找非零值的位置来大致确定线程实际使用的栈深度。
打开这个宏,然后实际运行系统,并观察各个task(任务)的栈使用情况,可以发现,绝大部分线程对栈的使用都很少,远达不到16KB左右的水平。图2展示了通过echo t>/proc/sysrq-trigger命令抓取到的各个线程实际的内核栈使用情况(基于3.14内核,P212平台)。横轴为线程编号,纵轴为线程实际使用的栈大小(单位:字节)。可以看到,绝大部分线程实际使用的线程栈都在6KB以下,只有少部分线程的的栈使用情况达到了接近8KB左右,内核栈出现了极大的浪费。
发明内容
针对现有内核栈存在极大浪费的问题,现提供一种旨在可优化线程内核栈的内存消耗的内核栈的分配方法及装置。
一种内核栈的分配方法,预先划分一段虚拟地址空间供线程内核栈使用,所述分配方法包括:
S1.当接收到创建线程指令时,基于所述虚拟地址空间为线程内核栈分配连续的目标地址空间;
S2.采用位图对所有线程的所述目标地址空间进行映射管理;
S3.所述目标地址空间包括异常缓存区和存储区,所述异常缓存区位于所述目标地址空间的头区域;
S4.对所述内核栈分配一存储页,并将所述存储页映射到所述目标地址空间的所述存储区,所述线程运行时栈指针指向所述内核栈的所述存储页所在的目标地址空间,所述存储页映射的目标地址空间的底部为地址边界;
S5.当所述线程的栈指针下溢出所述地址中的页边界时,硬件产生缺页异常,在缺页异常处理程序中对所述内核栈分配一新的存储页,并将所述新的存储页映射到所述内核栈指向的目标地址空间。
优选的,所述步骤S2采用位图对所述目标地址空间进行映射管理,包括:
在位图中当bit值为0时表示对应的地址空间未使用,当bit值为1时表示对应的地址空间已使用,采用公式(1)表示地址空间的线性映射关系:
T=A+N×16KB (1)
其中,T表示创建的线程地址;A表示虚拟地址空间的起始地址;N表示与线程对应的bit值在位图的位置。
优选的,所述存储页映射到所述目标地址空间的所述存储区的容量为16KB。
优选的,所述步骤S5当所述线程的栈指针指向所述地址边界时,对所述内核栈分配一新的存储页,并将所述新的存储页映射到所述内核栈指向的目标地址空间,包括:
提供一备份存储器用于存储所述缺页异常发生时的栈指针,还提供一临时存储器用于存储处理缺页异常时所需的每个处理器per-cpu栈内存;
当所述线程的栈指针下溢出所述地址内的页边界时,发生缺页异常,所述栈指针下溢出所述每个处理器栈内存,所述备份存储器存储所述异常现场的栈指针;
对所述内核栈分配一新的存储页,并将所述新的存储页映射到所述内核栈指向的目标地址空间;
将所述备份存储器的栈指针切换至所述目标地址空间指向当前线程的内核栈,并使所述栈指针返回发生异常时所述栈指针指向的位置。
本发明还提供了一种内核栈的分配装置,预先划分一段虚拟地址空间供线程内核栈使用,所述分配装置包括:
分配单元,用于当接收到创建线程指令时,基于所述虚拟地址空间为线程内核栈分配连续的目标地址空间;
管理单元,用于采用位图对所有线程的所述目标地址空间进行映射管理,所述目标地址空间包括异常缓存区和存储区,所述异常缓存区位于所述目标地址空间的头区域;
映射单元,用于对所述内核栈分配一存储页,并将所述存储页映射到所述目标地址空间的所述存储区,所述线程运行时栈指针指向所述内核栈的所述存储页所在的目标地址空间,所述存储页映射的目标地址空间的底部为地址边界;
处理单元,用于当所述线程的栈指针下溢出所述地址中的页边界时,硬件产生缺页异常,在缺页异常处理程序中对所述内核栈分配一新的存储页,并将所述新的存储页映射到所述内核栈指向的目标地址空间。
优选的,所述管理单元采用位图对所述目标地址空间进行映射管理时,在位图中当bit值为0时表示对应的地址空间未使用,当bit值为1时表示对应的地址空间已使用,采用公式(1)表示地址空间的线性映射关系:
T=A+N×16KB (1)
其中,T表示创建的线程地址;A表示虚拟地址空间的起始地址;N表示与线程对应的bit值在位图的位置。
优选的,所述存储页映射到所述目标地址空间的所述存储区的容量为16KB。
优选的,所述处理单元提供一备份存储器用于存储所述缺页异常的栈指针,还提供一临时存储器用于存储处理缺页异常所需的每个处理器栈内存;当所述线程的栈指针下溢出所述地址内的页边界时,发生缺页异常,所述栈指针下溢出所述每个处理器栈内存,所述备份存储器存储所述异常现场的栈指针;对所述内核栈分配一新的存储页,并将所述新的存储页映射到所述内核栈指向的目标地址空间;将所述备份存储器的栈指针切换至所述目标地址空间指向当前线程的内核栈,并使所述栈指针返回发生异常时所述栈指针指向的位置。
上述技术方案的有益效果:
本技术方案中,内核栈的分配方法及装置采用按需分配的模式分配内存,当线程的栈指针下溢出地址内的页边界时,对内核栈分配一新的存储页,并将新的存储页映射到内核栈指向的目标地址空间,从而极大的优化线程内核栈的内存消耗,提升了对内核栈下溢异常的检测能力;通过预先划分一段虚拟地址空间供线程内核栈使用有效的避免内存碎片化的问题。
附图说明
图1为函数调用过程中的栈变化过程原理示意图;
图2为各个线程实际的内核栈使用情况示意图;
图3为图2中1281个线程的内核栈使用值分布情况的柱状统计示意图;
图4为本发明所述的内核栈的分配方法的一种实施例的方法流程图;
图5为位图和目标地址空间的映射关系
图6为线程异常缓存区内存变化情况的示意图;
图7为内核栈缺页异常处理过程示意图;
图8为处理缺页异常时栈指针的切换过程原理图;
图9为内核栈优化对比曲线图;
图10为优化后内核栈和优化前的比例变化曲线图;
图11为栈溢出检测示意图;
图12为本发明所述的内核栈的分配装置的一种实施例的模块图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动的前提下所获得的所有其他实施例,都属于本发明保护的范围。
图3展示了图2中总计1281个线程的内核栈使用值分布情况,以1024字节为分段。可以看到,内核栈使用低于1024字节的线程数是0。这1281个线程中,有655个线程的内核栈使用范围是[2048–3072]字节,占线程总数的51%。内核栈使用量超过4KB以上的线程数只有155个,占比12.1%。内核栈使用超过8KB的线程数为0。
由图3的统计结果可知:超过80%的线程内核栈实际使用量不足4KB,而内核默认为每个线程分配了16KB的内核栈,这造成了极大的浪费。Linux内核代码中,每个函数在实现时声明的局部变量数量各有不同,这些局部变量在编译器编译时都是直接从线程栈中分配。功能简单的函数,可能不需要消耗栈或者只需要几个字节的栈消耗即可。功能复杂的函数,可能需要几百字节甚至KB级别的栈消耗。在代码执行过程中,顶层函数逐步向底层函数调用时就会逐步累积各个函数的栈消耗。由于内核在开发过程中并不能确定各个模块的函数调用深度以及是否存在递归等情况。所以没有办法评估各个线程具体的内核栈消耗情况。只能尽可能的找一个看起来比较“安全”的值来为每一个线程统一分配数量相同的内核栈。并且这个值必须比栈使用量最大的线程还要大,还需要留有一定余量。否则在一些极端情况下可能出现栈下溢导致死机。内核栈的这个特性就导致了图3中出现的统计情况。1200多个运行线程中,只要有一个线程的内核栈达到甚至接近8KB,安全起见就得把内核线程栈统一设置到16KB,即使绝大部分线程只需要4KB不到的栈就足够了。这种不“按需分配”的行为导致了64位系统上内核栈出现了极大的浪费。
针对上述ARM64系统上Linux内核栈实际使用情况的分析,可以看出在ARM64架构上Linux内核栈存在两个问题:
1.内核栈的内存消耗过大。如果系统运行的线程数量较多,那么内核栈的消耗的内存会变得不可忽视。比如,系统创建了2048个线程,那么就需要2048×16=32MB内存。这个内存需求在容量较小(<1GB)的平台上已经占比很大了。
2.碎片化问题。64bit上内核栈大小默认是16KB,即4个page(页)的大小。通常情况下它都是直接从线性映射区域分配内存,这就要求物理地址连续。在系统运行一段时间,内存碎片化之后。就有可能出现因为找不到物理地址连续的4个page而分配失败,进而导致任务创建失败的问题。
基于现有的内核栈存在的内存消耗过大和碎片化问题,本发明提供一种可优化线程内核栈内存,避免内存碎片化的内核栈的分配方法及装置。
需要说明的是,在不冲突的情况下,本发明中的实施例及实施例中的特征可以相互组合。
下面结合附图和具体实施例对本发明作进一步说明,但不作为本发明的限定。
如图4所示,一种内核栈的分配方法,预先用__get_vm_area_node()接口划分一段虚拟地址空间供线程内核栈使用,所述分配方法包括:
S1.当接收到创建线程指令时,基于所述虚拟地址空间预先为线程内核栈分配连续的目标地址空间;
在本步骤中,对所述地址空间进行划分,划分出预设N个连续的目标地址空间,每一所述目标地址空间对应一线程;本例中N=32768。
S2.采用位图对所有线程的所述目标地址空间进行映射管理;
在本步骤中的位图是一种数据结构,用一段连续的内存中的bit位来标记数据的状态。
进一步地,所述步骤S2采用位图对所述目标地址空间进行映射管理,包括:
在位图中当bit值为0时表示对应的地址空间未使用,当bit值为1时表示对应的地址空间已使用,采用公式(1)表示地址空间的线性映射关系:
T=A+N×16KB (1)
其中,T表示创建的线程地址;A表示预分配的虚拟地址空间的起始地址;N表示与线程对应的bit值在位图的位置。
在步骤S2中采用bitmap(位图)来管理这段预选划分好的vmalloc空间。仍然按照每个线程16KB的配置,在bitmap中用一个bit来表示。bit值为0表示该地址空间未使用,为1表示该地址空间已经使用。创建task时,从bitmap中查找为0的bit,找到之后将其置为1,标记已使用。并根据该bit的偏移换算地址空间。
bitmap和地址空间做线性映射。假设在boot阶段通过__get_vm_area_node()接口获得的虚拟地址空间起始地址为A,当前创建线程的地址为T,获得的bit位置为N。那么当前线程的地址空间计算公式为(1)。图5展示了位图和目标地址空间的映射关系。
当线程结束运行时,也很容易通过线程的内核栈地址倒推它在bitmap中的位置。根据公式(2)计算一下即可:
N=(T-A)÷16KB (2)
这样,只需要将该bit清零,即可完成对这个地址空间的释放。很显然,用bitmap机制来管理预先划分的vmalloc地址空间,可以大大简化缺页异常时以及创建、撤销线程时候对vmalloc API的使用,能有效的避免和vmallocAPI之间的锁竞争,避免死锁问题。
S3.所述目标地址空间包括异常缓存区和存储区,所述异常缓存区位于所述目标地址空间的头区域;
在本步骤中维护一个页缓存链表,当所述缺页异常发生时,从该链表中获取一个空闲页,并将该页映射到缺页地址上。用这种页缓存机制可以有效避免处理缺页时的死锁问题。
alloc_page()是分配内存的基本接口函数,当然它也是内核里面比较复杂的一个函数。它的调用深度中会有许多地方使用zone的spin_lock(函数)。而且这个lock(锁)使用的地方比较广,不仅仅是分配,内存释放过程、迁移过程等函数调用也会使用到这个锁。
因此可预先分配一小部分的page作为cache(即页缓存),将其挂接到一个链表头中,专供处理缺页异常时使用,这样在缺页异常处理时就不用理会zone的lock,只需单独管理好这个cache的同步问题即可,问题就得到了大大的化解。
cache由于缺页处理会被逐渐消耗减少,所以可以提供一个work(工作)来周期性的维护page cache,发现cache的数量不足时,从伙伴系统中分配出一定的page来补充pagecache即可。此外,当线程终止运行,释放线程的内核栈时,被释放的线程内核栈所占用的page也可以被用来补充缺页异常的page cache。由图3的线程栈使用分布统计,可以知道缺页异常并不是一个高概率发生的事情。所以只需要维护少量的page cache即可。
图6是维护了一个256KB的page cache,在测试过程中这个page cache的数量变化情况。可以看到,绝大部分时候cache的page数量都维持在256KB左右,即满状态,只有偶尔cache的page数量跌到200KB左右,这离cache被彻底消耗干净还有足够的余量。
S4.创建线程时对所述内核栈仅分配一存储页,并将所述存储页映射到所述目标地址空间的所述存储区,所述线程运行时栈指针指向所述内核栈的所述存储页所在的目标地址空间,所述存储页映射的目标地址空间的底部为地址边界;
其中,所述存储页映射到所述目标地址空间的所述存储区的容量为16KB。
S5.当所述线程的栈指针下溢出所述地址空间内的页边界时,硬件产生缺页异常(处理器MMU硬件产生缺页异常是本发明能够生效的核心机制),在缺页异常处理程序中对所述内核栈分配一新的存储页,并将所述新的存储页映射到所述内核栈指向的目标地址空间。
在本步骤中的栈指针下溢出是指向页边界并不一定会产生硬件缺页异常,只有确实下溢之后才会产生缺页异常。
进一步地,所述步骤S5当所述线程的栈指针下溢出所述地址中的页边界时,硬件产生缺页异常,在缺页异常处理程序中对所述内核栈分配一新的存储页,并将所述新的存储页映射到所述内核栈指向的目标地址空间,包括:
提供一备份存储器用于存储所述缺页异常的栈指针,还提供一临时存储器用于存储所述处理缺页异常时所需的每个处理器(per-cpu,即每个处理器,是多核处理器系统上的一种管理机制。程序预先为每个处理器都分配了一段可以使用的内存,用作处理缺页异常时候的栈)栈内存;
当所述线程的栈指针下溢出所述地址内的页边界时,发生缺页异常,所述栈指针指向所述每个处理器栈内存,所述备份存储器存储所述异常现场的栈指针;
对所述内核栈分配一新的存储页,并将所述新的存储页映射到所述内核栈指向的目标地址空间;
将所述备份存储器的栈指针切换至所述目标地址空间指向当前线程的内核栈,并使所述栈指针返回发生异常时所述栈指针指向的位置。
缺页异常是Linux内核中用来延时处理应用程序内存请求的一种实现机制。应用程序可以通过brk或者mmap(一种内存映射文件的方法)系统调用,向内核申请一大片内存。但内核只是根据应用程序的请求为其划分了对应大小的地址空间而已,并没有真正为应用程序分配内存。只有当应用程序实际访问它申请的内存时,处理器的MMU(全称:MemoryManagement Unit,中文名:内存管理单元)会产生一个缺页异常。内核在缺页异常处理程序里面真正为应用程序分配内存并建立起对应的映射。到这时候应用程序才真正拥有了它申请的内存。
缺页异常的这个逻辑就是典型的“按需分配”的逻辑。即只有真正产生访问了才为其配内存。否则在应用申请时就为其分配足额内存,而实际不需要使用这么多的话,会造成大量的内存浪费以及内存紧张的情况。
对于线程的内核栈,本发明使用这种缺页异常处理逻辑,只有在线程的栈真正生长到对应的地址范围时才为其分配内存。这是能实现对线程内核栈优化的基础。
图7是在这种模型下的内核栈缺页异常处理过程示意图。在创建线程时,按照如下条件和步骤处理线程的内核栈:
1、仍然为每个线程的内核栈划分16KB(4个page)的地址空间,但地址空间并不选择在内核的线性映射区域,而选择在vmalloc的地址空间中;
2、出于效率考虑,在创建线程时仅为其内核栈分配第一个page,其余的三个page暂不分配。即图中的第a部分,实现框为为线程分配的第一个页,下方的三个虚线框为尚未分配的页,线程开始运行时,sp栈指针指向第一个page所在的地址空间,并且随着函数调用的深入而下移,图中虚线为第一个page的地址边界;
3、创建内核栈缺页异常处理函数,当线程的函数调用深度继续增加,sp栈指针继续下移并跨过了第一个page的界限时,处理器会产生一个缺页异常。这时候ARM64CPU会强行跳转到异常处理函数处执行;
4、在内核栈缺页异常处理函数中,完成以下逻辑处理:
分配一个新的页;
并将这个页映射到sp栈指针指向的地址空间。这个过程是图7的第b部分。
5、完成缺页异常的处理后,CPU返回到产生异常的指令处继续执行,因为在第b步已经建立好了对该地址的映射,因此sp栈指针可以正常访问,程序也能正常执行下去。这个过程是图7中的第c部,填充的部分即为新映射的页。
完成上述步骤后,内核栈地址空间下方的地址空间对应的两个page仍然是尚未分配的,用虚线框表示。如果sp栈指针继续下移跨过了第二个page的边界,仍旧会触发缺页异常,继续在缺页异常处理函数中执行第b部分的缺页处理程序,将第三个page补上即可。后续的缺页处理也同理,直到所需的4个page完全补上。
由图7可见,如果程序的函数调用深度最大使得sp栈指针只深入到第二个page,那么在线程执行过程中,第3和第4个page永远都不用到,也不会被分配。那么相对于现有的内核栈分配方案,这两个page就可以省下来了。
上述模型理论上看起来无懈可击,但是实际在ARM64架构的实现上,还会碰到一些技术性的难题。主要包括:
1、异常处理时的栈指针问题:ARM64架构上Linux内核运行在EL1异常级别上,整个异常级别只有一个栈指针SP_EL1,缺页异常时,SP_EL1以及其他所有通用寄存器都属于异常环境上下文,不能被破坏;
2、死锁问题:在上述模型的第四步需要分配一个新的page以及映射该page。如果直接使用内核现成的API,这些API或多或少都会操作到一些公共的锁,如果恰好持有锁之后发送缺页异常,那么这时候再调用这些API必然会出现死锁。
针对上述问题可采用如下技术手段来解决上述两个问题:
ARM64架构默认处理各类异常时,都是将异常现场的寄存器保存到当前线程的内核栈中。需要在缺页异常时候完成分配内存以及创建映射的操作。这时候当前线程的栈都不存在。这两者之间是一个矛盾。由于这类缺页异常可以在任何CPU上发生,因此可定义一个per-cpu数组,用它来作为处理缺页异常时候的临时栈,完成缺页处理之后,再将栈切换回当前任务的栈。
由于ARM64在处理异常时CPU处于EL1模式下,无论是同步异常、IRQ、FIQ或者异步异常,在EL1模式下都只有一个sp栈指针。缺页异常发生时,SP_EL1寄存器仍然指向当前线程的内核栈,当前栈地址对应的page并未分配,因此无法直接将异常现场的所有寄存器保存到当前线程的内核栈中。而处理缺页异常需要完整的保存异常现场的所有寄存器,包括SP_EL1。如果这时候直接将SP_EL1替换成per-cpu的栈顶,那必然造成当前线程的sp栈指针丢失。要将SP_EL1顺利的切换到per-cpu的栈顶,必须使用中间寄存器来临时过渡。但是这时候异常现场的所有寄存器都没保存,对这些通用寄存器的任何赋值操作都会破坏异常现场。
要避免这种情况,只能从处理器的协处理器中找一些不常用的寄存器来临时存放数据。所幸Amlogic的方案中,实现了4个watch point寄存器。这4个watch point寄存器是可读写的,并且是64bit位宽。考虑到watch point功能平常基本不使用,并且用户空间、驱动也基本不会用到它,因此使用它来存放per-cpu栈顶看起来是安全的。最终,可选用DBGWVR3_EL1寄存器用来存放per-cpu的栈顶,用DBGWVR2_EL1寄存器来备份异常发生时候的SP栈指针。
这样一来,在异常发生时可以交换指向per-cpu栈顶的寄存器DBGWVR3_EL1以及SP_EL1寄存器的值。使得SP_EL1指向per-cpu的栈顶,而寄存器DBGWVR2_EL1备份了异常现场的线程栈指针。完成缺页处理之后,再交换回来DBGWVR2_EL1寄存器以及SP_EL1寄存器。使得SP再指向当前线程的内核栈。并返回异常发生的位置,继续执行。这时候SP指向的内存已经建立好映射,可以继续访问。图8的三个阶段展示了处理缺页异常时候栈切换的这个过程。
这个缺页异常的处理过程对所有线程而言就相当于产生了一个中断一样是透明的。
在本实施例中,采用按需分配的模式分配内存,当线程的栈指针指向地址边界时,对内核栈分配一新的存储页,并将新的存储页映射到内核栈指向的目标地址空间,从而极大的优化线程内核栈的内存消耗,提升了对内核栈下溢异常的检测能力;通过预先划分一段虚拟地址空间供线程内核栈使用有效的避免内存碎片化的问题。
基于Android O的代码,编译了一份含有本优化发明的测试code(标签)。并在测试code中增加打印老方式的内核栈数量以及优化后的当前实际栈使用数量。之后在P212平台上测试运行。为了尽可能的运行更多的应用以体现差异,从应用市场安装了10多个APP,并用monkey命令测试所有APP。然后抓取串口中的打印日志,从日志中提取内核栈的使用情况。经过5个半小时的monkey测试之后,得到了图9和图10所示的两个曲线图。
图9中a1表示为monkey测试过程中原内核栈方案消耗的内存变化曲线,a3表示为优化后的内核栈方案消耗的内存变化曲线,a2表示为这两个方案的差值,即节省下来的内存变化曲线。由图9可见,随着monkey测试的进行,原内核栈方案消耗的内存在40MB左右,即有2500多个线程在运行。而优化后的内核栈消耗基本在15MB以内。从曲线a2的对比来看,基本上可以达到25MB~30MB左右的内存节省。这在容量小于或等于1GB的小内存平台上来看,节省量是相当可观的。
图10为内核栈的优化方案和原生方案消耗内存的比例变化曲线。从Monkey测试过程中可以看到,刚开始测试的时候比值在25%附近,随着测试进行,不停的有线程的栈使用量超过了4KB,触发了缺页异常,因此内核栈的实际消耗量在增加。但最终比例曲线稳定在35%~40%之间。
在现有的原生栈实现方案中,内核栈使用的是线性映射区域的内存。对任何模块和线程而言,在线性映射区域的所有内存都是可以无差别访问的,这就导致如果栈上溢或者下溢时,内核没有机制去及时发现它,只能在某些特殊时间点,比如线程退出时候通过判断在栈的某些特定位置填充的padding数据来检测。这种事后检测的行为往往于事无补。
使用本发明的内核栈实现,天生具备预警栈溢出的能力。如图11所示,因为内核栈(Thread stack)创建在vmalloc区域,vmalloc接口在分配内存时会默认多创建一个page的地址空间,这个多创建的地址空间称为Guard page(头页),该地址空间并不实际分配内存。比如调用者使用vmalloc函数申请16KB内存(4个page),vmalloc内部实际会在vmalloc的地址空间中划分20KB的范围(4+1个page)出来,只有低16KB真正分配内存,剩下的Guard page并不分配内存。这样vmalloc的使用者如果在使用这片内存时发生越界,访问的地址落在了Guard page时,就会触发MMU的缺页异常,内核就能感知并汇报这种错误。
图11还展示了内核栈优化方案预警栈下溢的方式。当栈指针sp继续向下生长到栈地址空间的最后一个page时,可以在缺页异常处理函数里面增加对函数调用栈的打印来报警。这样,通过分析日志就能准确定位栈的溢出问题。
如图12所示,本发明还提供了一种内核栈的分配装置,预先划分一段虚拟地址空间供线程内核栈使用,所述分配装置包括:
分配单元1,用于当接收到创建线程指令时,基于所述虚拟地址空间为线程内核栈分配连续的目标地址空间;
管理单元2,用于采用位图对所有线程的所述目标地址空间进行映射管理,所述目标地址空间包括异常缓存区和存储区,所述异常缓存区位于所述目标地址空间的头区域;
映射单元3,用于对所述内核栈分配一存储页,并将所述存储页映射到所述目标地址空间的所述存储区,所述线程运行时栈指针指向所述内核栈的所述存储页所在的目标地址空间,所述存储页映射的目标地址空间的底部为地址边界;
处理单元4,用于当所述线程的栈指针下溢出所述地址中的页边界时,硬件产生缺页异常,在缺页异常处理程序中对所述内核栈分配一新的存储页,并将所述新的存储页映射到所述内核栈指向的目标地址空间。
在本实施例中,采用按需分配的模式分配内存,当线程的栈指针指向地址边界时,对内核栈分配一新的存储页,并将新的存储页映射到内核栈指向的目标地址空间,从而极大的优化线程内核栈的内存消耗,提升了对内核栈下溢异常的检测能力;通过预先划分一段虚拟地址空间供线程内核栈使用有效的避免内存碎片化的问题。在优选的实施例中,所述管理单元2采用位图对所述目标地址空间进行映射管理时,在位图中当bit值为0时表示对应的地址空间未使用,当bit值为1时表示对应的地址空间已使用,采用公式(1)表示地址空间的线性映射关系:
T=A+N×16KB(1)
其中,T表示创建的线程地址;A表示虚拟地址空间的起始地址;N表示与线程对应的bit值在位图的位置。
在优选的实施例中,所述存储页映射到所述目标地址空间的所述存储区的容量为16KB。
在优选的实施例中,所述处理单元4提供一备份存储器用于存储所述缺页异常的栈指针,还提供一临时存储器用于存储处理缺页异常所需的每个处理器栈内存;当所述线程的栈指针下溢出所述地址内的页边界时,发生缺页异常,所述栈指针下溢出所述每个处理器栈内存,所述备份存储器存储所述异常现场的栈指针;对所述内核栈分配一新的存储页,并将所述新的存储页映射到所述内核栈指向的目标地址空间;将所述备份存储器的栈指针切换至所述目标地址空间指向当前线程的内核栈,并使所述栈指针返回发生异常时所述栈指针指向的位置。
本发明的优点有:
(1)基于缺页异常模型,只在栈指针下溢触发缺页异常时才分配内存,做到按需分配;
(2)基于处理器特性解决缺页异常时候的换栈问题以及死锁问题;
(3)能极大的优化线程内核栈的内存消耗,优化后的线程内核栈消耗降低到原生方案的35%左右;
(4)能有效避免内存碎片化问题;
(5)具有对内核栈上溢以及下溢的异常检测能力。
上述特性使得本发明能极大的减去小内存平台上内核栈带来的内存压力以及碎片化问题,能减轻小内存平台由于内存紧张导致的卡顿情况。
以上所述仅为本发明较佳的实施例,并非因此限制本发明的实施方式及保护范围,对于本领域技术人员而言,应当能够意识到凡运用本发明说明书及图示内容所作出的等同替换和显而易见的变化所得到的方案,均应当包含在本发明的保护范围内。
Claims (8)
1.一种内核栈的分配方法,其特征在于,预先划分一段虚拟地址空间供线程内核栈使用,所述分配方法包括:
S1.当接收到创建线程指令时,基于所述虚拟地址空间为线程内核栈分配连续的目标地址空间;
S2.采用位图对所有线程的所述目标地址空间进行映射管理;
S3.所述目标地址空间包括异常缓存区和存储区,所述异常缓存区位于所述目标地址空间的头区域;
S4.对所述内核栈分配一存储页,并将所述存储页映射到所述目标地址空间的所述存储区,所述线程运行时栈指针指向所述内核栈的所述存储页所在的目标地址空间,所述存储页映射的目标地址空间的底部为地址边界;
S5.当所述线程的栈指针下溢出所述地址中的页边界时,硬件产生缺页异常,在缺页异常处理程序中对所述内核栈分配一新的存储页,并将所述新的存储页映射到所述内核栈指向的目标地址空间。
2.根据权利要求1所述的内核栈的分配方法,其特征在于,所述步骤S2采用位图对所述目标地址空间进行映射管理,包括:
在位图中当bit值为0时表示对应的地址空间未使用,当bit值为1时表示对应的地址空间已使用,采用公式(1)表示地址空间的线性映射关系:
T=A+N×16KB (1)
其中,T表示创建的线程地址;A表示虚拟地址空间的起始地址;N表示与线程对应的bit值在位图的位置。
3.根据权利要求1所述的内核栈的分配方法,其特征在于,所述存储页映射到所述目标地址空间的所述存储区的容量为16KB。
4.根据权利要求1所述的内核栈的分配方法,其特征在于,所述步骤S5当所述线程的栈指针下溢出所述地址中的页边界时,对所述内核栈分配一新的存储页,并将所述新的存储页映射到所述内核栈指向的目标地址空间,包括:
提供一备份存储器用于存储所述缺页异常发生时的栈指针,还提供一临时存储器用于存储处理缺页异常时所需的每个处理器栈内存;
当所述线程的栈指针下溢出所述地址内的页边界时,发生缺页异常,所述栈指针指向所述每个处理器栈内存,所述备份存储器存储所述异常现场的栈指针;
对所述内核栈分配一新的存储页,并将所述新的存储页映射到所述内核栈指向的目标地址空间;
将所述备份存储器的栈指针切换至所述目标地址空间指向当前线程的内核栈,并使所述栈指针返回发生异常时所述栈指针指向的位置。
5.一种内核栈的分配装置,其特征在于,预先划分一段虚拟地址空间供线程内核栈使用,所述分配装置包括:
分配单元,用于当接收到创建线程指令时,基于所述虚拟地址空间为线程内核栈分配连续的目标地址空间;
管理单元,用于采用位图对所有线程的所述目标地址空间进行映射管理,所述目标地址空间包括异常缓存区和存储区,所述异常缓存区位于所述目标地址空间的头区域;
映射单元,用于对所述内核栈分配一存储页,并将所述存储页映射到所述目标地址空间的所述存储区,所述线程运行时栈指针指向所述内核栈的所述存储页所在的目标地址空间,所述存储页映射的目标地址空间的底部为地址边界;
处理单元,用于当所述线程的栈指针下溢出所述地址中的页边界时,硬件产生缺页异常,在缺页异常处理程序中对所述内核栈分配一新的存储页,并将所述新的存储页映射到所述内核栈指向的目标地址空间。
6.根据权利要求5所述的内核栈的分配装置,其特征在于,所述管理单元采用位图对所述目标地址空间进行映射管理时,在位图中当bit值为0时表示对应的地址空间未使用,当bit值为1时表示对应的地址空间已使用,采用公式(1)表示地址空间的线性映射关系:
T=A+N×16KB (1)
其中,T表示创建的线程地址;A表示虚拟地址空间的起始地址;N表示与线程对应的bit值在位图的位置。
7.根据权利要求5所述的内核栈的分配装置,其特征在于,所述存储页映射到所述目标地址空间的所述存储区的容量为16KB。
8.根据权利要求5所述的内核栈的分配装置,其特征在于,所述处理单元提供一备份存储器用于存储所述缺页异常的栈指针,还提供一临时存储器用于存储处理缺页异常所需的每个处理器栈内存;当所述线程的栈指针下溢出所述地址内的页边界时,发生缺页异常,所述栈指针下溢出所述每个处理器栈内存,所述备份存储器存储所述异常现场的栈指针;对所述内核栈分配一新的存储页,并将所述新的存储页映射到所述内核栈指向的目标地址空间;将所述备份存储器的栈指针切换至所述目标地址空间指向当前线程的内核栈,并使所述栈指针返回发生异常时所述栈指针指向的位置。
Priority Applications (3)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201811626288.8A CN109857677B (zh) | 2018-12-28 | 2018-12-28 | 内核栈的分配方法及装置 |
US16/721,636 US20200210342A1 (en) | 2018-12-28 | 2019-12-19 | Kernel stack distribution method and device |
EP19219520.4A EP3674896A1 (en) | 2018-12-28 | 2019-12-23 | Kernel stack distribution method and device |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201811626288.8A CN109857677B (zh) | 2018-12-28 | 2018-12-28 | 内核栈的分配方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN109857677A true CN109857677A (zh) | 2019-06-07 |
CN109857677B CN109857677B (zh) | 2023-03-31 |
Family
ID=66892997
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201811626288.8A Active CN109857677B (zh) | 2018-12-28 | 2018-12-28 | 内核栈的分配方法及装置 |
Country Status (3)
Country | Link |
---|---|
US (1) | US20200210342A1 (zh) |
EP (1) | EP3674896A1 (zh) |
CN (1) | CN109857677B (zh) |
Cited By (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110618946A (zh) * | 2019-08-19 | 2019-12-27 | 中国第一汽车股份有限公司 | 堆栈内存分配方法、装置、设备和存储介质 |
CN111338831A (zh) * | 2020-02-10 | 2020-06-26 | 北京字节跳动网络技术有限公司 | 一种多线程运行性能的处理方法、装置、介质和电子设备 |
CN111737019A (zh) * | 2020-08-31 | 2020-10-02 | 西安芯瞳半导体技术有限公司 | 一种显存资源的调度方法、装置及计算机存储介质 |
CN112162855A (zh) * | 2020-09-21 | 2021-01-01 | 南开大学 | 基于页锁定内存的gpu页缺失处理方法、系统及介质 |
CN115098244A (zh) * | 2022-05-30 | 2022-09-23 | 荣耀终端有限公司 | 内核栈的分配方法、电子设备、芯片及存储介质 |
WO2023193630A1 (zh) * | 2022-04-08 | 2023-10-12 | 北京字节跳动网络技术有限公司 | 一种峰值检测方法、装置、计算机设备和存储介质 |
Families Citing this family (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US10909042B1 (en) * | 2019-07-19 | 2021-02-02 | Cylance Inc. | Prevention of hash-based API importing |
CN113672388B (zh) * | 2021-08-18 | 2023-09-05 | 广州虎牙科技有限公司 | 线程栈空间调整方法及相关装置 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104007993A (zh) * | 2014-06-11 | 2014-08-27 | 中国科学院信息工程研究所 | 一种Linux系统内存敏感数据的清除方法及装置 |
CN107046508A (zh) * | 2016-02-05 | 2017-08-15 | 华为技术有限公司 | 报文接收方法及网络设备 |
CN107479946A (zh) * | 2017-08-16 | 2017-12-15 | 南京大学 | 一种内核模块的交互行为监控方案 |
CN107729159A (zh) * | 2017-09-29 | 2018-02-23 | 华为技术有限公司 | 一种共享内存的地址映射方法及装置 |
Family Cites Families (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5950221A (en) * | 1997-02-06 | 1999-09-07 | Microsoft Corporation | Variably-sized kernel memory stacks |
US6012129A (en) * | 1997-03-31 | 2000-01-04 | International Business Machines Corporation | Apparatus and method allocating virtual memory upon demand |
US7124251B2 (en) * | 2002-06-24 | 2006-10-17 | Microsoft Corporation | Stack allocation system and method |
US7178002B2 (en) * | 2002-07-24 | 2007-02-13 | Sun Microsystems, Inc. | Methods and systems for dynamically growing multiple stacks |
US20050198464A1 (en) * | 2004-03-04 | 2005-09-08 | Savaje Technologies, Inc. | Lazy stack memory allocation in systems with virtual memory |
-
2018
- 2018-12-28 CN CN201811626288.8A patent/CN109857677B/zh active Active
-
2019
- 2019-12-19 US US16/721,636 patent/US20200210342A1/en not_active Abandoned
- 2019-12-23 EP EP19219520.4A patent/EP3674896A1/en active Pending
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104007993A (zh) * | 2014-06-11 | 2014-08-27 | 中国科学院信息工程研究所 | 一种Linux系统内存敏感数据的清除方法及装置 |
CN107046508A (zh) * | 2016-02-05 | 2017-08-15 | 华为技术有限公司 | 报文接收方法及网络设备 |
CN107479946A (zh) * | 2017-08-16 | 2017-12-15 | 南京大学 | 一种内核模块的交互行为监控方案 |
CN107729159A (zh) * | 2017-09-29 | 2018-02-23 | 华为技术有限公司 | 一种共享内存的地址映射方法及装置 |
Cited By (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110618946A (zh) * | 2019-08-19 | 2019-12-27 | 中国第一汽车股份有限公司 | 堆栈内存分配方法、装置、设备和存储介质 |
CN111338831A (zh) * | 2020-02-10 | 2020-06-26 | 北京字节跳动网络技术有限公司 | 一种多线程运行性能的处理方法、装置、介质和电子设备 |
CN111338831B (zh) * | 2020-02-10 | 2023-06-09 | 北京字节跳动网络技术有限公司 | 一种多线程运行性能的处理方法、装置、介质和电子设备 |
CN111737019A (zh) * | 2020-08-31 | 2020-10-02 | 西安芯瞳半导体技术有限公司 | 一种显存资源的调度方法、装置及计算机存储介质 |
CN112162855A (zh) * | 2020-09-21 | 2021-01-01 | 南开大学 | 基于页锁定内存的gpu页缺失处理方法、系统及介质 |
CN112162855B (zh) * | 2020-09-21 | 2022-07-29 | 南开大学 | 基于页锁定内存的gpu页缺失处理方法、系统及介质 |
WO2023193630A1 (zh) * | 2022-04-08 | 2023-10-12 | 北京字节跳动网络技术有限公司 | 一种峰值检测方法、装置、计算机设备和存储介质 |
CN115098244A (zh) * | 2022-05-30 | 2022-09-23 | 荣耀终端有限公司 | 内核栈的分配方法、电子设备、芯片及存储介质 |
CN115098244B (zh) * | 2022-05-30 | 2024-04-05 | 荣耀终端有限公司 | 内核栈的分配方法、电子设备、芯片及存储介质 |
Also Published As
Publication number | Publication date |
---|---|
EP3674896A1 (en) | 2020-07-01 |
US20200210342A1 (en) | 2020-07-02 |
CN109857677B (zh) | 2023-03-31 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN109857677A (zh) | 内核栈的分配方法及装置 | |
US7356665B2 (en) | Method and system for machine memory power and availability management in a processing system supporting multiple virtual machines | |
US10282299B2 (en) | Managing cache partitions based on cache usage information | |
US8601201B2 (en) | Managing memory across a network of cloned virtual machines | |
US7716446B1 (en) | System and method for cooperative virtual machine memory scheduling | |
JP2019532450A (ja) | 巨大ページをサポートするメモリ管理 | |
CN103176845B (zh) | 一种虚拟机部署方法、系统和装置 | |
CN105103144A (zh) | 用于存储器的自适应控制的设备及方法 | |
JP2008040606A (ja) | 低消費電力メモリ管理方法及びその方法を用いた計算機 | |
CN107783812B (zh) | 虚拟机内存管理方法及装置 | |
CN102346682A (zh) | 信息处理装置及信息处理方法 | |
CN101238441A (zh) | 计算装置中的可抢占语境切换 | |
US20170371550A1 (en) | Frame choosing during storage constraint condition | |
CN103885815A (zh) | 一种基于热页迁移的虚拟机动态缓存方法 | |
Zhou et al. | Leveraging phase change memory to achieve efficient virtual machine execution | |
US20140149674A1 (en) | Performance and Energy Efficiency While Using Large Pages | |
CN101739346B (zh) | 对安全控制模块内存进行集中控制的方法 | |
CN106250328A (zh) | 存储器保护单元、存储器管理单元和微控制器 | |
Carver et al. | ACDC: Advanced consolidation for dynamic containers | |
US11947992B2 (en) | Methods and apparatuses for managing TLB cache in virtualization platform | |
Xiang et al. | MATRYOSHKA: Non-Exclusive Memory Tiering via Transactional Page Migration | |
Scolari et al. | A survey on recent hardware and software-level cache management techniques | |
Gorman et al. | Supporting the allocation of large contiguous regions of memory | |
Giersch et al. | Virtual Memory Revisited for Tiered Memory | |
Kawai | VMMF: Volatile memory management framework |
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 |