页交换方法、装置和电子设备与流程

文档序号:30970625发布日期:2022-08-02 21:12阅读:66来源:国知局
1.本公开涉及计算机
技术领域
:,具体涉及页交换方法、装置和电子设备。
背景技术
::2.当前,数据中心应用的内存消耗不断增加。鉴于单个服务器可以容纳的动态随机存取存储器(dram)容量有限,内存密集型应用程序(例如,数据分析系统、图形处理系统以及内存缓存系统和数据库)面临着巨大的内存压力。内核交换(kernelswapping)可以通过将非活动页换出(page-out)到高性能固态硬盘(ssd)和远端内存来缓解这种压力。在内核从交换空间(swapspace)换入(swap-in)页面前,内核首先要进行页换出为换入的页面腾出空间。然而,页换出是一个位于关键路径上的、扩展性差、且重量级的操作。3.当前的内核交换系统(kernelswapsystem)是为磁盘(hdd)用作交换设备(swapdevices)并且磁盘访问速度慢的传统场景而设计的。应用程序不能频繁交换到磁盘以避免不可接受的性能下降。然而,这种假设在混合存储架构设置下并不成立,因为与传统hdd/ssd相比,非易失性存储器(nvm)提供了更高的读/写带宽和更低的随机访问延迟。因此,应用程序在混合内存下的交换吞吐量可以比交换到磁盘上高数个数量级。例如,如果在混合存储器上运行某种逻辑回归测试,则其中25%的工作集位于dram端,75%的工作集位于nvm端。实验结果表明,在运行中每个cpu核心每100us就会产生一次主要缺页错误(majorpagefault)。高频换入伴随着高频换出,以为新换入的页面腾出空间。4.换出是操作系统内核缺页错误处理路径中的一项重量级任务。每次换出首先通过扫描内核lru(leastrecentlyused,最近最少使用)活动/非活动页面列表选择受害者物理页面,然后通过反向映射搜索引用受害者物理页面的页表项(pagetableentry,pte),最后向所有在线cpu核心发送处理器间中断(inter-processorinterrupt,ipi)广播以击落转换查找缓冲区(translationlookupbuffer,tlb),将页面写出到nvm等。这一系列复杂的过程会引入很高的计算开销。此外,发送和响应ipi的成本随着在线cpu核心的数量而增加,导致严重的可扩展性问题。频繁的tlb击落和刷新也会增加tlb未命中(tlbmiss)率并损害应用程序性能。技术实现要素:5.为了解决现有术中的问题,本公开实施例提供混合存储架构的轻量级页交换方法、装置和电子设备,通过使用每线程页表来解决页换出操作中的tlb击落的可扩展性问题,并且可以降低页换出过程的计算开销。6.第一方面,本公开实施例中提供了一种页交换方法,其中,所述方法包括:7.为第一类型线程分配每线程页表,以记录所述第一类型线程本地访问的页面的页面映射;8.为所述第一类型线程所属的进程分配全局页表以记录所述进程中的线程访问的页面的页面映射;9.在进行页交换时执行缺页处理的情况下,检测所述全局页表的页表项在所述全局页表中的共享状态,其中,所述全局页表中的页表项附有cpu核心位图,以跟踪在转换查找缓冲区中缓存所述页表项的所有cpu核心,从而确定页表项的共享状态;10.根据检测到的所述全局页表的页表项在所述全局页表中的共享状态,基于所述缺页处理所涉及的每线程页表和全局页表,对调度所述缺页处理所涉及的线程的cpu核心的转换查找缓冲区执行击落处理。11.结合第一方面,本公开在第一方面的第一种实现方式中,根据检测到的所述全局页表的页表项在所述全局页表中的共享状态,基于所述缺页处理所涉及的每线程页表和全局页表,对调度所述缺页处理所涉及的线程的cpu核心的转换查找缓冲区执行击落处理,包括:12.基于在对所述转换查找缓冲区执行击落时出现转换查找缓冲区未命中的情况,利用在所述转换查找缓冲区中缓存所述页表项的cpu核心中的内存管理单元遍历遵照相同的页表结构的每线程页表;13.基于所述cpu核心中的内存管理单元的遍历结果,基于所述缺页处理所涉及的每线程页表和全局页表,对调度所述缺页处理所涉及的线程的cpu核心的转换查找缓冲区执行击落处理。14.结合第一方面或第一方面的第一种实现方式,本公开在第一方面的第二种实现方式中,所述缺页处理包括以下处理至少之一:15.对于加载有每线程页表的cpu核心,在缺页错误为每线程页表中缺少对应的页表项的情况下,通过所述全局页表使得所述每线程页表获取所缺少的页表项;16.对于加载有每线程页表的cpu核心,在缺页错误为每线程页表和所述全局页表中缺少对应的页表项的情况下,通过操作系统内核获取有效页表项,将获取的页表项填充到所述每线程页表,利用指向所述每线程页表的所述页表项的特定前向指针标记所述全局页表中的页表项;17.对于加载有全局页表的cpu核心,在缺页错误为指向所述每线程页表的页表项的特定前向指针无效的情况下,通过操作系统内核将所述页表项的值复制到所述全局页表,在所述页表项的cpu核心位图将所述页表项标记为共享;18.对于加载有全局页表的cpu核心,在缺页错误为页表项不存在的情况下,通过操作系统内核获取有效页表项,将获取的页表项填充到所述每线程页表,利用指向所述每线程页表的所述页表项的特定前向指针标记所述全局页表中的页表项。19.结合第一方面或第一方面的第一种实现方式,本公开在第一方面的第三种实现方式中,所述根据检测到的所述全局页表的页表项在所述全局页表中的共享状态,基于所述缺页处理所涉及的每线程页表和全局页表,对调度所述缺页处理所涉及的线程的cpu核心的转换查找缓冲区执行击落处理,包括:20.根据检测到的所述全局页表的页表项在所述全局页表中处于私有状态,调度所述缺页处理所涉及的线程的cpu核心将从自身的转换查找缓冲区中击落所述页表项并且跳过处理器间中断广播,或者21.根据检测到的所述全局页表的页表项在所述全局页表中处于共享状态,调度所述缺页处理所涉及的线程的cpu核心将仅向所述cpu核心位图中记录的cpu核心发送处理器间中断请求,并且调度所述缺页处理所涉及的线程的cpu核心和所述cpu核心位图中记录的cpu核心调度除第一类型线程以外的第二类型线程。22.结合第一方面,本公开在第一方面的第四种实现方式中,所述第一类型线程由具有轻量级并发的编程语言的运行时创建和启动。23.结合第一方面的第四种实现方式,本公开在第一方面的第五种实现方式中,所述方法还包括:24.利用操作系统内核和所述具有轻量级并发的编程语言的运行时将缺页处理中执行的换出线程导出为换出轻量级线程,以通过所述运行时将所述换出轻量级线程与所述运行时管理和调度的用户轻量级线程一起调度,使得所述换出轻量级线程被异步执行。25.结合第一方面的第五种实现方式,本公开在第一方面的第六种实现方式中,所述方法还包括:26.为所述换出轻量级线程被执行的多个步骤插入安全点;27.在启动所述运行时时在操作系统内核中分配一组内存区域来存储换出状态信息;28.所述换出轻量级线程从该组内存区域中分配子内存区域并将所述换出轻量级线程的执行状态保存到所述子内存区域;29.通过应用程序内核在每个安全点向所述运行时返回作为所述子内存区域的索引的标识;30.通过所述运行时在重新调度所述换出轻量级线程时将所述标识传递回所述操作系统内核。31.结合第一方面的第五种实现方式或第六种实现方式,本公开在第一方面的第七种实现方式中,所述通过所述运行时将所述换出轻量级线程与所述运行时管理和调度的用户轻量级线程一起调度,包括:32.通过所述运行时为所述换出轻量级线程分配比所述用户轻量级线程更低的优先级。33.结合第一方面或第一方面的第一种实现方式,本公开在第一方面的第八种实现方式中,在混合存储架构中执行页交换,所述混合存储架构为至少包括动态随机存取存储器dram和非易失性存储器nvm的混合存储架构。34.第二方面,本公开实施例中提供了一种页交换装置,其中,所述装置包括:35.每线程页表分配模块,被配置为为第一类型线程分配每线程页表,以记录所述第一类型线程本地访问的页面的页面映射;36.全局页表分配模块,被配置为为所述第一类型线程所属的进程分配全局页表以记录所述进程中的线程访问的页面的页面映射;37.页表项检测模块,被配置为在进行页交换时执行缺页处理的情况下,检测所述全局页表的页表项在所述全局页表中的共享状态,其中,所述全局页表中的页表项附有cpu核心位图,以跟踪在转换查找缓冲区中缓存所述页表项的所有cpu核心,从而确定页表项的共享状态;38.转换查找缓冲区执行击落处理模块,被配置为根据检测到的所述全局页表的页表项在所述全局页表中的共享状态,基于所述缺页处理所涉及的每线程页表和全局页表,对调度所述缺页处理所涉及的线程的cpu核心的转换查找缓冲区执行击落处理。39.第三方面,本公开实施例中提供了一种电子设备,包括存储器和处理器;其中,所述存储器用于存储一条或多条计算机指令,其中,所述一条或多条计算机指令被所述处理器执行以实现如第一方面、第一方面的第一种实现方式到第八种实现方式任一项所述的方法。40.第四方面,本公开实施例中提供了一种可读存储介质,其上存储有计算机指令,该计算机指令被处理器执行时实现如第一方面、第一方面的第一种实现方式到第八种实现方式任一项所述的方法。41.第五方面,本公开实施例中提供了一种计算机程序产品,包括计算机指令,该计算机指令被处理器执行时实现第一方面、第一方面的第一种实现方式到第八种实现方式任一项所述的方法。42.本公开实施例提供的技术方案可以包括以下有益效果:43.根据本公开实施例提供的技术方案,通过为第一类型线程分配每线程页表,以记录所述第一类型线程本地访问的页面的页面映射;为所述第一类型线程所属的进程分配全局页表以记录所述进程中的线程访问的页面的页面映射;在进行页交换时执行缺页处理的情况下,检测所述全局页表的页表项在所述全局页表中的共享状态,其中,所述全局页表中的页表项附有cpu核心位图,以跟踪在转换查找缓冲区中缓存所述页表项的所有cpu核心,从而确定页表项的共享状态;根据检测到的所述全局页表的页表项在所述全局页表中的共享状态,基于所述缺页处理所涉及的每线程页表和全局页表,对调度所述缺页处理所涉及的线程的cpu核心的转换查找缓冲区执行击落处理,可以通过使用每线程页表来解决页换出操作中的tlb击落的可扩展性问题,并且可以降低页换出过程的计算开销。44.根据本公开实施例提供的技术方案,通过根据检测到的所述全局页表的页表项在所述全局页表中的共享状态,基于所述缺页处理所涉及的每线程页表和全局页表,对调度所述缺页处理所涉及的线程的cpu核心的转换查找缓冲区执行击落处理,包括:基于在对所述转换查找缓冲区执行击落时出现转换查找缓冲区未命中的情况,利用在所述转换查找缓冲区中缓存所述页表项的cpu核心中的内存管理单元遍历遵照相同的页表结构的每线程页表;基于所述cpu核心中的内存管理单元的遍历结果,基于所述缺页处理所涉及的每线程页表和全局页表,对调度所述缺页处理所涉及的线程的cpu核心的转换查找缓冲区执行击落处理,可以通过使用每线程页表来解决页换出操作中的tlb击落的可扩展性问题,并且可以降低页换出过程的计算开销。45.根据本公开实施例提供的技术方案,通过所述缺页处理包括以下处理至少之一:对于加载有每线程页表的cpu核心,在缺页错误为每线程页表中缺少对应的页表项的情况下,通过所述全局页表使得所述每线程页表获取所缺少的页表项;对于加载有每线程页表的cpu核心,在缺页错误为每线程页表和所述全局页表中缺少对应的页表项的情况下,通过操作系统内核获取有效页表项,将获取的页表项填充到所述每线程页表,利用指向所述每线程页表的所述页表项的特定前向指针标记所述全局页表中的页表项;对于加载有全局页表的cpu核心,在缺页错误为指向所述每线程页表的页表项的特定前向指针无效的情况下,通过操作系统内核将所述页表项的值复制到所述全局页表,在所述页表项的cpu核心位图将所述页表项标记为共享;对于加载有全局页表的cpu核心,在缺页错误为页表项不存在的情况下,通过操作系统内核获取有效页表项,将获取的页表项填充到所述每线程页表,利用指向所述每线程页表的所述页表项的特定前向指针标记所述全局页表中的页表项,可以通过使用每线程页表来解决页换出操作中的tlb击落的可扩展性问题,并且可以降低页换出过程的计算开销。46.根据本公开实施例提供的技术方案,通过所述根据检测到的所述全局页表的页表项在所述全局页表中的共享状态,基于所述缺页处理所涉及的每线程页表和全局页表,对调度所述缺页处理所涉及的线程的cpu核心的转换查找缓冲区执行击落处理,包括:根据检测到的所述全局页表的页表项在所述全局页表中处于私有状态,调度所述缺页处理所涉及的线程的cpu核心将从自身的转换查找缓冲区中击落所述页表项并且跳过处理器间中断广播,或者根据检测到的所述全局页表的页表项在所述全局页表中处于共享状态,调度所述缺页处理所涉及的线程的cpu核心将仅向所述cpu核心位图中记录的cpu核心发送处理器间中断请求,并且调度所述缺页处理所涉及的线程的cpu核心和所述cpu核心位图中记录的cpu核心调度除第一类型线程以外的第二类型线程,可以通过使用每线程页表来解决页换出操作中的tlb击落的可扩展性问题,并且可以降低页换出过程的计算开销。47.根据本公开实施例提供的技术方案,通过所述第一类型线程由具有轻量级并发的编程语言的运行时创建和启动,减少了具有轻量级并发的编程语言的换出开销。48.根据本公开实施例提供的技术方案,通过利用操作系统内核和所述具有轻量级并发的编程语言的运行时将缺页处理中执行的换出线程导出为换出轻量级线程,以通过所述运行时将所述换出轻量级线程与所述运行时管理和调度的用户轻量级线程一起调度,使得所述换出轻量级线程被异步执行,可以将换出线程解耦为一些换出轻量级线程,并且与普通的用户轻量级线程共同调度,以异步执行换出操作,从而减少了具有轻量级并发的编程语言的换出开销。49.根据本公开实施例提供的技术方案,通过为所述换出轻量级线程被执行的多个步骤插入安全点;在启动所述运行时时在操作系统内核中分配一组内存区域来存储换出状态信息;所述换出轻量级线程从该组内存区域中分配子内存区域并将所述换出轻量级线程的执行状态保存到所述子内存区域;通过应用程序内核在每个安全点向所述运行时返回作为所述子内存区域的索引的标识;通过所述运行时在重新调度所述换出轻量级线程时将所述标识传递回所述操作系统内核,可以将换出线程解耦为一些换出轻量级线程,并且与普通的用户轻量级线程共同调度,以异步执行换出操作,从而减少了具有轻量级并发的编程语言的换出开销。50.根据本公开实施例提供的技术方案,通过所述运行时将所述换出轻量级线程与所述运行时管理和调度的用户轻量级线程一起调度,包括:通过所述运行时为所述换出轻量级线程分配比所述用户轻量级线程更低的优先级,可以将换出线程解耦为一些换出轻量级线程,并且与普通的用户轻量级线程共同调度,以异步执行换出操作,从而减少了具有轻量级并发的编程语言的换出开销。51.根据本公开实施例提供的技术方案,通过在混合存储架构中执行页交换,所述混合存储架构为至少包括动态随机存取存储器dram和非易失性存储器nvm的混合存储架构,可以针对dram和nvm的混合存储架构,通过使用每线程页表来解决页换出操作中的tlb击落的可扩展性问题,并且可以降低页换出过程的计算开销。52.根据本公开实施例提供的技术方案,通过每线程页表分配模块,被配置为为第一collectionandlight-weightconcurrency):很多通用编程语言具有内置的轻量级并发(light-weightconcurrency)支持(参见下面的定义)和垃圾收集运行时系统(参见下面的定义)。go和erlang是此类语言的两个示例。go是一种流行的现代语言,我们在本公开的实施例描述中使用go语言作为示例。以下实施例也将具有垃圾收集和轻量级并发的编程语言称作具有轻量级并发的编程语言。轻量级并发指的是使用具有轻量级并发的编程语言的轻量级线程时运行可以存在的大量并发,因此,被称之为具有轻量级并发的编程语言。与传统的系统级线程和进程相比,轻量级线程的最大优势在于其“轻量级”,可以轻松创建百万个甚至千万个而不会导致系统资源耗尽;而线程和进程可被系统资源允许运行的数量要远远小于该数量。67.轻量级并发由语言运行时(languageruntime)管理的轻量级用户级线程提供。例如,goroutine是由go运行时(goruntime)管理和调度的轻量级用户级线程(或者简称为轻量级线程)。go运行时创建一组内核线程作为mutator线程池,并将goroutine调度到用户级别的线程池中的可用线程上。在整个文档中,我们将内核线程称为“线程”。68.go中的垃圾收集(garbagecollection,gc):除了mutator线程,go运行时还创建了一组gc线程用于并发跟踪。gc线程从某些“根”对象开始跟踪,并通过引用链标记所有可访问的对象。当所有可达对象都被标记为活动时,跟踪就完成了。然后gc线程会将活动对象压缩至连续的内存区域并释放死对象所占用内存。运行用户代码的线程称为mutator线程,运行时为gc等辅助工作创建的其他线程是非mutator线程。69.页表:页表是一种驻留在内存中的数据结构,用于将虚拟内存地址映射到物理地址。在x86和x86-64体系结构中,页表可以被看作一棵由虚拟地址索引的基数树(radix-tree)。操作系统为每个进程提供一个页表,其地址存储在cpu的cr3寄存器中。在将虚拟地址转换为物理地址时,cpu会读取cr3寄存器以获取页表并检索映射。70.页表项(pte):基数树的叶子被称为pte,它存储物理内存地址和指示物理页状态的辅助位标志,例如访问位和脏位。例如,某种规范的pte结构中有多个可用位未被特定硬件使用,可由操作系统自定义。71.分页和交换(pagingandswapping):典型的操作系统将虚拟地址空间和物理内存空间划分为具有相同大小(例如,可以为4kb或2mb)的连续页面。当操作系统内存不足时,它将通过交换机制将最近未使用的页面换出(pageout)到交换空间(swapspace)。例如,交换空间通常位于nvm或磁盘上。稍后,当应用程序访问位于交换空间中的页面时,它将触发页面错误,并且操作系统会将页面取回主内存,这称为换入(swapin)。在本公开的实施例中,页面有时也被简称为页。72.处理器间中断(ipi):多核cpu中的一种特殊类型的硬件中断。ipi由一个cpu核心向其他cpu核心发出,可能会中断其他cpu核心并需要其他核心的操作和响应。73.tlb击落(tlbshootdown):转换查找缓冲区(translationlookupbuffer,tlb)是cpu的一类特殊缓存,用于缓存虚拟到物理内存地址的转换。在每次内存读/写操作时都会被访问。为提高效率,tlb通常不由硬件维护其一致性,而是通过操作系统实现tlb击落协议以维持tlb一致性。当一个虚拟页面的映射发生变化并且其tlb条目变得陈旧时,操作系统内核将击落所有cpu核心的tlb中的tlb项以恢复一致性。在实际实现中,内核可以直接击落当前cpu核心tlb中的对应项,但需要向所有远程cpu核心广播ipi请求,让它们根据ipi中的附加信息击落对应tlb项或刷新(flush)整个tlb,并等待它们的响应。ipi发送和响应的延迟将随着cpu核心数量的增加而提高。74.为了解决现有技术的问题,本公开的发明人考虑了以下相关方案:75.例如,一种基于访问位的tlb使无效机制:abis(accessbasedinvalidationsystem)将pte中的访问位重新用作pte共享状态的提示,如果页面仅由一个cpu核心访问,则在tlb击落期间避免ipi广播。abis在处理页面错误时构造一个假页表来复制页面映射。有了这样的副本页表,它就可以直接向cpu核心的tlb中插入一个项,而无需在相应的pte中设置访问位。如果其他cpu核心访问该页面并触发tlb未命中,则访问位将被设置,因此用作共享页面的指示符。但是,当tlb项被逐出并稍后重新插入时,abis可能会导致误报错(false-positiveindication)。gogc(garbagecollection)线程可以显著放大问题,因为它们同时跟踪活动对象,因此与mutator线程共享大量页面。76.例如,每核页表(per-corepagetable)方案:radixvm(基数虚拟机,radixvirtualmachine)提供了一个基数树结构的每核页表来跟踪页面共享状态以避免在tlb击落期间不必要的ipi广播。它是在缺乏许多内存管理功能的教学操作系统(teachingos)中实现的。pspt(部分分离式页表,partiallyseparatedpagetable)在hpc(高性能计算,highperformancecomputing)设置中为某种处理器提供了类似的每核页表设计。pspt要求程序员仔细标记每个内核页表将处理的计算区域。对程序进行如此详细的修改和注释对于非hpc应用程序通常是不切实际的。此外,这两种方案都没有全局页表,因此在修改页面映射时都需要更改多个页表中的pte,从而产生额外的开销。在使用每核页表而不是每线程页表的情况下,每核页表没有区分不同类型的应用程序线程(如mutator线程和gc线程)。77.例如,内核交换路径优化方案:fastswap(快速页交换,fastswap)通过绕过内核块io软件堆栈并利用frontswap(前端交换)接口来优化交换期间的页面读/写。它减少了执行页面io时的软件开销,但交换出操作仍然在其页面错误处理的关键路径中,并且tlb击落仍存在可扩展性问题。78.考虑相关技术方案的缺点,本公开实施例提出了一种每线程页表(per-threadpagetable)设计,以解决页换出过程中tlb击落的可扩展性(scalability)问题,并且降低换出过程的计算开销。另外,本公开实施例提出了通过将换出线程解耦为几个“换出轻量级线程(例如,goroutine)”并与普通轻量级线程(例如,goroutine)共同调度它们来减少具有垃圾收集和轻量级并发的编程语言(例如,go语言)应用程序的换出开销(swap-outoverhead)的方法。79.应该注意,“轻量级”是与“重量级”相对的概念,二者主要在对应用框架使用方便性、所提供服务特性等方面做比较。而且,本公开实施例中提及的“轻量级”指的是具有垃圾收集和轻量级并发的编程语言的“轻量级”。80.根据本公开实施例提供的技术方案,通过为第一类型线程分配每线程页表,以记录所述第一类型线程本地访问的页面的页面映射;为所述第一类型线程所属的进程分配全局页表以记录所述进程中的线程访问的页面的页面映射;在进行页交换时执行缺页处理的情况下,检测所述全局页表的页表项在所述全局页表中的共享状态,其中,所述全局页表中的页表项附有cpu核心位图,以跟踪在转换查找缓冲区中缓存所述页表项的所有cpu核心,从而确定页表项的共享状态;根据检测到的所述全局页表的页表项在所述全局页表中的共享状态,基于所述缺页处理所涉及的每线程页表和全局页表,对调度所述缺页处理所涉及的线程的cpu核心的转换查找缓冲区执行击落处理,可以通过使用每线程页表来解决页换出操作中的tlb击落的可扩展性问题,并且可以降低页换出过程的计算开销。81.为了解决上述问题,本公开提出页交换方法、装置、电子设备、可读存储介质和计算机程序产品。82.图1示出根据本公开一实施方式的页交换方法的流程图。如图1所示,页交换方法包括步骤s101、s102、s103、s104。83.在步骤s101中,为第一类型线程分配每线程页表,以记录所述第一类型线程本地访问的页面的页面映射。84.在步骤s102中,为所述第一类型线程所属的进程分配全局页表以记录所述进程中的线程访问的页面的页面映射。85.在步骤s103中,在进行页交换时执行缺页处理的情况下,检测所述全局页表的页表项在所述全局页表中的共享状态,其中,所述全局页表中的页表项附有cpu核心位图,以跟踪在转换查找缓冲区中缓存所述页表项的所有cpu核心,从而确定页表项的共享状态。86.在步骤s104中,根据检测到的所述全局页表的页表项在所述全局页表中的共享状态,基于所述缺页处理所涉及的每线程页表和全局页表,对调度所述缺页处理所涉及的线程的cpu核心的转换查找缓冲区执行击落处理。87.在本公开的一个实施例中,在混合存储架构中执行页交换,混合存储架构为至少包括动态随机存取存储器dram和非易失性存储器nvm的混合存储架构。相关技术的内核交换系统是为磁盘用作交换设备(swapdevice)并且磁盘访问速度慢的传统场景而设计的。应用程序不能频繁交换到磁盘以避免不可接受的性能下降。然而,这种假设在本公开实施例提及的混合存储架构下并不成立,因为与传统hdd/ssd相比,nvm提供了更高的读/写带宽和更低的随机访问延迟。因此,应用程序在混合内存下的交换吞吐量可以比交换到磁盘上高数个数量级。例如,如果在混合存储器上运行某种逻辑回归测试,则其中25%的工作集位于dram端,75%的工作集位于nvm端。实验结果表明,在运行中每个cpu核心每100us就会产生一次主要缺页错误(majorpagefault)。高频换入伴随着高频换出,以为新换入的页面腾出空间。在本公开的一个实施例中,混合存储架构可以包括多个存储层次,例如,nvm作为存储层次结构中dram和ssd之间的中间层,可以在应用程序内存不足时用作高性能交换分区。88.根据本公开实施例提供的技术方案,通过在混合存储架构中执行页交换,所述混合存储架构为至少包括动态随机存取存储器dram和非易失性存储器nvm的混合存储架构,可以针对dram和nvm的混合存储架构,通过使用每线程页表来解决页换出操作中的tlb击落的可扩展性问题,并且可以降低页换出过程的计算开销。89.在本公开的一个实施例中,所述第一类型线程由具有轻量级并发的编程语言的运行时创建和启动。在本公开的一个实施例中,具有轻量级并发的编程语言指的是前述具有垃圾收集和轻量级并发的编程语言,例如,go语言或erlang语言。90.根据本公开实施例提供的技术方案,通过所述第一类型线程由具有轻量级并发的编程语言的运行时创建和启动,减少了具有轻量级并发的编程语言的换出开销。91.在本公开的一个实施例中,页交换方法可以指的是用于混合存储架构的页交换方法。在本公开的一个实施例中,页交换方法可以指的是于混合存储架构的轻量级页交换方法。将页交换方法称为轻量级页交换方法指的是利用具有轻量级并发的编程语言支持的页交换方法。92.在本公开的一个实施例中,提出了一种分层页表结构来跟踪一个页面是否被多个cpu核心访问。如果一个物理页面只被单个核心访问,操作系统内核可以跳过昂贵的ipi广播并在驱逐页面时在本地执行tlb击落,从而降低换出中的tlb击落开销。为了平衡内存消耗和跟踪准确性,我们提出了用于每个gomutator线程的每线程页表,并提供用于所有(性能不重要的)非mutator线程的备份全局页表。可以通过保证每线程页表和全局页表的一致性,为mutator线程提供良好的性能。93.以下将参照图2描述根据本公开一实施方式的混合存储架构的轻量级页交换方法中所采用的页表结构。94.图2示出根据本公开一实施方式的混合存储架构的轻量级页交换方法中所采用的包括每线程页表和全局页表的页表结构的示例性示意图。95.以下参照图2描述页表结构的总体设计。如图2所示,为由go运行时(goruntime)启动的每个mutator线程分配一个每线程页表,以记录mutator线程本地访问的页面的页面映射,并且可以为mutator线程所属的整个进程保留一个“共享”的全局页表以记录多个线程访问的页面的页面映射。全局页表也被非mutator线程用于地址转换(请见图2中的cpu核心(或简称为核心)1)。操作系统还为每个核心保留一个标志,以标记当前位于该核心上的线程是否是mutator线程。如图2所示,mutator线程标志为1,非mutator线程标志为0。每线程页表结构和进程全局页表结构都可以类似于x86/x86-64传统页表结构,这两种页表结构在cr3值中共享相同的进程上下文标识符(process-contextidentifierpcid)(尽管图2中未示出,但是图2中全部cr3具有相同的pcid值)。还为全局页表中的每个pte附加了一个cpu核心位图,以跟踪可能在其tlb中缓存此pte的所有cpu核心。每个cpu核心在调度线程时会将每线程页表的地址加载到其cr3寄存器中。当遇到tlb未命中(tlbmiss)时,cpu核心中的内存管理单元(memorymanagementunit,mmu)仍然可以遍历遵照相同的页表结构的每线程页表。另外,全局页表中的pgd、pud、pmd等的含义可以从x86/x86-64传统页表结构中获知,本公开对此不作赘述。96.以下参照图2描述缺页错误(pagefault)处理。97.对于cr3加载了每线程页表的cpu核心,缺页错误可以分为两种情况:(1)每线程页表中缺少对应的pte,但可以在全局页表中解决;(2)pte在两者中都缺失。98.如果对应的pte在全局页表中有效,则属于情况(1),缺页处理程序会通过设置全局页表的pte的核心位图中的相应位将pte标记为共享,然后将pte值填入每线程页表,完成缺页错误处理。参见图2中的每线程页表中缺少pte204,由图例中的双点划线表示将全局页表中的pte203的值填入每线程页表。99.如果相应的pte既不存在于不存在于每线程页表中,也不存在于全局页表中,那么会得到一个真正的缺页错误,这属于情况(2)。对于情况(2),缺页错误处理程序首先遵循操作系统内核中原始的页面错误处理逻辑来获取有效的pte。然后我们锁定每线程页表和全局页表,只将这个pte填充到每线程页表中,并用一个指向每线程pte201的特殊前向指针标记全局pte202(由图2中的带箭头虚线表示,参见图例),并且最后解锁页表。该页面现在处于“私有”状态,因此可以在执行tlb击落时跳过ipi广播。100.对于cr3加载了全局页表的内核,缺页错误也可以分为两种情况:(1)全局页表的pte是指向每线程页表中某项的前向指针并且该pte无效;(2)pte在全局页表不存在。101.如果是情况(1),并且pte是前向指针,则操作系统应该锁定全局页表和前向指针指向的每线程页表,将pte值复制到全局页表中,并在核心位图中将这个pte标记为共享。102.如果是情况(2),处理方式与上述cr3加载了每线程页表的cpu核心时的缺页错误的情况(2)的处理方式相同。即,如果是情况(2)pte在全局页表不存在,则可以锁定全局页表,通过填充pte解决缺页错误,然后解锁全局页表。103.以下参照图2描述tlb未命中处理。对于一个mutator线程,当它所在的cpu核心遇到tlb未命中时,cpu核心的mmu将首先遍历当前mutator线程的每线程页表。如果pte有效,则mmu可以通过缓存pte来解决tlb未命中。如果每线程pte不存在,则mmu将触发缺页错误,然后由缺页错误处理程序处理。对于非mutator线程,由于它们直接使用全局页表,因此mmu会在tlb未命中时遍历全局页表。如果所需的pte不存在或pte前向指针指向每线程页表中的项,则会生成缺页错误并由缺页错误处理程序处理。104.以下参照图2描述tlb击落处理。当cpu的一个发起方核心(initiatorcore)想要击落一个pte时,操作系统内核会首先检测全局页表的pte在全局页表中的共享状态。如果全局页表中pte是私有的,那么发起方核心将从自己的tlb中击落pte并跳过ipi广播;如果全局页表中pte是共享的,那么发起方核心将只向核心位图中记录的核心发送ipi请求,并且核心调度非mutator线程。无论哪种情况,都可以节省大量ipi开销。105.以下参照图2描述页面映射改变。当发起方核心想要改变一个pte时,它需要保持它的每线程页表和全局页表的一致性。它将首先锁定其每线程页表和全局页表,并检测全局页表的pte的共享状态。如果pte是私有的,那么该cpu核心只需要在其每线程页表中直接更改pte。全局页表前向指针在这个过程中保持不变,因此不需要更新。如果pte是共享的,那么发起方核心需要将共享该pte的其他核心的每线程页表中的pte无效。对于那些当前没有调度线程的每线程页表,可以将它们的修改推迟到调度它们的时候。106.以下参照图2描述线程调度。操作系统在每次调度go线程时始终维护每核心mutator线程标志,如图2所示。每次操作系统启动一个mutator线程时,它都会为该mutator线程分配一个新分配的每线程页表,并将页表地址设置到所调度的核心的cr3寄存器中。稍后当操作系统停止线程时,操作系统首先会锁定全局页表,扫描每线程页表,并且通过用真实pte值替换全局页表中的前向指针,将每线程页表中的所有私有pte逐出到全局页表中。我们使用pte中的可自定义位之一来标记全局页表中的pte是前向指针还是真正的pte值。请注意,全局页表中的pte可能不会被任何cpu内核使用,但这不会影响正确性。稍后对于共享pte,操作系统会清除其cpu核心位图中的相应位,因为核心位图可以精确跟踪引用pte的所有核心。此时页表一致性恢复。然后,操作系统从线程驻留的核心刷新与取消调度的线程相关的所有tlb条目,并解锁全局页表。对于非mutator线程,它们在被调度时总是使用全局页表。同样,操作系统从线程所在的核心刷新所有tlb项,无需更改全局页表。107.在本公开的一个实施例中,步骤s104包括:108.基于在对所述转换查找缓冲区执行击落时出现转换查找缓冲区未命中的情况,利用在所述转换查找缓冲区中缓存所述页表项的cpu核心中的内存管理单元遍历遵照相同的页表结构的每线程页表;109.基于所述cpu核心中的内存管理单元的遍历结果,基于所述缺页处理所涉及的每线程页表和全局页表,对调度所述缺页处理所涉及的线程的cpu核心的转换查找缓冲区执行击落处理。110.在本公开的一个实施例中对转换查找缓冲区执行击落处(tlb击落)可以指的是击落tlb中的pte,也可以指的是刷新tlb。111.根据本公开实施例提供的技术方案,通过根据检测到的所述全局页表的页表项在所述全局页表中的共享状态,基于所述缺页处理所涉及的每线程页表和全局页表,对调度所述缺页处理所涉及的线程的cpu核心的转换查找缓冲区执行击落处理,包括:基于在对所述转换查找缓冲区执行击落时出现转换查找缓冲区未命中的情况,利用在所述转换查找缓冲区中缓存所述页表项的cpu核心中的内存管理单元遍历遵照相同的页表结构的每线程页表;基于所述cpu核心中的内存管理单元的遍历结果,基于所述缺页处理所涉及的每线程页表和全局页表,对调度所述缺页处理所涉及的线程的cpu核心的转换查找缓冲区执行击落处理,可以通过使用每线程页表来解决页换出操作中的tlb击落的可扩展性问题,并且可以降低页换出过程的计算开销。112.在本公开的一个实施例中,所述缺页处理包括以下处理至少之一:113.对于加载有每线程页表的cpu核心,在缺页错误为每线程页表中缺少对应的页表项的情况下,通过所述全局页表使得所述每线程页表获取所缺少的页表项;114.对于加载有每线程页表的cpu核心,在缺页错误为每线程页表和所述全局页表中缺少对应的页表项的情况下,通过操作系统内核获取有效页表项,将获取的页表项填充到所述每线程页表,利用指向所述每线程页表的所述页表项的特定前向指针标记所述全局页表中的页表项;115.对于加载有全局页表的cpu核心,在缺页错误为指向所述每线程页表的页表项的特定前向指针无效的情况下,通过操作系统内核将所述页表项的值复制到所述全局页表,在所述页表项的cpu核心位图将所述页表项标记为共享;116.对于加载有全局页表的cpu核心,在缺页错误为页表项不存在的情况下,通过操作系统内核获取有效页表项,将获取的页表项填充到所述每线程页表,利用指向所述每线程页表的所述页表项的特定前向指针标记所述全局页表中的页表项。117.根据本公开实施例提供的技术方案,通过所述缺页处理包括以下处理至少之一:对于加载有每线程页表的cpu核心,在缺页错误为每线程页表中缺少对应的页表项的情况下,通过所述全局页表使得所述每线程页表获取所缺少的页表项;对于加载有每线程页表的cpu核心,在缺页错误为每线程页表和所述全局页表中缺少对应的页表项的情况下,通过操作系统内核获取有效页表项,将获取的页表项填充到所述每线程页表,利用指向所述每线程页表的所述页表项的特定前向指针标记所述全局页表中的页表项;对于加载有全局页表的cpu核心,在缺页错误为指向所述每线程页表的页表项的特定前向指针无效的情况下,通过操作系统内核将所述页表项的值复制到所述全局页表,在所述页表项的cpu核心位图将所述页表项标记为共享;对于加载有全局页表的cpu核心,在缺页错误为页表项不存在的情况下,通过操作系统内核获取有效页表项,将获取的页表项填充到所述每线程页表,利用指向所述每线程页表的所述页表项的特定前向指针标记所述全局页表中的页表项,可以通过使用每线程页表来解决页换出操作中的tlb击落的可扩展性问题,并且可以降低页换出过程的计算开销。118.在本公开的一个实施例中,步骤s104包括:119.根据检测到的所述全局页表的页表项在所述全局页表中处于私有状态,调度所述缺页处理所涉及的线程的cpu核心将从自身的转换查找缓冲区中击落所述页表项并且跳过处理器间中断广播,或者120.根据检测到的所述全局页表的页表项在所述全局页表中处于共享状态,调度所述缺页处理所涉及的线程的cpu核心将仅向所述cpu核心位图中记录的cpu核心发送处理器间中断请求,并且调度所述缺页处理所涉及的线程的cpu核心和所述cpu核心位图中记录的cpu核心调度除第一类型线程以外的第二类型线程。121.在本公开的一个实施例中,第一类型线程可以指的是mutator线程,第二类型线程可以指的是mutator线程以外的线程,例如gc线程。122.根据本公开实施例提供的技术方案,通过所述根据检测到的所述全局页表的页表项在所述全局页表中的共享状态,基于所述缺页处理所涉及的每线程页表和全局页表,对调度所述缺页处理所涉及的线程的cpu核心的转换查找缓冲区执行击落处理,包括:根据检测到的所述全局页表的页表项在所述全局页表中处于私有状态,调度所述缺页处理所涉及的线程的cpu核心将从自身的转换查找缓冲区中击落所述页表项并且跳过处理器间中断广播,或者根据检测到的所述全局页表的页表项在所述全局页表中处于共享状态,调度所述缺页处理所涉及的线程的cpu核心将仅向所述cpu核心位图中记录的cpu核心发送处理器间中断请求,并且调度所述缺页处理所涉及的线程的cpu核心和所述cpu核心位图中记录的cpu核心调度除第一类型线程以外的第二类型线程,可以通过使用每线程页表来解决页换出操作中的tlb击落的可扩展性问题,并且可以降低页换出过程的计算开销。123.以下将参照图3描述页交换方法中将换出线程导出为特殊的goroutine的场景。124.图3示出根据本公开一实施方式的页交换方法中将换出线程导出为特殊的goroutine以由go运行时将其与用户goroutine一起调度的场景的示意图。125.在本公开的实施例中,以goroutine作为轻量级线程的示例对轻量级线程进行描述。126.以下参照图3描述将(内核空间的操作系统线程中的)换出线程导出为特殊的goroutine(图3所示的换出goroutinet0和t1)。如图3所示,由用户空间的go运行时将换出goroutine与用户goroutine一起调度。127.在图3所示的实施例中,利用操作系统内核和go运行时将换出(swap-out)线程作为goroutine导出,因此换出操作可以异步执行。将换出导出为goroutine可以使应用程序受益于三个方面。首先,异步换出可以在需求换入(demandswap-in)之前提前释放一些冷页面,从而缩短需求换入延迟,从而缩短整体延迟。其次,go运行时可以在用户goroutine无法充分利用cpu资源时调度换出goroutine,从而提高整体cpu利用率和性能。第三,将换出移出请求缺页错误处理的关键路径意味着go运行时可以将换出通信与用户计算重叠,从而进一步提高cpu利用率和nvm带宽利用率。128.例如,在内核级别,可以实现一个新的系统调用`user_swapout`来将换出线程导出到用户空间中的go运行时。`user_swapout`的逻辑与内核中当前的换出函数类似,但是主要有两点不同。首先,鉴于goroutine是协作调度的,需要在`user_swapout`中添加几个“安全点”,系统调用会在其中保存其状态并返回到用户级别。因此,go运行时可以安全地暂停换出goroutine并将cpu重新分配给其他goroutine。我们将页面换出分为五个步骤:(1)扫描内核活动/非活动列表,选择一批页面进行换出;(2)通过反向映射搜索引用这些受害者物理页面的pte;(3)分配交换项目并将交换项目插入交换缓存;(4)取消映射页面和击落tlb;(5)将页面内容写入nvm。可以在每一步的末尾插入一个安全点。129.为了在换出goroutine重新调度时正确恢复换出,需要在每个安全点保存goroutine状态信息,例如堆栈和其他辅助状态信息。由于换出是在内核级别执行的,因此无法将内核堆栈和数据存储在用户级别的go运行时中。相反,在启动go运行时时,在内核空间中分配一组内存区域来存储换出状态信息。换出goroutine可以从这组内存区域中分配一个区域并将其执行状态保存到其中(参见图3所示的状态阵列)。`user_swapout`系统调用在每个安全点向go运行时返回一个id,这是存储其状态的区域的索引。go运行时只为换出的goroutine记住这个id,并在下次重新调度换出goroutine时将该id传递回`user_swapout`系统调用。系统调用可以跟随id来检索先前的状态并恢复执行。130.在用户级别,可以修改go运行时以共同调度换出goroutines和用户goroutines。为了防止换出的goroutine消耗过多的cpu资源并饿死用户goroutine,与普通用户goroutine相比,可以为换出goroutine分配较低的优先级,并且仅在无法调度更多可用的用户goroutine时才调度它们。调度策略也是可定制的,用户可以调整策略或实现自己的策略以实现更高的吞吐量或更低的延迟。131.在本公开的一个实施例中,页交换方法还包括:132.利用操作系统内核和所述具有轻量级并发的编程语言的运行时将缺页处理中执行的换出线程导出为换出轻量级线程,以通过所述运行时将所述换出轻量级线程与所述运行时管理和调度的用户轻量级线程一起调度,使得所述换出轻量级线程被异步执行。133.根据本公开实施例提供的技术方案,通过利用操作系统内核和所述具有轻量级并发的编程语言的运行时将缺页处理中执行的换出线程导出为换出轻量级线程,以通过所述运行时将所述换出轻量级线程与所述运行时管理和调度的用户轻量级线程一起调度,使得所述换出轻量级线程被异步执行,可以将换出线程解耦为一些换出轻量级线程,并且与普通的用户轻量级线程共同调度,以异步执行换出操作,从而减少了具有轻量级并发的编程语言的换出开销。134.在本公开的一个实施例中,页交换方法还包括:135.为所述换出轻量级线程被执行的多个步骤插入安全点;136.在启动所述运行时时在操作系统内核中分配一组内存区域来存储换出状态信息;137.所述换出轻量级线程从该组内存区域中分配子内存区域并将所述换出轻量级线程的执行状态保存到所述子内存区域;138.通过应用程序内核在每个安全点向所述运行时返回作为所述子内存区域的索引的标识;139.通过所述运行时在重新调度所述换出轻量级线程时将所述标识传递回所述操作系统内核。140.根据本公开实施例提供的技术方案,通过为所述换出轻量级线程被执行的多个步骤插入安全点;在启动所述运行时时在操作系统内核中分配一组内存区域来存储换出状态信息;所述换出轻量级线程从该组内存区域中分配子内存区域并将所述换出轻量级线程的执行状态保存到所述子内存区域;通过应用程序内核在每个安全点向所述运行时返回作为所述子内存区域的索引的标识;通过所述运行时在重新调度所述换出轻量级线程时将所述标识传递回所述操作系统内核,可以将换出线程解耦为一些换出轻量级线程,并且与普通的用户轻量级线程共同调度,以异步执行换出操作,从而减少了具有轻量级并发的编程语言的换出开销。141.在本公开的一个实施例中,所述通过所述运行时将所述换出轻量级线程与所述运行时管理和调度的用户轻量级线程一起调度,包括:142.通过所述运行时为所述换出轻量级线程分配比所述用户轻量级线程更低的优先级。143.根据本公开实施例提供的技术方案,通过所述运行时将所述换出轻量级线程与所述运行时管理和调度的用户轻量级线程一起调度,包括:通过所述运行时为所述换出轻量级线程分配比所述用户轻量级线程更低的优先级,可以将换出线程解耦为一些换出轻量级线程,并且与普通的用户轻量级线程共同调度,以异步执行换出操作,从而减少了具有轻量级并发的编程语言的换出开销。144.在本公开的实施例中,每线程页表适合x86/x86-64架构,因为其tlb由硬件管理。本公开实施例针对以golang编写的应用程序,该应用程序运行在混合存储架构之上,其中nvm可以用作交换设备(swapdevice)。145.在本公开描述的页交换方法中,可以通过以下方式减少混合存储结构的换出开销:(1)使用每线程页表和tlb击落操作来跟踪页面映射缓存并减少tlb击落开销;(2)通过操作系统内核和具有垃圾收集和轻量级并发的编程语言运行时,将换出视为具有垃圾收集和轻量级并发的编程语言运行时调度的轻量级线程,以异步执行换出。146.以下参照图4描述根据本公开一实施方式的页交换装置。图4示出根据本公开一实施方式的页交换装置400的结构框图。如图4所示,页交换装置400包括每线程页表分配模块401、全局页表分配模块402、页表项检测模块403和转换查找缓冲区执行击落处理模块404。147.每线程页表分配模块401被配置为为第一类型线程分配每线程页表,以记录所述第一类型线程本地访问的页面的页面映射。148.全局页表分配模块402被配置为为所述第一类型线程所属的进程分配全局页表以记录所述进程中的线程访问的页面的页面映射。149.页表项检测模块403被配置为在进行页交换时执行缺页处理的情况下,检测所述全局页表的页表项在所述全局页表中的共享状态,其中,所述全局页表中的页表项附有cpu核心位图,以跟踪在转换查找缓冲区中缓存所述页表项的所有cpu核心,从而确定页表项的共享状态。150.转换查找缓冲区执行击落处理模块404被配置为根据检测到的所述全局页表的页表项在所述全局页表中的共享状态,基于所述缺页处理所涉及的每线程页表和全局页表,对调度所述缺页处理所涉及的线程的cpu核心的转换查找缓冲区执行击落处理。151.根据本公开实施例提供的技术方案,通过每线程页表分配模块,被配置为为第一类型线程分配每线程页表,以记录所述第一类型线程本地访问的页面的页面映射;全局页表分配模块,被配置为为所述第一类型线程所属的进程分配全局页表以记录所述进程中的线程访问的页面的页面映射;页表项检测模块,被配置为在进行页交换时执行缺页处理的情况下,检测所述全局页表的页表项在所述全局页表中的共享状态,其中,所述全局页表中的页表项附有cpu核心位图,以跟踪在转换查找缓冲区中缓存所述页表项的所有cpu核心,从而确定页表项的共享状态;转换查找缓冲区执行击落处理模块,被配置为根据检测到的所述全局页表的页表项在所述全局页表中的共享状态,基于所述缺页处理所涉及的每线程页表和全局页表,对调度所述缺页处理所涉及的线程的cpu核心的转换查找缓冲区执行击落处理,可以通过使用每线程页表来解决页换出操作中的tlb击落的可扩展性问题,并且可以降低页换出过程的计算开销。152.本领域技术人员可以理解,参照图4描述的技术方案的可以与参照图1至图3描述的实施例结合,从而具备参照图1至图3描述的实施例所实现的技术效果。具体内容可以参照以上根据图1至图3进行的描述,其具体内容在此不再赘述。153.图5示出根据本公开一实施方式的电子设备的结构框图。154.本公开实施方式还提供了一种电子设备,如图5所示,包括至少一个处理器501;以及与至少一个处理器501通信连接的存储器502;其中,存储器502存储有可被至少一个处理器501执行的指令,指令被至少一个处理器501执行以实现以下步骤:155.为第一类型线程分配每线程页表,以记录所述第一类型线程本地访问的页面的页面映射;156.为所述第一类型线程所属的进程分配全局页表以记录所述进程中的线程访问的页面的页面映射;157.在进行页交换时执行缺页处理的情况下,检测所述全局页表的页表项在所述全局页表中的共享状态,其中,所述全局页表中的页表项附有cpu核心位图,以跟踪在转换查找缓冲区中缓存所述页表项的所有cpu核心,从而确定页表项的共享状态;158.根据检测到的所述全局页表的页表项在所述全局页表中的共享状态,基于所述缺页处理所涉及的每线程页表和全局页表,对调度所述缺页处理所涉及的线程的cpu核心的转换查找缓冲区执行击落处理。159.在本公开的一个实施例中,所述根据检测到的所述全局页表的页表项在所述全局页表中的共享状态,基于所述缺页处理所涉及的每线程页表和全局页表,对调度所述缺页处理所涉及的线程的cpu核心的转换查找缓冲区执行击落处理,包括:160.基于在对所述转换查找缓冲区执行击落时出现转换查找缓冲区未命中的情况,利用在所述转换查找缓冲区中缓存所述页表项的cpu核心中的内存管理单元遍历遵照相同的页表结构的每线程页表;161.基于所述cpu核心中的内存管理单元的遍历结果,基于所述缺页处理所涉及的每线程页表和全局页表,对调度所述缺页处理所涉及的线程的cpu核心的转换查找缓冲区执行击落处理。162.在本公开的一个实施例中,所述缺页处理包括以下处理至少之一:163.对于加载有每线程页表的cpu核心,在缺页错误为每线程页表中缺少对应的页表项的情况下,通过所述全局页表使得所述每线程页表获取所缺少的页表项;164.对于加载有每线程页表的cpu核心,在缺页错误为每线程页表和所述全局页表中缺少对应的页表项的情况下,通过操作系统内核获取有效页表项,将获取的页表项填充到所述每线程页表,利用指向所述每线程页表的所述页表项的特定前向指针标记所述全局页表中的页表项;165.对于加载有全局页表的cpu核心,在缺页错误为指向所述每线程页表的页表项的特定前向指针无效的情况下,通过操作系统内核将所述页表项的值复制到所述全局页表,在所述页表项的cpu核心位图将所述页表项标记为共享;166.对于加载有全局页表的cpu核心,在缺页错误为页表项不存在的情况下,通过操作系统内核获取有效页表项,将获取的页表项填充到所述每线程页表,利用指向所述每线程页表的所述页表项的特定前向指针标记所述全局页表中的页表项。167.在本公开的一个实施例中,所述根据检测到的所述全局页表的页表项在所述全局页表中的共享状态,基于所述缺页处理所涉及的每线程页表和全局页表,对调度所述缺页处理所涉及的线程的cpu核心的转换查找缓冲区执行击落处理,包括:168.根据检测到的所述全局页表的页表项在所述全局页表中处于私有状态,调度所述缺页处理所涉及的线程的cpu核心将从自身的转换查找缓冲区中击落所述页表项并且跳过处理器间中断广播,或者169.根据检测到的所述全局页表的页表项在所述全局页表中处于共享状态,调度所述缺页处理所涉及的线程的cpu核心将仅向所述cpu核心位图中记录的cpu核心发送处理器间中断请求,并且调度所述缺页处理所涉及的线程的cpu核心和所述cpu核心位图中记录的cpu核心调度除第一类型线程以外的第二类型线程。170.在本公开的一个实施例中,存储器502还存储有可被至少一个处理器501执行的指令,指令被至少一个处理器501执行以实现以下步骤:171.利用操作系统内核和所述具有轻量级并发的编程语言的运行时将缺页处理中执行的换出线程导出为换出轻量级线程,以通过所述运行时将所述换出轻量级线程与所述运行时管理和调度的用户轻量级线程一起调度,使得所述换出轻量级线程被异步执行。172.在本公开的一个实施例中,存储器502还存储有可被至少一个处理器501执行的指令,指令被至少一个处理器501执行以实现以下步骤:173.为所述换出轻量级线程被执行的多个步骤插入安全点;174.在启动所述运行时时在操作系统内核中分配一组内存区域来存储换出状态信息;175.所述换出轻量级线程从该组内存区域中分配子内存区域并将所述换出轻量级线程的执行状态保存到所述子内存区域;176.通过应用程序内核在每个安全点向所述运行时返回作为所述子内存区域的索引的标识;177.通过所述运行时在重新调度所述换出轻量级线程时将所述标识传递回所述操作系统内核。178.在本公开的一个实施例中,所述通过所述运行时将所述换出轻量级线程与所述运行时管理和调度的用户轻量级线程一起调度,包括:179.通过所述运行时为所述换出轻量级线程分配比所述用户轻量级线程更低的优先级。180.在本公开的一个实施例中,在混合存储架构中执行页交换,所述混合存储架构为至少包括动态随机存取存储器dram和非易失性存储器nvm的混合存储架构。181.图6是适于用来实现根据本公开各实施方式的方法的计算机系统的结构示意图。如图6所示,计算机系统600包括处理单元601,其可以根据存储在只读存储器(rom)602中的程序或者从存储部分608加载到随机访问存储器(ram)603中的程序而执行上述附图所示的实施方式中的各种处理。在ram603中,还存储有系统600操作所需的各种程序和数据。处理单元601、rom602以及ram603通过总线604彼此相连。输入/输出(i/o)接口605也连接至总线604。182.以下部件连接至i/o接口605:包括键盘、鼠标等的输入部分606;包括诸如阴极射线管(crt)、液晶显示器(lcd)等以及扬声器等的输出部分607;包括硬盘等的存储部分608;以及包括诸如lan卡、调制解调器等的网络接口卡的通信部分609。通信部分609经由诸如因特网的网络执行通信处理。驱动器610也根据需要连接至i/o接口905。可拆卸介质611,诸如磁盘、光盘、磁光盘、半导体存储器等等,根据需要安装在驱动器610上,以便于从其上读出的计算机程序根据需要被安装入存储部分608。其中,所述处理单元601可实现为cpu、gpu、tpu、fpga、npu等处理单元。183.特别地,根据本公开的实施方式,上文参考附图描述的方法可以被实现为计算机软件程序。例如,本公开的实施方式包括一种计算机程序产品,其包括有形地包含在及其可读介质上的计算机程序,所述计算机程序包含用于执行附图中的方法的程序代码。在这样的实施方式中,该计算机程序可以通过通信部分609从网络上被下载和安装,和/或从可拆卸介质611被安装。例如,本公开的实施方式包括一种可读存储介质,其上存储有计算机指令,该计算机指令被处理器执行时实现用于执行附图中的方法的程序代码。184.附图中的流程图和框图,图示了按照本公开各种实施方式的系统、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,路程图或框图中的每个方框可以代表一个模块、程序段或代码的一部分,所述模块、程序段或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个接连地表示的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行规定的功能或操作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。185.描述于本公开实施方式中所涉及到的单元或模块可以通过软件的方式实现,也可以通过硬件的方式来实现。所描述的单元或模块也可以设置在处理器中,这些单元或模块的名称在某种情况下并不构成对该单元或模块本身的限定。186.作为另一方面,本公开还提供了一种计算机可读存储介质,该计算机可读存储介质可以是上述实施方式中所述节点中所包含的计算机可读存储介质;也可以是单独存在,未装配入设备中的计算机可读存储介质。计算机可读存储介质存储有一个或者一个以上程序,所述程序被一个或者一个以上的处理器用来执行描述于本公开的方法。187.以上描述仅为本公开的较佳实施例以及对所运用技术原理的说明。本领域技术人员应当理解,本公开中所涉及的发明范围,并不限于上述技术特征的特定组合而成的技术方案,同时也应涵盖在不脱离所述发明构思的情况下,由上述技术特征或其等同特征进行任意组合而形成的其它技术方案。例如上述特征与本公开中公开的(但不限于)具有类似功能的技术特征进行互相替换而形成的技术方案。当前第1页12当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1