一种CPU中缓存的用户态分配方法和系统
技术领域
本发明涉及计算机技术领域,特别是涉及一种中央处理器(Central ProcessingUnit,CPU)中缓存的用户态分配方法和系统。
背景技术
在计算机系统中,为了加快CPU对随机静态存储器(Static Random AccessMemory,SRAM)的访问速度,一般在CPU内部封装了多级高速缓存,根据内存数据访问的局部性原理,预先将内存中的数据存储到高速缓存中,同时优化高速缓存刷新算法,以提高高速缓存的命中率。
但是CPU内部的高速缓存对应用程序不可见,也就是应用程序不能直接访问缓存在CPU高速缓存中的数据。缓存在内存中的数据刷新及数据一致性管理,一般由高速缓存控制器实现,传统的高速缓存管理器无法避免内存的刷新,所以在内存中缓存的供应用程序访问的数据会频繁地被刷新,致使应用程序的运行效率低。
发明内容
本发明提供一种CPU中缓存的用户态分配方法和系统,以解决传统的高速缓存管理器无法避免内存的刷新,造成应用程序性能降低的问题。
为了解决上述问题,本发明公开了一种CPU中缓存的用户态分配方法,包括:
在引导参数中设定预留高速缓存的容量和起始地址;
按照所述预留高速缓存的容量和起始地址在CPU的缓存中创建所述预留高速缓存;
为用户态应用程序分配所述预留高速缓存。
优选地,所述按照所述预留高速缓存的容量和起始地址在CPU的缓存中创建所述预留高速缓存,包括:
根据所述预留高速缓存的容量和起始地址创建并初始化所述预留高速缓存的虚拟字符设备;
初始化所述虚拟字符设备的文件操作符集合,设置所述虚拟字符设备的文件操作符,并向操作系统注册设置的文件操作符;
根据所述引导参数中设定的预留高速缓存的容量和起始地址,在CPU的缓存中分配所述预留高速缓存,并确定所述预留高速缓存的物理地址;
调用所述文件操作符建立虚拟内存空间中的内存地址与所述预留高速缓存的物理页框号之间的映射关系。
优选地,所述根据所述预留高速缓存的容量和起始地址创建并初始化所述预留高速缓存的虚拟字符设备,包括:
通过所述引导参数向CPU内核传递所述虚拟字符设备的设备编号进行注册,若所述传递的设备编号被占用,则通过CPU内核为所述虚拟字符设备分配另一个设备编号;
向操作系统添加所述设备编号,令用户态应用程序获取所述虚拟字符设备的设备编号。
优选地,所述调用所述文件操作符建立虚拟内存空间中的内存地址与所述预留高速缓存的物理页框号之间的映射关系,包括:
当用户态应用程序的请求内存的容量小于或等于所述预留高速缓存的容量时,调用所述文件操作符获取所述请求内存的页内偏移地址;
将所述页内偏移地址和所述缓存空间的物理地址相加,得到供用户态应用程序使用的预留高速缓存的物理地址;
对所述供用户态应用程序使用的预留高速缓存的物理地址进行页框运算得到物理页框号;
建立虚拟内存空间中的内存地址与所述预留高速缓存的物理页框号之间的映射页表。
优选地,所述为用户态应用程序分配所述预留高速缓存,包括:
根据已建立的虚拟字符设备的节点获取文件描述符,其中,所述虚拟字符设备的节点用以在用户态应用程序打开所述虚拟字符设备的节点后,将对所述虚拟字符设备的操作与所述虚拟字符设备的驱动程序操作进行连接;
通过所述文件描述符和所述文件操作符获取空闲的预留高速缓存的容量;
若为用户态应用程序分配的预留高速缓存的容量小于等于所述空闲的预留高速缓存的容量,则通过所述文件描述符调用所述虚拟字符设备的驱动程序操作,得到为用户态应用程序分配的预留高速缓存的容量和起始地址。
相应地,本发明还公开了一种CPU中缓存的用户态分配系统,包括:
参数设定模块,用于在引导参数中设定预留高速缓存的容量和起始地址;
缓存创建模块,用于按照所述预留高速缓存的容量和起始地址在CPU的缓存中创建所述预留高速缓存;
缓存分配模块,用于为用户态应用程序分配所述预留高速缓存。
优选地,所述缓存创建模块,包括:
虚拟字符设备初始化模块,用于根据所述预留高速缓存的容量和起始地址创建并初始化所述预留高速缓存的虚拟字符设备;
文件操作符设置模块,用于初始化所述虚拟字符设备的文件操作符集合,设置所述虚拟字符设备的文件操作符,并向操作系统注册设置的文件操作符;
物理地址确定模块,用于根据所述引导参数中设定的预留高速缓存的容量和起始地址,在CPU的缓存中分配所述预留高速缓存,并确定所述预留高速缓存的物理地址;
映射模块,用于调用所述文件操作符建立虚拟内存空间中的内存地址与所述预留高速缓存的物理页框号之间的映射关系。
优选地,所述虚拟字符设备初始化模块,包括:
编号注册模块,用于通过所述引导参数向CPU内核传递所述虚拟字符设备的设备编号进行注册,若所述传递的设备编号被占用,则通过CPU内核为所述虚拟字符设备分配另一个设备编号;
编号添加模块,用于向操作系统添加所述设备编号,令用户态应用程序获取所述虚拟字符设备的设备编号。
优选地,所述映射模块,包括:
页内偏移地址获取模块,用于当用户态应用程序的请求内存的容量小于或等于所述预留高速缓存的容量时,调用所述文件操作符获取用户态应用程序的请求内存的页内偏移地址;
物理地址获取模块,用于将所述页内偏移地址和所述缓存空间的物理地址相加,得到供用户态应用程序使用的预留高速缓存的物理地址;
物理页框号获取模块,用于对所述供用户态应用程序使用的预留高速缓存的物理地址进行页框运算得到物理页框号;
映射页表建立模块,用于建立虚拟内存空间中的内存地址与所述预留高速缓存的物理页框号之间的映射页表。
优选地,所述缓存分配模块,包括:
文件描述符获取模块,用于根据已建立的虚拟字符设备的节点获取文件描述符,其中,所述虚拟字符设备的节点用以在用户态应用程序打开所述虚拟字符设备的节点后,将对所述虚拟字符设备的操作与所述虚拟字符设备的驱动程序操作进行连接;
空闲容量获取模块,用于通过所述文件描述符和所述文件操作符获取空闲的预留高速缓存的容量;
容量和起始地址获取模块,用于若为用户态应用程序分配的预留高速缓存的容量小于等于所述空闲的预留高速缓存的容量,则通过所述文件描述符调用所述虚拟字符设备的驱动程序操作,得到为用户态应用程序分配的预留高速缓存的容量和起始地址。
与背景技术相比,本发明包括以下优点:
为了提高应用程序的性能,本发明通过新建的页表将导出到内核(Kernel)态的CPU中的高速缓存输出到用户态,供应用程序使用。具体可以在引导参数中设定预留高速缓存的容量和起始地址,按照预留高速缓存的容量和起始地址在CPU的高速缓存中创建预留高速缓存,然后为用户态应用程序分配预留高速缓存,供用户态应用程序使用。
关于CPU访问内存的几个原则为:若CPU的高速缓存中缓存有与内存对应的数据,则直接从高速缓存中读取,否则,从内存中读取;高速缓存管理器一般根据最久未使用原则(Least Recently Used,LRU),将一部分高速缓存中的数据刷新到内存中,使得一部分高速缓存空闲可用;从内存中读取数据到空闲可用的高速缓存中,再从高速缓存中读取数据。
由于CPU中的高速缓存的访问速率远远高于普通内存,并且,预留高速缓存供用户态应用程序使用后,高速缓存管理器不再自动刷新预留高速缓存。所以,本发明在CPU的高速缓存中创建一部分预留高速缓存供用户态应用程序使用,提高了应用程序的性能。
附图说明
图1是本发明技术方案实现的第一阶段流程图;
图2是本发明中虚拟字符设备的初始化流程图;
图3是本发明中虚拟字符设备的文件操作符的实现流程图;
图4是本发明中用户态应用程序获取可用的高速缓存大小的流程图;
图5是本发明中建立虚拟字符设备节点的流程图;
图6是本发明中高速缓存的分配与使用的流程图;
图7是本发明实施例一中的一种CPU中缓存的用户态分配方法的步骤流程图;
图8是本发明实施例二中的一种CPU中缓存的用户态分配方法的步骤流程图;
图9是本发明实施例三中的一种CPU中缓存的用户态分配系统的结构示意图;
图10是是本发明实施例四中的一种CPU中缓存的用户态分配系统的结构示意图。
具体实施方式
为使本发明的上述目的、特征和优点能够更加明显易懂,下面结合附图和具体实施方式对本发明作进一步详细的说明。
本发明技术方案中的高速缓存可以为CPU中的二级高速缓存,本发明可以分为以下三个阶段:
一、设定想要保留的高速缓存的大小及起始地址,并在CPU的高速缓存中创建保留的高速缓存。所述第一阶段的流程图如图1所示。
1、通过uboot参数传递需要保留的高速缓存的大小及地址。
在uboot启动阶段,通过uboot参数设置需要保留的高速缓存的大小及地址。uboot参数指需要在Kernel启动前传递给Kernel的参数,以便Kernel启动过程中或者启动后可以使用此部分参数。
2、Kernel获取到保留的高速缓存的大小及地址后,暂存入Kernel变量中。
在Kernel启动阶段,Kernel获取uboot参数传递给Kernel变量中备用。
Kernel变量一般可以由Kernel开发者指定,若某一个Kernel变量在uboot参数中没有指定,或者在Kernel启动前没有传递给Kernel,则Kernel开发者一般会设定此变量的默认值或者报错。常用的Kernel变量包括物理内存大小、启动的超级用户文件系统(RootFile System,RootFS)、IP地址等。
二、建立保留的高速缓存与用户态应用程序的通信通道。
1、虚拟字符设备的初始化过程。
字符设备驱动提供真实字符设备的驱动,如键盘驱动等。虚拟字符设备指的是,此设备的驱动程序采用字符设备的驱动框架,但是并没有真实的物理字符设备与此对应。在本发明技术方案中,虚拟字符设备的主要作用是在用户态建立一个虚拟字符设备,这样当用户态应用程序打开此虚拟字符设备后,Kernel可以将后续对此虚拟字符设备的所有操作与新添加的虚拟字符设备的驱动程序操作相连接。如用户态应用程序使用open函数打开此虚拟字符设备后,获取数据库系统函数依赖(functional dependency,fd),后续将此fd作为mmap函数的一个参数,Kernel即通过此fd知晓需要调用此虚拟字符设备的mmap实现。
虚拟字符设备的初始化过程如图2所示,在用户态应用程序触发设备模块加载时会触发虚拟字符设备的初始化过程。首先向Kernel注册虚拟字符设备的设备编号,设备编号可以通过uboot参数传递或者在向Kernel注册虚拟字符设备时由Kernel分配。本发明采用的方案为首先使用uboot参数传递虚拟字符设备的设备编号,若此设备编号已经被Kernel使用,则由Kernel分配新的虚拟字符设备的设备编号。
初始化虚拟字符设备的文件操作符集合,主要定义其mmap操作、open操作、release操作及ioctl操作。对某一个操作的定义,即通过编写对应的函数实现,并通过对应的fops将此函数实现向操作系统注册。如果此文件操作符集合中的操作不需要,则不必实现。Kernel会使用默认的实现的处理。
向操作系统添加此虚拟字符设备,完成此操作后,应用程序可以通过虚拟文件系统获取此虚拟字符设备的设备编号及名字。
获取uboot中传递的高速缓存的大小及起始地址,通过高速缓存分配方法从高速缓存中分配缓存空间,保存返回的虚拟地址及物理地址。
上述虚拟地址、物理地址都是通过“二级高速缓存分配方法”返回的,“二级高速缓存分配方法”一般是硬件厂商在Kernel中提供的,用于从二级高速缓存中保留一部分高速缓存,高速缓存管理器不再自动管理此部分高速缓存。高速缓存管理器将此部分不再管理的高速缓存的物理地址及虚拟地址通过“二级高速缓存分配方法”返回给调用者。
其中,物理地址即为此部分将要提供给用户态应用程序使用的高速缓存的物理地址。CPU通过物理地址访问高速缓存。
虚拟地址即为Kernel中代码看到的高速缓存的地址,是逻辑地址。CPU硬件通过页表的寻址,将虚拟地址转换为物理地址后再访问。
至此,虚拟字符设备的初始化完成。
2、虚拟字符设备的文件操作符的实现。
虚拟字符设备的文件操作符的实现如图3所示,在用户态应用程序请求高速缓存时,会调用虚拟字符设备的mmap操作,Kernel中的处理过程为:
首先判断用户态应用程序请求的内存大小是否大于可供用户态应用程序使用的高速缓存大小,如果大于,则返回出错,否则,执行下一步操作。
获取用户态应用程序请求的内存的页内偏移地址,同时将页内偏移地址与虚拟字符设备初始化时获取的高速缓存地址相加,获取需要映射到用户态应用程序使用的高速缓存的物理地址。
通过页框运算得到需要映射到用户态应用程序使用的高速缓存的物理地址的物理页框号。
使用用户态应用程序的虚拟内存空间(Virtual Memory Area,VMA)及刚刚获取到物理页框号建立内存地址空间及物理地址映射的内存映射页表。
至此,包含在VMA中的内存地址已经与高速缓存的物理页框建立了一一映射关系。
三、用户态应用程序从保留的高速缓存中分配地址并使用。
用户态应用程序可以通过ioctl操作获取可用的高速缓存大小,处理过程如图4所示,Kernel的ioctl操作获取到用户态应用程序的高速缓存请求后,若请求的内容为可用的高速缓存大小,则返回Kernel中存储的用户态应用程序可用的高速缓存大小值;若为其他请求,则返回出错。
用户态应用程序使用高速缓存的方法需要执行两个步骤的操作:
1、建立虚拟字符设备节点。
建立虚拟字符设备节点的过程如图5所示,加载虚拟字符设备驱动模块。虚拟字符设备驱动模块加载时,会执行对应的内核中的虚拟字符设备驱动程序的初始化过程,根据前述,初始化完成后会生成对应的虚拟字符设备的设备编号,并通过虚拟文件系统反馈给用户态应用程序。
读取/proc/devices文件,找到对应的虚拟字符设备的名字,获取其设备编号。
判断虚拟字符设备节点是否已经被创建,若是,返回已创建。
若虚拟字符设备节点不存在,则根据虚拟字符设备的编号,使用mknod命令建立对应的虚拟字符设备节点。
虚拟字符设备节点就是系统下的一个设备文件。设备文件的作用是应用程序open此文件后可以与Kernel中的驱动建立联系。
待虚拟字符设备节点建立完成后,用户态应用程序就可以开始执行高速缓存的分配与使用了。
2、高速缓存的分配与使用。
高速缓存的分配与使用的过程如图6所示,首先打开虚拟字符设备节点,将得到的文件描述符保存,此文件描述符为后续操作的入口。文件描述符即一个整型的数字,Kernel通过文件描述符来标志对应的设备。如文件描述符为0,代表标准输出设备,文件描述符为1,代表标准输入设备,文件描述符为2,代表标志错误输出设备等。
通过文件描述符及其ioctl操作,获取可用的高速缓存大小。
当分配高速缓存时,检测是否大于可用的高速缓存;若大于,则返回出错,否则,执行下一步。
通过文件描述符,调用对应的mmap操作,内核将执行虚拟字符设备驱动程序的mmap操作,建立页表映射。
mmap操作返回的地址空间即为用户态应用程序可用的高速缓存地址。
用户态应用程序可以将热点数据存储到高速缓存中,以提高系统性能。
通过测试结果得知,采用本发明技术方案,从CPU高速缓存中分配一部分高速缓存供用户态应用程序连续访问,与应用程序连续访问主存的速度提升约30%。而且,此测试结果为内存数据局部性非常好的情况下,即连续的主存访问效率已经最优化的情况,因此,在实际的生产环境中,速率提升会远优于30%。
下面通过列举几个具体的实施例详细介绍本发明提供的一种CPU中缓存的用户态分配方法和系统。
实施例一
详细介绍本发明实施例提供的一种CPU中缓存的用户态分配方法。
参照图7,示出了本发明实施例中一种CPU中缓存的用户态分配方法的步骤流程图。
步骤100,在引导参数中设定预留高速缓存的容量和起始地址。
上述引导参数可以为uboot参数,上述预留高速缓存可以设置于CPU的二级高速缓存当中,即在CPU的二级高速缓存当中预留出一部分高速缓存作为上述预留高速缓存。
步骤102,按照预留高速缓存的容量和起始地址在CPU的缓存中创建预留高速缓存。
根据预留高速缓存的容量和起始地址就可以确定预留高速缓存在CPU的二级高速缓存中的起始地址和终止地址,起始地址和终止地址之间的二级高速缓存就是预留高速缓存。
步骤104,为用户态应用程序分配预留高速缓存。
用户态在计算机结构中指两项类似的概念。在CPU的设计中,用户态指非特权状态。在此状态下,执行的代码被硬件限定,不能进行某些操作,比如写入其他进程的存储空间,以防止给操作系统带来安全隐患。在操作系统的设计中,用户态也类似,指非特权的执行状态。内核禁止此状态下的代码进行潜在危险的操作,比如写入系统配置文件、杀掉其他用户的进程、重启系统等。在Linux中,当进程在执行用户自己的代码时,则称其处于用户运行态(用户态)。当正在执行用户程序而突然被中断程序中断时,此时用户程序也可以象征性地称为处于进程的内核态。因为中断处理程序将使用当前进程的内核栈。这与处于内核态的进程的状态有些类似。
当用户态应用程序向预留高速缓存申请缓存时,为用户态应用程序分配其申请的预留高速缓存。其中,用户态应用程序申请的缓存空间应小于等于当前预留高速缓存中空闲的预留高速缓存。
综上所述,为了提高应用程序的性能,本发明通过新建的页表将导出到Kernel态的CPU中的高速缓存输出到用户态,供应用程序使用。当一个任务(进程)执行系统调用而陷入内核代码中执行时,就称进程处于内核运行态(或简称为内核态)。此时处理器处于特权级最高的(0级)内核代码中执行。当进程处于内核态时,执行的内核代码会使用当前进程的内核栈。每个进程都有自己的内核栈。具体可以在引导参数中设定预留高速缓存的容量和起始地址,按照预留高速缓存的容量和起始地址在CPU的高速缓存中创建预留高速缓存,然后为用户态应用程序分配预留高速缓存,供用户态应用程序使用。
关于CPU访问内存的几个原则为:若CPU的高速缓存中缓存有与内存对应的数据,则直接从高速缓存中读取,否则,从内存中读取;高速缓存管理器一般根据最久未使用原则,将一部分高速缓存中的数据刷新到内存中,使得一部分高速缓存空闲可用;从内存中读取数据到空闲可用的高速缓存中,再从高速缓存中读取数据。
由于CPU中的高速缓存的访问速率远远高于普通内存,并且,预留高速缓存供用户态应用程序使用后,高速缓存管理器不再自动刷新预留高速缓存。所以,本发明在CPU的高速缓存中创建一部分预留高速缓存供用户态应用程序使用,提高了应用程序的性能。
实施例二
详细介绍本发明实施例提供的一种CPU中缓存的用户态分配方法。
参照图8,示出了本发明实施例中一种CPU中缓存的用户态分配方法的步骤流程图。
步骤200,在引导参数中设定预留高速缓存的容量和起始地址。
上述引导参数可以为uboot参数,上述预留高速缓存可以设置于CPU的二级高速缓存当中,即在CPU的二级高速缓存当中预留出一部分高速缓存作为上述预留高速缓存。
步骤202,按照预留高速缓存的容量和起始地址在CPU的缓存中创建预留高速缓存。
根据预留高速缓存的容量和起始地址就可以确定预留高速缓存在CPU的二级高速缓存中的起始地址和终止地址,起始地址和终止地址之间的二级高速缓存就是预留高速缓存。
优选地,上述步骤202可以包括:
步骤2021,根据预留高速缓存的容量和起始地址创建并初始化预留高速缓存的虚拟字符设备。
优选地,上述步骤2021可以包括:
步骤20211,向CPU内核注册虚拟字符设备的设备编号。
优选地,上述步骤20211可以为:
通过引导参数向CPU内核传递虚拟字符设备的设备编号进行注册;若传递的设备编号被占用,则通过CPU内核为虚拟字符设备分配另一个设备编号。
步骤20212,向操作系统添加设备编号,令用户态应用程序获取虚拟字符设备的设备编号。
步骤2022,初始化虚拟字符设备的文件操作符集合,设置虚拟字符设备的文件操作符,并向操作系统注册设置的文件操作符。
初始化虚拟字符设备的文件操作符集合,主要定义其mmap操作、open操作、release操作及ioctl操作。
步骤2023,根据引导参数中设定的预留高速缓存的容量和起始地址,在CPU的缓存中分配预留高速缓存,并确定预留高速缓存的物理地址。
优选地,上述步骤2023中,可以在CPU的二级缓存中分配预留高速缓存,也可以在CPU的其他缓存中分配预留高速缓存,如一级缓存、三级缓存等等,本发明实施例对CPU中分配的预留高速缓存所在的缓存位置不做限制。
步骤2024,调用文件操作符建立虚拟内存空间中的内存地址与预留高速缓存的物理页框号之间的映射关系。
优选地,上述步骤2024可以包括:
步骤20241,判断用户态应用程序的请求内存的容量是否大于预留高速缓存的容量;若否,则执行步骤20242;若是,则生成并显示错误提示信息。
步骤20242,当用户态应用程序的请求内存的容量小于或等于所述预留高速缓存的容量时,调用文件操作符获取用户态应用程序的请求内存的页内偏移地址。
偏移地址就是计算机里的内存分段后,在段内某一地址相对于段首地址(段地址)的偏移量。
步骤20243,根据页内偏移地址和缓存空间的物理地址得到供用户态应用程序使用的预留高速缓存的物理地址。
优选地,上述步骤20243可以为:
将页内偏移地址和缓存空间的物理地址相加,得到供用户态应用程序使用的预留高速缓存的物理地址。
步骤20244,获取供用户态应用程序使用的预留高速缓存的物理地址的物理页框号。
页框是内存管理的概念,CPU中添加了能自动把虚拟内存(即逻辑地址)地址转化为物理内存地址的电路,为了简化这种电路,就把随机存储器划分为长度为4KB或8KB的块,这种块就叫页框。
优选地,上述步骤20244可以为:
对供用户态应用程序使用的预留高速缓存的物理地址进行页框运算得到物理页框号。
步骤20245,建立虚拟内存空间中的内存地址与预留高速缓存的物理页框号之间的映射页表。
步骤204,为用户态应用程序分配预留高速缓存。
用户态在计算机结构中指两项类似的概念。在CPU的设计中,用户态指非特权状态。在此状态下,执行的代码被硬件限定,不能进行某些操作,比如写入其他进程的存储空间,以防止给操作系统带来安全隐患。在操作系统的设计中,用户态也类似,指非特权的执行状态。内核禁止此状态下的代码进行潜在危险的操作,比如写入系统配置文件、杀掉其他用户的进程、重启系统等。在Linux中,当进程在执行用户自己的代码时,则称其处于用户运行态(用户态)。当正在执行用户程序而突然被中断程序中断时,此时用户程序也可以象征性地称为处于进程的内核态。因为中断处理程序将使用当前进程的内核栈。这与处于内核态的进程的状态有些类似。
当用户态应用程序向预留高速缓存申请缓存时,为用户态应用程序分配其申请的预留高速缓存。其中,用户态应用程序申请的缓存空间应小于等于当前预留高速缓存中空闲的预留高速缓存。
优选地,上述步骤204可以包括:
步骤2041,根据已建立虚拟字符设备的节点获取文件描述符。
其中,虚拟字符设备的节点用以在用户态应用程序打开虚拟字符设备的节点后,将对虚拟字符设备的操作与虚拟字符设备的驱动程序操作进行连接。
步骤2042,通过文件描述符和文件操作符获取空闲的预留高速缓存的容量。
步骤2043,若为用户态应用程序分配的预留高速缓存的容量小于等于空闲的预留高速缓存的容量,则通过文件描述符调用虚拟字符设备的驱动程序操作,得到为用户态应用程序分配的预留高速缓存的容量和起始地址。
综上所述,为了提高应用程序的性能,本发明通过新建的页表将导出到Kernel态的CPU中的高速缓存输出到用户态,供应用程序使用。当一个任务(进程)执行系统调用而陷入内核代码中执行时,就称进程处于内核运行态(或简称为内核态)。此时处理器处于特权级最高的(0级)内核代码中执行。当进程处于内核态时,执行的内核代码会使用当前进程的内核栈。每个进程都有自己的内核栈。具体可以在引导参数中设定预留高速缓存的容量和起始地址,按照预留高速缓存的容量和起始地址在CPU的高速缓存中创建预留高速缓存,然后为用户态应用程序分配预留高速缓存,供用户态应用程序使用。
关于CPU访问内存的几个原则为:若CPU的高速缓存中缓存有与内存对应的数据,则直接从高速缓存中读取,否则,从内存中读取;高速缓存管理器一般根据最久未使用原则,将一部分高速缓存中的数据刷新到内存中,使得一部分高速缓存空闲可用;从内存中读取数据到空闲可用的高速缓存中,再从高速缓存中读取数据。
由于CPU中的高速缓存的访问速率远远高于普通内存,并且,预留高速缓存供用户态应用程序使用后,高速缓存管理器不再自动刷新预留高速缓存。所以,本发明在CPU的高速缓存中创建一部分预留高速缓存供用户态应用程序使用,提高了应用程序的性能。
实施例三
详细介绍本发明实施例提供的一种CPU中缓存的用户态分配系统。
参照图9,示出了本发明实施例中一种CPU中缓存的用户态分配系统的结构示意图。
上述系统可以包括:参数设定模块300,缓存创建模块302,缓存分配模块304。
下面分别详细介绍各模块的功能以及各模块之间的关系。
参数设定模块300用于在引导参数中设定预留高速缓存的容量和起始地址。缓存创建模块302可以与参数设定模块300相连,用于按照预留高速缓存的容量和起始地址在CPU的缓存中创建预留高速缓存。缓存分配模块304可以与缓存创建模块302相连,用于为用户态应用程序分配预留高速缓存。
综上所述,为了提高应用程序的性能,本发明通过新建的页表将导出到Kernel态的CPU中的高速缓存输出到用户态,供应用程序使用。当一个任务(进程)执行系统调用而陷入内核代码中执行时,就称进程处于内核运行态(或简称为内核态)。此时处理器处于特权级最高的(0级)内核代码中执行。当进程处于内核态时,执行的内核代码会使用当前进程的内核栈。每个进程都有自己的内核栈。具体可以在引导参数中设定预留高速缓存的容量和起始地址,按照预留高速缓存的容量和起始地址在CPU的高速缓存中创建预留高速缓存,然后为用户态应用程序分配预留高速缓存,供用户态应用程序使用。
关于CPU访问内存的几个原则为:若CPU的高速缓存中缓存有与内存对应的数据,则直接从高速缓存中读取,否则,从内存中读取;高速缓存管理器一般根据最久未使用原则,将一部分高速缓存中的数据刷新到内存中,使得一部分高速缓存空闲可用;从内存中读取数据到空闲可用的高速缓存中,再从高速缓存中读取数据。
由于CPU中的高速缓存的访问速率远远高于普通内存,并且,预留高速缓存供用户态应用程序使用后,高速缓存管理器不再自动刷新预留高速缓存。所以,本发明在CPU的高速缓存中创建一部分预留高速缓存供用户态应用程序使用,提高了应用程序的性能。
实施例四
详细介绍本发明实施例提供的一种CPU中缓存的用户态分配系统。
参照图10,示出了本发明实施例中一种CPU中缓存的用户态分配系统的结构示意图。
上述系统可以包括:参数设定模块400,缓存创建模块402,节点建立模块404,缓存分配模块406。其中,缓存创建模块402可以包括:虚拟字符设备初始化模块4021,文件操作符集合初始化模块4022,文件操作符设置模块4023,物理地址确定模块4024,映射模块4025。虚拟字符设备初始化模块4021可以包括:编号注册模块40211,编号添加模块40212。编号注册模块40211可以包括:编号传递模块402111,编号分配模块402112。映射模块4025可以包括:判断模块40251,页内偏移地址获取模块40252,物理地址获取模块40253,物理页框号获取模块40254,映射页表建立模块40255。缓存分配模块406可以包括:文件描述符获取模块4061,空闲容量获取模块4062,容量和起始地址获取模块4063。
下面分别详细介绍各模块的功能以及各模块之间的关系。
参数设定模块400用于在引导参数中设定预留高速缓存的容量和起始地址。
缓存创建模块402可以与参数设定模块400相连,用于按照预留高速缓存的容量和起始地址在CPU的缓存中创建预留高速缓存。
优选地,缓存创建模块402可以包括:
虚拟字符设备初始化模块4021用于根据预留高速缓存的容量和起始地址创建并初始化预留高速缓存的虚拟字符设备。
优选地,虚拟字符设备初始化模块4021可以包括:
编号注册模块40211用于通过所述引导参数向CPU内核传递所述虚拟字符设备的设备编号进行注册,若所述传递的设备编号被占用,则通过CPU内核为所述虚拟字符设备分配另一个设备编号。
编号添加模块40212用于向操作系统添加设备编号,令用户态应用程序获取虚拟字符设备的设备编号。
文件操作符设置模块4023用于初始化所述虚拟字符设备的文件操作符集合,设置虚拟字符设备的文件操作符,并向操作系统注册设置的文件操作符。
物理地址确定模块4024用于根据引导参数中设定的预留高速缓存的容量和起始地址,在CPU的缓存中分配预留高速缓存,并确定预留高速缓存的物理地址。
映射模块4025用于调用文件操作符建立虚拟内存空间中的内存地址与预留高速缓存的物理页框号之间的映射关系。
优选地,映射模块4025可以包括:
页内偏移地址获取模块40252用于当用户态应用程序的请求内存的容量小于或等于预留高速缓存的容量时,调用文件操作符获取用户态应用程序的请求内存的页内偏移地址。
物理地址获取模块40253用于根据页内偏移地址和缓存空间的物理地址得到供用户态应用程序使用的预留高速缓存的物理地址。
优选地,物理地址获取模块40253将页内偏移地址和缓存空间的物理地址相加,得到供用户态应用程序使用的预留高速缓存的物理地址。
物理页框号获取模块40254用于获取供用户态应用程序使用的预留高速缓存的物理地址的物理页框号。
优选地,物理页框号获取模块40254对供用户态应用程序使用的预留高速缓存的物理地址进行页框运算得到物理页框号。
映射页表建立模块40255用于建立虚拟内存空间中的内存地址与预留高速缓存的物理页框号之间的映射页表。
判断模块40251用于在页内偏移地址获取模块40252调用文件操作符获取用户态应用程序的请求内存的页内偏移地址之前,判断请求内存的容量是否大于预留高速缓存的容量。
若请求内存的容量不大于预留高速缓存的容量,则页内偏移地址获取模块40252调用文件操作符获取用户态应用程序的请求内存的页内偏移地址。
错误提示模块用于若请求内存的容量大于预留高速缓存的容量,则生成并显示错误提示信息。
物理地址确定模块4024用于在映射模块4025调用文件操作符建立虚拟内存空间中的内存地址与预留高速缓存的物理页框号之间的映射关系之前,获取引导参数中设定的预留高速缓存的容量和起始地址,在CPU的二级缓存中分配预留高速缓存,并确定预留高速缓存的物理地址。
缓存分配模块406与缓存创建模块402相连,用于为用户态应用程序分配预留高速缓存。
优选地,缓存分配模块406可以包括:
文件描述符获取模块4061用于根据已建立的虚拟字符设备的节点获取文件描述符。
其中,虚拟字符设备的节点用以在用户态应用程序打开虚拟字符设备的节点后,将对虚拟字符设备的操作与虚拟字符设备的驱动程序操作进行连接。
空闲容量获取模块4062用于通过文件描述符和文件操作符获取空闲的预留高速缓存的容量。
容量和起始地址获取模块4063用于若为用户态应用程序分配的预留高速缓存的容量小于等于空闲的预留高速缓存的容量,则通过文件描述符调用虚拟字符设备的驱动程序操作,得到为用户态应用程序分配的预留高速缓存的容量和起始地址。
节点建立模块404用于在缓存分配模块406为用户态应用程序分配预留高速缓存之前,建立虚拟字符设备的节点,以在用户态应用程序打开虚拟字符设备的节点后,将对虚拟字符设备的操作与虚拟字符设备的驱动程序操作进行连接。
综上所述,为了提高应用程序的性能,本发明通过新建的页表将导出到Kernel态的CPU中的高速缓存输出到用户态,供应用程序使用。当一个任务(进程)执行系统调用而陷入内核代码中执行时,就称进程处于内核运行态(或简称为内核态)。此时处理器处于特权级最高的(0级)内核代码中执行。当进程处于内核态时,执行的内核代码会使用当前进程的内核栈。每个进程都有自己的内核栈。具体可以在引导参数中设定预留高速缓存的容量和起始地址,按照预留高速缓存的容量和起始地址在CPU的高速缓存中创建预留高速缓存,然后为用户态应用程序分配预留高速缓存,供用户态应用程序使用。
关于CPU访问内存的几个原则为:若CPU的高速缓存中缓存有与内存对应的数据,则直接从高速缓存中读取,否则,从内存中读取;高速缓存管理器一般根据最久未使用原则,将一部分高速缓存中的数据刷新到内存中,使得一部分高速缓存空闲可用;从内存中读取数据到空闲可用的高速缓存中,再从高速缓存中读取数据。
由于CPU中的高速缓存的访问速率远远高于普通内存,并且,预留高速缓存供用户态应用程序使用后,高速缓存管理器不再自动刷新预留高速缓存。所以,本发明在CPU的高速缓存中创建一部分预留高速缓存供用户态应用程序使用,提高了应用程序的性能。
对于系统实施例而言,由于其与方法实施例基本相似,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
本说明书中的各个实施例均采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似的部分互相参见即可。
以上对本发明实施例所提供的一种CPU中缓存的用户态分配方法和系统,进行了详细介绍,本文中应用了具体个例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想;同时,对于本领域的一般技术人员,依据本发明的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本发明的限制。