CN118069373A - 电子组件、电子设备及内存管理方法 - Google Patents
电子组件、电子设备及内存管理方法 Download PDFInfo
- Publication number
- CN118069373A CN118069373A CN202410446200.3A CN202410446200A CN118069373A CN 118069373 A CN118069373 A CN 118069373A CN 202410446200 A CN202410446200 A CN 202410446200A CN 118069373 A CN118069373 A CN 118069373A
- Authority
- CN
- China
- Prior art keywords
- data
- memory block
- block group
- upstream device
- currently
- 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.)
- Pending
Links
- 238000007726 management method Methods 0.000 title claims abstract description 22
- 238000011144 upstream manufacturing Methods 0.000 claims abstract description 437
- 238000000034 method Methods 0.000 claims description 25
- 238000010586 diagram Methods 0.000 description 12
- 230000008569 process Effects 0.000 description 10
- 102100035964 Gastrokine-2 Human genes 0.000 description 9
- 101001075215 Homo sapiens Gastrokine-2 Proteins 0.000 description 9
- 238000004891 communication Methods 0.000 description 4
- 238000012986 modification Methods 0.000 description 4
- 230000004048 modification Effects 0.000 description 4
- 230000004075 alteration Effects 0.000 description 2
- 230000002159 abnormal effect Effects 0.000 description 1
- 238000013459 approach Methods 0.000 description 1
- 230000003993 interaction Effects 0.000 description 1
- 238000013507 mapping Methods 0.000 description 1
- 238000012545 processing Methods 0.000 description 1
- 230000003068 static effect Effects 0.000 description 1
Landscapes
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本公开提供一种电子组件、电子设备及内存管理方法。该电子组件包括内存、信息缓存单元和至少一个上游设备;所述内存包括第一预设数量个内存块,所述第一预设数量个内存块被划分为第二预设数量个内存块组;所述信息缓存单元,被配置为缓存每个内存块组对应的第一数据结构,所述第一数据结构用于记录对应的所述内存块组内的各个内存块的占用状态;所述占用状态包括空闲状态和非空闲状态;所述上游设备,被配置为在需要占用内存块时,从该上游设备对应的内存块组开始询问,根据当前询问的内存块组对应的所述第一数据结构,查找空闲状态的内存块进行占用。可以实现内存的充分利用。
Description
技术领域
本公开涉及内存管理技术领域,尤其涉及一种电子组件、电子设备及内存管理方法。
背景技术
传统方法上为了解决虚拟图形处理器(Virtual Graphics Processing Unit,vGPU)间内存资源冲突问题,在以下两种场景下有两种不同的解决方法。
1)在有二级***内存管理单元(System Memory Management Unit,SMMU)情况下,由hyper层通过SMMU统一动态映射分配GDDR内存给各个虚拟机(Virtual Machine,VM)使用,内存可以被充分利用。
2)在没有二级SMMU的情况下,内存资源完全静态分配使用,譬如所有VM均分内存,或者有差异的静态分配,如共4GB内存,VM1分配2G,VM2分配1G,VM3分配512M,静态分配情况下,内存不能被充分利用。
发明内容
本公开的目的是提供一种电子组件、电子设备及内存管理方法,解决了现有技术中在没有二级SMMU的情况下内存不能被充分利用的技术问题。
根据本公开的一个方面,提供一种电子组件,包括内存、信息缓存单元和至少一个上游设备;内存包括第一预设数量个内存块,第一预设数量个内存块被划分为第二预设数量个内存块组,第二预设数量大于等于至少一个上游设备的总数量,每个上游设备分别对应一个内存块组,至少一个上游设备包括虚拟机和/或主机;
信息缓存单元,被配置为缓存每个内存块组对应的第一数据结构,第一数据结构用于记录对应的内存块组内的各个内存块的占用状态;占用状态包括空闲状态和非空闲状态;
上游设备,被配置为在需要占用内存块时,从该上游设备对应的内存块组开始询问,根据当前询问的内存块组对应的第一数据结构,查找空闲状态的内存块进行占用。
在一些实施例中,上述电子组件中,第一数据结构包括多个第一数据,一内存块组对应的第一数据结构中的每个第一数据用于分别指示该内存块组中每个内存块的占用状态;上游设备,具体被配置为:
在需要占用内存块时,对该上游设备对应的内存块组进行询问,并根据当前询问的内存块组对应的第一数据结构,按照以下方式查找空闲状态的内存块进行占用:
读取当前询问的内存块组对应的第一数据结构,并判断当前询问的内存块组对应的第一数据结构中是否存在指示空闲状态的第一数据;
若是,则从当前询问的内存块组对应的第一数据结构中指示空闲状态的第一数据中选择至少一个第一数据,将至少一个第一数据切换为指示非空闲状态,以将当前询问的内存块组中至少一个第一数据对应的内存块进行占用;
否则,结束对当前询问的内存块组的询问,并对该内存块组的下一内存块组进行询问。
在一些实施例中,上述电子组件中,第一数据结构为位图,每个第一数据的大小为一个比特位。
在一些实施例中,上述电子组件中,上游设备当前需要占用的内存块数量为第一数量;当前询问的内存块组对应的第一数据结构中指示空闲状态的第一数据的数量为第二数量;
上游设备,被配置为从当前询问的内存块组对应的第一数据结构中指示空闲状态的第一数据中选择至少一个第一数据,将至少一个第一数据切换为指示非空闲状态,以将当前询问的内存块组中至少一个第一数据对应的内存块进行占用,包括:
在当前询问的内存块组的第二数量大于等于该上游设备的第一数量时,从当前询问的内存块组对应的第一数据结构中指示空闲状态的第一数据中,选择第一数量个第一数据,将第一数量个第一数据切换为指示非空闲状态,以将当前询问的内存块组中第一数量个第一数据对应的内存块进行占用;
在当前询问的内存块组的第二数量小于该上游设备的第一数量时,将当前询问的内存块组对应的第一数据结构中所有指示空闲状态的第一数据切换为指示非空闲状态,以将当前询问的内存块组中所有空闲状态的内存块进行占用;结束对当前询问的内存块组的询问,将该上游设备当前需要占用的内存块数量更新为第一数量和第二数量的差值,并继续对该内存块组的下一内存块组进行询问。
在一些实施例中,上述电子组件中,还包括第一寄存器;上游设备,被配置为读取当前询问的内存块组对应的第一数据结构,并判断当前询问的内存块组对应的第一数据结构中是否存在指示空闲状态的第一数据;若是,则从当前询问的内存块组对应的第一数据结构中指示空闲状态的第一数据中选择至少一个第一数据,将至少一个第一数据切换为指示非空闲状态,以将当前询问的内存块组中至少一个第一数据对应的内存块进行占用,包括:
上游设备,被配置为将当前询问的内存块组对应的第一数据结构读取到第一寄存器,判断第一寄存器的数据中是否存在指示空闲状态的第一数据;第一寄存器的位宽与第一数据结构的位宽相同;
若是,则从第一寄存器的数据中指示空闲状态的第一数据中选择至少一个第一数据,将第一寄存器中的至少一个第一数据切换为指示非空闲状态,并将第一寄存器的数据整体赋值给当前询问的内存块组的第一数据结构,以将当前询问的内存块组中至少一个第一数据对应的内存块进行占用。
在一些实施例中,上述电子组件中,还包括第二寄存器;上游设备,被配置为读取当前询问的内存块组对应的第一数据结构,并判断当前询问的内存块组对应的第一数据结构中是否存在指示空闲状态的第一数据;若是,则从当前询问的内存块组对应的第一数据结构中指示空闲状态的第一数据中选择至少一个第一数据,将至少一个第一数据切换为指示非空闲状态,以将当前询问的内存块组中至少一个第一数据对应的内存块进行占用,包括:
上游设备,被配置为将当前询问的内存块组对应的第一数据结构读取到第二寄存器,判断第二寄存器的数据中是否存在指示空闲状态的第一数据,若是,则从当前询问的内存块组对应的第一数据结构中指示空闲状态的第一数据中选择至少一个第一数据;
重新读取当前询问的内存块组对应的第一数据结构,比较重新读取的第一数据结构是否等于第二寄存器的数据,若是,则将至少一个第一数据切换为指示非空闲状态,以将当前询问的内存块组中至少一个第一数据对应的内存块进行占用。
在一些实施例中,上述电子组件中,上游设备,被配置为重新读取当前询问的内存块组对应的第一数据结构,比较重新读取的第一数据结构是否等于第二寄存器的数据,若是,则将至少一个第一数据切换为指示非空闲状态,以将当前询问的内存块组中至少一个第一数据对应的内存块进行占用,包括:
上游设备,被配置为采用原子操作重新读取当前询问的内存块组对应的第一数据结构,比较重新读取的第一数据结构是否等于第二寄存器的数据,若是,则采用原子操作将至少一个第一数据切换为指示非空闲状态,以将当前询问的内存块组中至少一个第一数据对应的内存块进行占用。
在一些实施例中,上述电子组件中,上游设备,被配置为从当前询问的内存块组对应的第一数据结构中指示空闲状态的第一数据中选择至少一个第一数据,将至少一个第一数据切换为指示非空闲状态,以将当前询问的内存块组中至少一个第一数据对应的内存块进行占用,包括:
上游设备,被配置为从当前询问的内存块组对应的第一数据结构中指示空闲状态的第一数据中选择至少一个第一数据,采用原子操作将至少一个第一数据切换为指示非空闲状态,以将当前询问的内存块组中至少一个第一数据对应的内存块进行占用。
在一些实施例中,上述电子组件中,信息缓存单元还被配置为缓存每个第一数据结构对应的第二数据结构,第二数据结构为对应的第一数据结构的自旋锁;
上游设备,具体被配置为:
在需要占用内存块时,从该上游设备对应的内存块组开始询问,在获取到当前询问的内存块组对应的第二数据结构时,根据当前询问的内存块组对应的第一数据结构,查找空闲状态的内存块进行占用;
在对一内存块组的询问结束时,释放该内存块组对应的第二数据结构。
在一些实施例中,上述电子组件中,还包括第三寄存器;第二数据结构包括第一数据域、第二数据域和第三数据域;第二数据域包括多个第二数据,多个第二数据分别对应不同的上游设备,第三数据域包括多个第三数据,多个第三数据分别对应不同的上游设备;一第二数据结构中,同一上游设备对应的第二数据和第三数据对应的初始值相同;
上游设备,被配置为按照以下方式获取该上游设备当前询问的内存块组对应的第二数据结构:
将该内存块组对应的第二数据域读取到第三寄存器,将该内存块组对应的第二数据域中该上游设备对应的第二数据赋值为第一预设值,并判断第三寄存器的数据中各第二数据的值是否均为对应的初始值;
若是,则尝试将该上游设备的标识写入该内存块组对应的第一数据域,并判断该第一数据域是否成功写入该上游设备的标识;
若该第一数据域成功写入该上游设备的标识,则根据该内存块组对应的第二数据域和第三数据域,判断该内存块组对应的各个第二数据和各个第三数据中,是否只有该上游设备对应的第二数据和第三数据彼此不同,若是,则获取到该内存块组对应的第二数据结构,否则,重新判断该第一数据域是否成功写入该上游设备的标识;
若该第一数据域未成功写入该上游设备的标识,则将该内存块组对应的第三数据域中该上游设备对应的第三数据赋值为第一预设值;
否则,将该内存块组对应的第三数据域中该上游设备对应的第三数据赋值为第一预设值;
当该内存块组对应的第二数据结构被其它上游设备释放且该内存块组对应的第三数据域中至少一第三数据的值为第一预设值时,该内存块组对应的第三数据域中至少一第三数据中的一者被其它上游设备赋值为初始值,或,当该内存块组对应的第二数据结构被其它上游设备释放时,该内存块组对应的第一数据域被其它上游设备赋值为对应的初始值;
当该内存块组对应的第三数据域中该上游设备对应的第三数据的值由第一预设值切换为对应的初始值时,该上游设备获取到该内存块组对应的第二数据结构;
当该内存块组对应的第一数据域被赋值为对应的初始值时,将该内存块组对应的第三数据域中该上游设备对应的第三数据赋值为对应的初始值,并重新尝试将该上游设备的标识写入该内存块组对应的第一数据域。
在一些实施例中,上述电子组件中,一第二数据结构中,一上游设备对应的第二数据在其所在的第二数据域中的比特位范围,与该上游设备对应的第三数据在其所在的第三数据域中的比特位范围相同;
上游设备,被配置为判断该内存块组对应的各个第二数据和各个第三数据中,是否只有该上游设备对应的第二数据和第三数据彼此不同,包括:
上游设备,被配置为读取该内存块组对应的第二数据域和第三数据域,将读取的第二数据域和第三数据域进行按位异或,并判断是否只有该上游设备对应的比特位范围的异或结果为1,若是,则该内存块组对应的各个第二数据和各个第三数据中只有该上游设备对应的第二数据和第三数据彼此不同。
在一些实施例中,上述电子组件中,上游设备,被配置为尝试将该上游设备的标识写入该内存块组对应的第一数据域,并判断该第一数据域是否成功写入该上游设备的标识,包括:
上游设备,被配置为将该内存块组对应的第一数据域赋值为该上游设备的标识,并重新读取该内存块组对应的第一数据域,判断重新读取的第一数据域的值是否等于该上游设备的标识,若是,则该第一数据域成功写入该上游设备的标识,否则,该第一数据域未成功写入该上游设备的标识。
在一些实施例中,上述电子组件中,上游设备,被配置为在对一内存块组的询问结束时,释放该内存块组对应的第二数据结构,包括:
上游设备,被配置为在对一内存块组的询问结束时,判断该内存块组对应的第三数据域的各第三数据的值是否均为对应的初始值;
若是,则将该内存块组对应的第一数据域赋值为对应的初始值,将该内存块组对应的第二数据域中该上游设备对应的第二数据赋值为对应的初始值,以释放该内存块组对应的第二数据结构;
否则,将该内存块组对应的第二数据域中该上游设备对应的第二数据赋值为对应的初始值,以释放该内存块组对应的第二数据结构,以及从该内存块组对应的第三数据域中值为第一预设值的第三数据中,选择其一,将被选择的第三数据对应的上游设备的标识写入该内存块组对应的第一数据域,将被选择的第三数据赋值为对应的初始值。
在一些实施例中,上述电子组件中,上游设备,被配置为在对一内存块组的询问结束时,判断该内存块组对应的第三数据域的各第三数据的值是否均为对应的初始值,包括:
上游设备,被配置为在对一内存块组的询问结束时,判断该内存块组对应的第一数据域的值是否为该上游设备的标识;
若是,则判断该内存块组对应的第三数据域的各第三数据的值是否均为对应的初始值;
否则,将该内存块组对应的第二数据域中该上游设备对应的第二数据赋值为对应的初始值,以释放该内存块组对应的第二数据结构。
在一些实施例中,上述电子组件中,上游设备,被配置为在对一内存块组的询问结束时,判断该内存块组对应的第三数据域的各第三数据的值是否均为对应的初始值,包括:
上游设备,被配置为在对一内存块组的询问结束时,判断该内存块组对应的第二数据域中该上游设备对应的第二数据的值是否为第一预设值,若是,则判断该内存块组对应的第三数据域的各第三数据的值是否均为对应的初始值。
在一些实施例中,上述电子组件中,第一数据域的长度、第二数据的大小、第三数据的大小均为1个字节的整数倍。
根据本公开的另一方面,提供一种电子设备,包括上述任一实施例的电子组件。
根据本公开的另一个方面,提供一种内存管理方法,应用于上游设备,内存包括第一预设数量个内存块,第一预设数量个内存块被划分为第二预设数量个内存块组,第二预设数量大于等于对应的上游设备的总数量,每个上游设备分别对应一个内存块组;方法包括:
上游设备在需要占用内存块时,从该上游设备对应的内存块组开始询问,根据当前询问的内存块组对应的第一数据结构,查找空闲状态的内存块进行占用;第一数据结构用于记录对应的内存块组内的各个内存块的状态信息。
在一些实施例中,上述内存管理方法中,上游设备在需要占用内存块时,从该上游设备对应的内存块组开始询问,根据当前询问的内存块组对应的第一数据结构,查找空闲状态的内存块进行占用,包括:
上游设备在需要占用内存块时,对该上游设备对应的内存块组进行询问,并根据当前询问的内存块组对应的第一数据结构,按照以下方式查找空闲状态的内存块进行占用:
读取当前询问的内存块组对应的第一数据结构,并判断当前询问的内存块组对应的第一数据结构中是否存在指示空闲状态的第一数据;
若是,则从当前询问的内存块组对应的第一数据结构中指示空闲状态的第一数据中选择至少一个第一数据,将至少一个第一数据切换为指示非空闲状态,以将当前询问的内存块组中至少一个第一数据对应的内存块进行占用;
否则,结束对当前询问的内存块组的询问,并对该内存块组的下一内存块组进行询问。
在一些实施例中,上述内存管理方法中,从当前询问的内存块组对应的第一数据结构中指示空闲状态的第一数据中选择至少一个第一数据,将至少一个第一数据切换为指示非空闲状态,以将当前询问的内存块组中至少一个第一数据对应的内存块进行占用,包括:
从当前询问的内存块组对应的第一数据结构中指示空闲状态的第一数据中选择至少一个第一数据,采用原子操作将至少一个第一数据切换为指示非空闲状态,以将当前询问的内存块组中至少一个第一数据对应的内存块进行占用。
在一些实施例中,上述内存管理方法中,上游设备在需要占用内存块时,从该上游设备对应的内存块组开始询问,根据当前询问的内存块组对应的第一数据结构,查找空闲状态的内存块进行占用;第一数据结构用于记录对应的内存块组内的各个内存块的状态信息,包括:
上游设备在需要占用内存块时,从该上游设备对应的内存块组开始询问,在获取到当前询问的内存块组对应的第二数据结构时,根据当前询问的内存块组对应的第一数据结构,查找空闲状态的内存块进行占用;第二数据结构为对应的第一数据结构的自旋锁;
在对一内存块组的询问结束时,释放该内存块组对应的第二数据结构。
在一些实施例中,上述内存管理方法中,第二数据结构包括第一数据域、第二数据域和第三数据域;第二数据域包括多个第二数据,多个第二数据分别对应不同的上游设备,第三数据域包括多个第三数据,多个第三数据分别对应不同的上游设备;一第二数据结构中,同一上游设备对应的第二数据和第三数据对应的初始值相同;
上游设备按照以下方式获取该上游设备当前询问的内存块组对应的第二数据结构:
将该内存块组对应的第二数据域读取到第三寄存器,将该内存块组对应的第二数据域中该上游设备对应的第二数据赋值为第一预设值,并判断第三寄存器的数据中各第二数据的值是否均为对应的初始值;
若是,则尝试将该上游设备的标识写入该内存块组对应的第一数据域,并判断该第一数据域是否成功写入该上游设备的标识;
若该第一数据域成功写入该上游设备的标识,则根据该内存块组对应的第二数据域和第三数据域,判断该内存块组对应的各个第二数据和各个第三数据中,是否只有该上游设备对应的第二数据和第三数据彼此不同,若是,则获取到该内存块组对应的第二数据结构,否则,重新判断该第一数据域是否成功写入该上游设备的标识;
若该第一数据域未成功写入该上游设备的标识,则将该内存块组对应的第三数据域中该上游设备对应的第三数据赋值为第一预设值;
否则,将该内存块组对应的第三数据域中该上游设备对应的第三数据赋值为第一预设值;
当该内存块组对应的第二数据结构被其它上游设备释放且该内存块组对应的第三数据域中至少一第三数据的值为第一预设值时,该内存块组对应的第三数据域中至少一第三数据中的一者被其它上游设备赋值为初始值,或,当该内存块组对应的第二数据结构被其它上游设备释放时,该内存块组对应的第一数据域被其它上游设备赋值为对应的初始值;
当该内存块组对应的第三数据域中该上游设备对应的第三数据的值由第一预设值切换为对应的初始值时,该上游设备获取到该内存块组对应的第二数据结构;
当该内存块组对应的第一数据域被赋值为对应的初始值时,将该内存块组对应的第三数据域中该上游设备对应的第三数据赋值为对应的初始值,并重新尝试将该上游设备的标识写入该内存块组对应的第一数据域。
附图说明
图1为本公开一个实施例提供的电子组件的连接结构示意图;
图2为本公开一个实施例提供的电子组件中上游设备、信息缓存单元和内存的交互示意图;
图3为本公开一个实施例提供的上游设备查找空闲状态的内存块进行占用的流程示意图;
图4为本公开一个实施例提供的自旋锁场景下上游设备查找空闲状态的内存块进行占用的流程示意图;
图5为本公开一个实施例提供的第二数据结构(自旋锁)的数据结构示意图;
图6为本公开一个实施例提供的上游设备获取第二数据结构(自旋锁)的流程示意图;
图7为本公开一个实施例提供的上游设备释放第二数据结构(自旋锁)的流程示意图;
图8为本公开一个实施例提供的虚拟机1(VM1)和虚拟机2(VM2)同时尝试获取同一第二数据结构(自旋锁)的场景示意图;
图9为本公开一个实施例提供的虚拟机1(VM1)和虚拟机2(VM2)同时尝试获取同一第二数据结构(自旋锁)的另一场景示意图;
图10为本公开一个实施例提供的虚拟机1(VM1)、虚拟机2(VM2)和虚拟机3(VM3)同时尝试获取同一第二数据结构(自旋锁)的场景示意图;
图11为本公开一个实施例提供的虚拟机1(VM1)、虚拟机2(VM2)和虚拟机3(VM3)同时尝试获取同一第二数据结构(自旋锁)的另一场景示意图;
图12为本公开一个实施例提供的虚拟机1(VM1)、虚拟机2(VM2)和虚拟机3(VM3)同时尝试获取同一第二数据结构(自旋锁)的另一场景示意图。
具体实施方式
在介绍本公开实施例之前,应当说明的是:
本公开部分实施例被描述为处理流程,虽然流程的各个操作步骤可能被冠以顺序的步骤编号,但是其中的操作步骤可以被并行地、并发地或者同时实施。
本公开实施例中可能使用了术语“第一”、“第二”等等来描述各个特征,但是这些特征不应当受这些术语限制。使用这些术语仅仅是为了将一个特征与另一个特征进行区分。
本公开实施例中可能使用了术语“和/或”,“和/或”包括其中一个或更多所列出的相关联特征的任意和所有组合。
应当理解的是,当描述两个部件的连接关系或通信关系时,除非明确指明两个部件之间直接连接或直接通信,否则,两个部件的连接或通信可以理解为直接连接或通信,也可以理解为通过中间部件间接连接或通信。
为了使本公开实施例中的技术方案及优点更加清楚明白,以下结合附图对本公开的示例性实施例进行进一步详细的说明,显然,所描述的实施例仅是本公开的一部分实施例,而不是所有实施例的穷举。需要说明的是,在不冲突的情况下,本公开中的实施例及实施例中的特征可以相互组合。
本公开的目的是提供一种电子组件、电子设备及内存管理方法,该电子组件包括内存、信息缓存单元和至少一个上游设备;内存包括第一预设数量个内存块,第一预设数量个内存块被划分为第二预设数量个内存块组,第二预设数量大于等于至少一个上游设备的总数量,每个上游设备分别对应一个内存块组,至少一个上游设备包括虚拟机和/或主机;信息缓存单元,被配置为缓存每个内存块组对应的第一数据结构,第一数据结构用于记录对应的内存块组内的各个内存块的占用状态;占用状态包括空闲状态和非空闲状态;上游设备,被配置为在需要占用内存块时,从该上游设备对应的内存块组开始询问,根据当前询问的内存块组对应的第一数据结构,查找空闲状态的内存块进行占用。
上述方案中,上游设备在需要占用内存块时从该上游设备对应的内存块组开始询问,根据当前询问的内存块组对应的第一数据结构,查找空闲状态的内存块进行占用,可以实现在没有二级SMMU的情况下,内存也可以动态分配给各个上游设备(如VM)使用,实现了内存的充分利用。且每个上游设备从该上游设备对应的内存块组开始询问,开始查找空闲状态的内存块进行占用,在一定程度上避免了多个上游设备操作同一个第一数据结构的概率,避免了内存资源获取冲突场景的发生,可以实现多个上游设备分别对不同的内存块组同时进行询问,提升内存资源获取效率。
本公开的一个实施例提供一种电子组件,如图1所示,包括内存、信息缓存单元和至少一个上游设备;内存包括第一预设数量个内存块,第一预设数量个内存块被划分为第二预设数量个内存块组,第二预设数量大于等于至少一个上游设备的总数量,每个上游设备分别对应一个内存块组,至少一个上游设备包括虚拟机和/或主机;
信息缓存单元,被配置为缓存每个内存块组对应的第一数据结构,第一数据结构用于记录对应的内存块组内的各个内存块的占用状态;占用状态包括空闲状态和非空闲状态;
上游设备,被配置为在需要占用内存块时,从该上游设备对应的内存块组开始询问,根据当前询问的内存块组对应的第一数据结构,查找空闲状态的内存块进行占用。
其中,内存包括但不限于双倍速率(Double Data Rate,DDR)存储器、图形双倍速率(Graphics Double Data Rate,GDDR)存储器等存储器。
内存被划分为第一预设数量个内存块的方式,可以为均分方式,例如,可以将内存切分为第一预设数量个相同大小的块,每块大小可根据实际需求调整,譬如可分为等份的32M、64M、128M或256M。
每个内存块具有对应的标识符,可以为序号(如图1中的#0…#31、#32等)或物理地址。
每个上游设备都可以访问整个内存,但实际使用时需要获取对应内存块所有权(占用内存块)后才能实际使用。
信息缓存单元可以为内存中的一段共享内存空间,每个上游设备(虚拟机或主机)均可以访问该共享内存空间。主机(Host)在内存中分配一块内存空间作为信息缓存单元,以共享内存方式映射给各个虚拟机(VM)共同使用。
在一些实施例中,信息缓存单元,还被配置为缓存每个上游设备对应的控制数据结构,控制数据结构用于记录对应的上游设备占用的内存块信息(内存块的标识符),如图2所示,还可以记录上游设备的运行状态,内存需求信息等。可以根据上游设备的标识(如虚拟机的VM ID或主机的Host ID)配置各个上游设备对应的控制数据结构。
上游设备通过访问内存(如GDDR)的BAR(Base Address Register,基地址寄存器)空间来访问其占用的内存块(如GDDR内存块)。
而上游设备释放相应内存块的方式与占用内存块的方式流程相似,上游设备释放相应内存块的方式可以为对上游设备已占用的内存块,由各自的内存管理模块(例如GPUdriver中的内存管理模块)统一管理使用,在GPU driver完全释放某一内存块中的所有使用时,可选择是否释放该内存块使用权(即是否将该内存块的占用状态由非空闲状态切换为空闲状态)。而在一虚拟机退出时,由主机释放该虚拟机占用的所有内存块(即将虚拟机占用的所有内存块的占用状态由非空闲状态切换为空闲状态)。
在一些实施例中,第一数据结构包括多个第一数据,一内存块组对应的第一数据结构中的每个第一数据用于分别指示该内存块组中每个内存块的占用状态;上游设备,具体被配置为:
在需要占用内存块时,对该上游设备对应的内存块组进行询问,并根据当前询问的内存块组对应的第一数据结构,按照以下方式查找空闲状态的内存块进行占用:
读取当前询问的内存块组对应的第一数据结构,并判断当前询问的内存块组对应的第一数据结构中是否存在指示空闲状态的第一数据;
若是,则从当前询问的内存块组对应的第一数据结构中指示空闲状态的第一数据中选择至少一个第一数据,将至少一个第一数据切换为指示非空闲状态,以将当前询问的内存块组中至少一个第一数据对应的内存块进行占用;
否则,结束对当前询问的内存块组的询问,并对该内存块组的下一内存块组进行询问。
其中,在一些实施例中,第一数据结构为位图(BitMap),每个第一数据的大小为一个比特位。
即,一内存块组对应的第一数据结构中的每个比特位对应该内存块组中一个内存块的占用状态,每个比特位指示了对应的内存块的占用状态,例如,比特位为0指示空闲状态(即0为空闲位),比特位为1指示非空闲状态(即1为非空闲位)。
在一些实施例中,位图(BitMap)的大小优选为字节(8bits)的整数倍,可以是32bits,也可以是64bits,或者其他大小,以最常用的32bits操作单元为例,如图2所示,在10GB GDDR显存的电子组件包括3个虚拟GPU(3个虚拟机VM1~VM3),加上主机(Host)共4个上游设备时,对10GB的GDDR进行分配使用。将10GB GDDR均分为160(第一预设数量)个64MB的内存块(16064MB=10GB), 160个64MB的内存块划分为5(第二预设数量)个内存块组(每个内存块组有32个内存块)。其中,Host对应第一个内存块组(即Host从第一个内存块组开始询问,对应的第一数据结构BitMapArr[0]),VM1对应第二个内存块组(即VM1从第二个内存块组开始询问,对应的第一数据结构BitMapArr[1]),VM2对应第三个内存块组(即VM2从第三个内存块组开始询问,对应的第一数据结构BitMapArr[2]),VM3对应第四个内存块组(即VM3从第四个内存块组开始询问,对应的第一数据结构BitMapArr[3])。
图2中示出了,VM1占用第32个和第63个内存块(内存块从0开始编号),VM2占用第64个和第65个内存块。
在一些实施例中,上游设备从当前询问的内存块组对应的第一数据结构中指示空闲状态的第一数据中选择至少一个第一数据的原则为低位优先,即优先选择位于低位的第一数据。例如,在第一数据结构为位图(BitMap)的场景下,上游设备优先选择当前询问的内存块组对应位图上最低空闲位对应的内存块进行占用。
在一些实施例中,上游设备,被配置为从当前询问的内存块组对应的第一数据结构中指示空闲状态的第一数据中选择至少一个第一数据,将至少一个第一数据切换为指示非空闲状态,以将当前询问的内存块组中至少一个第一数据对应的内存块进行占用,包括:
上游设备,被配置为从当前询问的内存块组对应的第一数据结构中指示空闲状态的第一数据中选择一个第一数据,将选择的第一数据切换为指示非空闲状态,以将当前询问的内存块组中选择的第一数据对应的内存块进行占用。
可以理解为,上游设备每次询问一个内存块组时,可以最多只占用一个内存块,如果该上游设备还需要占用内存块,则需要再次从该上游设备对应的内存块组开始询问,以查找空闲状态的内存块进行占用。
在一些实施例中,上游设备当前需要占用的内存块数量为第一数量;当前询问的内存块组对应的第一数据结构中指示空闲状态的第一数据的数量为第二数量;
上游设备,被配置为从当前询问的内存块组对应的第一数据结构中指示空闲状态的第一数据中选择至少一个第一数据,将至少一个第一数据切换为指示非空闲状态,以将当前询问的内存块组中至少一个第一数据对应的内存块进行占用,包括:
在当前询问的内存块组的第二数量大于等于该上游设备的第一数量时,从当前询问的内存块组对应的第一数据结构中指示空闲状态的第一数据中,选择第一数量个第一数据,将第一数量个第一数据切换为指示非空闲状态,以将当前询问的内存块组中第一数量个第一数据对应的内存块进行占用;
在当前询问的内存块组的第二数量小于该上游设备的第一数量时,将当前询问的内存块组对应的第一数据结构中所有指示空闲状态的第一数据切换为指示非空闲状态,以将当前询问的内存块组中所有空闲状态的内存块进行占用;结束对当前询问的内存块组的询问,将该上游设备当前需要占用的内存块数量更新为第一数量和第二数量的差值,并继续对该内存块组的下一内存块组进行询问。
可以理解为,如果当前询问的内存块组中空闲状态的内存块的数量能够满足该上游设备的需求(即第二数量大于等于第一数量),则询问该内存块组一次就可以占用所需的内存,如果当前询问的内存块组中空闲状态的内存块的数量未能够满足该上游设备的需求(即第二数量小于第一数量),则在占用该内存块组中的所有内存块组之后,还需要继续询问下一内存块组,查找空闲状态的内存块进行占用。也即,上游设备每次询问一个内存块组时,可以根据其当前需要占用的内存块数量,尽可能占用足够多的内存块,以满足其需求,从而减少询问次数,减少询问内存块组所需的开销。
在一些实施例中,上述电子组件,还包括第一寄存器;上游设备,被配置为读取当前询问的内存块组对应的第一数据结构,并判断当前询问的内存块组对应的第一数据结构中是否存在指示空闲状态的第一数据;若是,则从当前询问的内存块组对应的第一数据结构中指示空闲状态的第一数据中选择至少一个第一数据,将至少一个第一数据切换为指示非空闲状态,以将当前询问的内存块组中至少一个第一数据对应的内存块进行占用,包括:
上游设备,被配置为将当前询问的内存块组对应的第一数据结构读取到第一寄存器,判断第一寄存器的数据中是否存在指示空闲状态的第一数据;第一寄存器的位宽与第一数据结构的位宽相同;
若是,则从第一寄存器的数据中指示空闲状态的第一数据中选择至少一个第一数据,将第一寄存器中的至少一个第一数据切换为指示非空闲状态,并将第一寄存器的数据整体赋值给当前询问的内存块组的第一数据结构,以将当前询问的内存块组中至少一个第一数据对应的内存块进行占用。
可以理解为,为了便于对读取到的第一数据结构进行进一步的判断,可以将当前询问的内存块组对应的第一数据结构读取到第一寄存器,然后再对第一寄存器中的数据进行判断。以及为了便于对第一数据结构中的第一数据进行置位,可以先对第一寄存器中的第一数据进行置位,再将第一寄存器中的数值整体写入第一数据结构中。尤其是在第一数据结构为位图的场景下,由于第一数据结构位于信息缓存单元(内存中的一段共享内存空间)中,而硬件指令最小内存读写单元为字节,不方便直接对第一数据结构中的单个第一数据进行置位,此时可以先对第一寄存器中的第一数据进行置位,再将第一寄存器中的数值整体写入第一数据结构中。
在一些实施例中,为了避免在一上游设备对当前询问的内存块组的第一数据结构中的第一数据进行修改(修改第一数据的指示状态)之前,有其它上游设备对该内存块组的第一数据结构第一数据进行修改,但是当前的上游设备不知道,造成多个上游设备可能同时占用同一内存块,导致内存资源获取冲突,上述电子组件,还包括第二寄存器;上游设备,被配置为读取当前询问的内存块组对应的第一数据结构,并判断当前询问的内存块组对应的第一数据结构中是否存在指示空闲状态的第一数据;若是,则从当前询问的内存块组对应的第一数据结构中指示空闲状态的第一数据中选择至少一个第一数据,将至少一个第一数据切换为指示非空闲状态,以将当前询问的内存块组中至少一个第一数据对应的内存块进行占用,包括:
上游设备,被配置为将当前询问的内存块组对应的第一数据结构读取到第二寄存器,判断第二寄存器的数据中是否存在指示空闲状态的第一数据,若是,则从当前询问的内存块组对应的第一数据结构中指示空闲状态的第一数据中选择至少一个第一数据;
重新读取当前询问的内存块组对应的第一数据结构,比较重新读取的第一数据结构是否等于第二寄存器的数据,若是,则将至少一个第一数据切换为指示非空闲状态,以将当前询问的内存块组中至少一个第一数据对应的内存块进行占用。
其中,当重新读取的第一数据结构不等于第二寄存器的数据时,该上游设备需要返回读取当前询问的内存块组对应的第一数据结构,并判断当前询问的内存块组对应的第一数据结构中是否存在指示空闲状态的第一数据的步骤,以重新查找空闲状态的内存块。
可以理解为,在该上游设备重新读取的第一数据结构不等于第二寄存器的数据时,说明同时有其它上游设备在尝试占用同一内存块组中空闲状态的内存块,且该其它上游设备已经占用成功了,此时为了避免内存资源获取冲突,该上游设备需要返回读取当前询问的内存块组对应的第一数据结构,并判断当前询问的内存块组对应的第一数据结构中是否存在指示空闲状态的第一数据的步骤,以重新查找空闲状态的内存块。
在上述电子组件同时包括第一寄存器和第二寄存器的场景下,上游设备,被配置为读取当前询问的内存块组对应的第一数据结构,并判断当前询问的内存块组对应的第一数据结构中是否存在指示空闲状态的第一数据;若是,则从当前询问的内存块组对应的第一数据结构中指示空闲状态的第一数据中选择至少一个第一数据,将至少一个第一数据切换为指示非空闲状态,以将当前询问的内存块组中至少一个第一数据对应的内存块进行占用,包括:
上游设备,被配置为将当前询问的内存块组对应的第一数据结构读取到第一寄存器和第二寄存器,判断第一寄存器的数据中是否存在指示空闲状态的第一数据,若是,则从第一寄存器的数据中指示空闲状态的第一数据中选择至少一个第一数据,将第一寄存器中的至少一个第一数据切换为指示非空闲状态;
重新读取当前询问的内存块组对应的第一数据结构,比较重新读取的第一数据结构是否等于第二寄存器的数据,若是,则将第一寄存器的数据整体赋值给当前询问的内存块组的第一数据结构,以将当前询问的内存块组中至少一个第一数据对应的内存块进行占用。
在一些实施例中,为了避免多个上游设备在同一时刻对同一第一数据结构进行置位,造成内存资源获取冲突,上游设备,被配置为从当前询问的内存块组对应的第一数据结构中指示空闲状态的第一数据中选择至少一个第一数据,将至少一个第一数据切换为指示非空闲状态,以将当前询问的内存块组中至少一个第一数据对应的内存块进行占用,包括:
上游设备,被配置为从当前询问的内存块组对应的第一数据结构中指示空闲状态的第一数据中选择至少一个第一数据,采用原子操作将至少一个第一数据切换为指示非空闲状态,以将当前询问的内存块组中至少一个第一数据对应的内存块进行占用。
由于原子操作可以屏蔽其他进程同时对一个第一数据结构进行操作,进而保证同一时刻最多只能有一个上游设备对一个第一数据结构进行修改。
在结合第二寄存器和支持原子操作的场景下,上游设备,被配置为重新读取当前询问的内存块组对应的第一数据结构,比较重新读取的第一数据结构是否等于第二寄存器的数据,若是,则将至少一个第一数据切换为指示非空闲状态,以将当前询问的内存块组中至少一个第一数据对应的内存块进行占用,包括:
上游设备,被配置为采用原子操作重新读取当前询问的内存块组对应的第一数据结构,比较重新读取的第一数据结构是否等于第二寄存器的数据,若是,则采用原子操作将至少一个第一数据切换为指示非空闲状态,以将当前询问的内存块组中至少一个第一数据对应的内存块进行占用。
在结合第一寄存器、第二寄存器和支持原子操作的场景下,上游设备,被配置为读取当前询问的内存块组对应的第一数据结构,并判断当前询问的内存块组对应的第一数据结构中是否存在指示空闲状态的第一数据;若是,则从当前询问的内存块组对应的第一数据结构中指示空闲状态的第一数据中选择至少一个第一数据,将至少一个第一数据切换为指示非空闲状态,以将当前询问的内存块组中至少一个第一数据对应的内存块进行占用,包括:
上游设备,被配置为将当前询问的内存块组对应的第一数据结构读取到第一寄存器和第二寄存器,判断第一寄存器的数据中是否存在指示空闲状态的第一数据,若是,则从第一寄存器的数据中指示空闲状态的第一数据中选择至少一个第一数据,将第一寄存器中的至少一个第一数据切换为指示非空闲状态;
采用原子操作重新读取当前询问的内存块组对应的第一数据结构,比较重新读取的第一数据结构是否等于第二寄存器的数据,若是,则采用原子操作将第一寄存器的数据整体赋值给当前询问的内存块组的第一数据结构,以将当前询问的内存块组中至少一个第一数据对应的内存块进行占用。
在一些实施例中,在结合第一寄存器、第二寄存器和支持原子操作以及第一数据结构为位图(32bits BitMap)的场景下,上游设备(本实施例中指虚拟机)根据当前询问的内存块组对应的第一数据结构,查找空闲状态的内存块进行占用的整个方案流程如图3所示,具体包括:
步骤S111、第n个虚拟机(VMn)开始占用内存块,执行步骤S112;
步骤S112、第一数据结构BitMapArr共计N个,以[n]为起始,设置i = n,即第n个虚拟机(VMn)从第(n+1)个内存块组开始询问,对应的第一数据结构BitMapArr[n],执行步骤S113;
步骤S113、读取BitMapArr[i]到寄存器val1(第一寄存器)和val2中(第二寄存器),执行步骤S114;
步骤S114、判断BitMapArr[i]是否有空闲位,若是,执行步骤S115,否则执行步骤S118;
步骤S115、获取val1(第一寄存器)最低空闲位序号m,通过(i32 + m)BlockSize计算当前空闲块在GDDR中的偏移,并记录到本地寄存器;将val1(第一寄存器)第m个比特位置1,执行步骤S116;其中,32为每个第一数据结构(BitMapArr[i])的大小,BlockSize为每个内存块的大小;
步骤S116、原子操作BitMapArr[i]:即采用原子操作重新读取BitMapArr[i],比较重新读取的BitMapArr[i]是否等于val2(第二寄存器),若是,则采用原子操作将BitMapArr[i]置为val1(第一寄存器),若操作成功,则执行步骤S117,若操作失败,则返回步骤S113;
步骤S117、占用内存块成功,记录并返回;
步骤S118、若i等于N-1,则i = 0,否则i=i+1;然后判断i是否等于N,若是,执行步骤S119,否则,返回步骤S113;
步骤S119、占用内存块失败。
下面结合图2和图3,提供一种VM1和VM2同时发起内存占用操作的具体场景。
VM1先发起内存获取操作:
1)VM 1(i=1)读取BitMapArr[1]到本地变量val1和val2中;
2)判断val1中无空闲bit;
3)i=i+1=2,循环继续;
4)VM 1(i=2)读取bitmap[2]到本地变量val1和val2中;
5)判断val1中有空闲;
6)计算val1中最低空闲位为m=2,计算对应内存块序号m+32i=2+32/>2=66,val1第2个比特位置1 ;
如果此时VM1被切换,VM1占用内存操作中断,VM2也发起内存获取操作:
7)Vm2(i=2)读取bitmap[2]到本地变量val1和val2中;
8)判断val1有空闲;
9)计算val1最低空闲位为m=2,计算对应内存块序号m+32i=2+32/>2=66,val1第2个比特位置1;
10)原子判断BitMapArr[2]与val2相等的情况下,将BitMapArr[2]原子赋值为val1,操作成功,VM2成功获取第66块内存块使用权;
如果此时VM1被唤醒继续执行:
11)原子判断BitMapArr[2]与val2相等失败;
12)重新读取bitmap[2]到本地变量val1和val2中;
13)判断val1有空闲;
14)计算val1最低空闲位为m=3,计算对应内存块序号m+32i=3+32/>2=67,设置val1第3个比特位置1;
15)原子判断BitMapArr[2]与val2相等的情况下,将BitMapArr[2]原子赋值为val1,操作成功,VM1成功获取第67块内存块使用权。
在一些实施例中,除了上述第二寄存器和原子操作的方式,还可以使用自旋锁(spinlock)来避免内存资源获取冲突。对应的,信息缓存单元还被配置为缓存每个第一数据结构对应的第二数据结构,第二数据结构为对应的第一数据结构的自旋锁;
上游设备,具体被配置为:
在需要占用内存块时,从该上游设备对应的内存块组开始询问,在获取到当前询问的内存块组对应的第二数据结构时,根据当前询问的内存块组对应的第一数据结构,查找空闲状态的内存块进行占用;
在对一内存块组的询问结束时,释放该内存块组对应的第二数据结构。
也即,上游设备在获取到内存块组对应的第二数据结构(自旋锁)时,才根据当前询问的内存块组对应的第一数据结构,查找空闲状态的内存块进行占用,在未获取到内存块组对应的第二数据结构(自旋锁)时,不会从该内存块组中查找空闲状态的内存块进行占用。
当第一数据结构不支持原子操作指令时,可以通过自旋锁的方式,来避免内存资源获取冲突,确保多个上游设备不会同时对同一第一数据结构进行操作。
在一些实施例中,在自旋锁的场景下,上游设备(本实施例中指虚拟机)根据当前询问的内存块组对应的第一数据结构,查找空闲状态的内存块进行占用的整个方案流程如图4所示,具体包括:
步骤S211、第n个虚拟机(VMn)开始占用内存块,执行步骤S212;
步骤S212、第一数据结构BitMapArr共计N个,以[n]为起始,设置i = n,即对第n个虚拟机(VMn)从第(n+1)个内存块组开始询问,对应的第一数据结构BitMapAr[n],执行步骤S213;
步骤S213、获取BitMapArr[i]对应的第二数据结构(自旋锁),执行步骤S214;
步骤S214、读取BitMapArr[i]到寄存器val1(第一寄存器)中,执行步骤S215;
步骤S215、判断BitMapArr[i]是否有空闲位,若是,执行步骤S216,否则执行步骤S219;
步骤S216、获取val1(第一寄存器)最低空闲位序号m,通过(i32 + m)BlockSize计算当前空闲块在GDDR中的偏移,并记录到本地寄存器;将BitMapArr[i]第m个比特位置1,执行步骤S217;其中,32为每个第一数据结构(BitMapArr[i])的大小,BlockSize为每个内存块的大小;
步骤S217、释放对应自旋锁,执行步骤S218;
步骤S218、占用内存块成功,记录并返回;
步骤S219、释放对应自旋锁,执行步骤S220;
步骤S220、若i等于N-1,则i = 0,否则i=i+1;然后判断i是否等于n,若是,执行步骤S221,否则,返回步骤S213;
步骤S221、占用内存块失败。
在一些实施例中,如图5所示,提供一种第二数据结构(自旋锁,spinlock),包括第一数据域(竞争占有域,rival域)、第二数据域(尝试锁定域,tryLock域)和第三数据域(锁定等待域,wait域),第二数据域包括多个第二数据,多个第二数据分别对应不同的上游设备,第三数据域包括多个第三数据,多个第三数据分别对应不同的上游设备;一第二数据结构中,同一上游设备对应的第二数据和第三数据对应的初始值相同;
上游设备,被配置为按照以下方式获取该上游设备当前询问的内存块组对应的第二数据结构:
将该内存块组对应的第二数据域读取到第三寄存器,将该内存块组对应的第二数据域中该上游设备对应的第二数据赋值为第一预设值,并判断第三寄存器的数据中各第二数据的值是否均为对应的初始值;
若是,则尝试将该上游设备的标识写入该内存块组对应的第一数据域,并判断该第一数据域是否成功写入该上游设备的标识;
若该第一数据域成功写入该上游设备的标识,则根据该内存块组对应的第二数据域和第三数据域,判断该内存块组对应的各个第二数据和各个第三数据中,是否只有该上游设备对应的第二数据和第三数据彼此不同,若是,则获取到该内存块组对应的第二数据结构,否则,重新判断该第一数据域是否成功写入该上游设备的标识;
若该第一数据域未成功写入该上游设备的标识,则将该内存块组对应的第三数据域中该上游设备对应的第三数据赋值为第一预设值;
否则,将该内存块组对应的第三数据域中该上游设备对应的第三数据赋值为第一预设值;
当该内存块组对应的第二数据结构被其它上游设备释放且该内存块组对应的第三数据域中至少一第三数据的值为第一预设值时,该内存块组对应的第三数据域中至少一第三数据中的一者被其它上游设备赋值为初始值,或,当该内存块组对应的第二数据结构被其它上游设备释放时,该内存块组对应的第一数据域被其它上游设备赋值为对应的初始值;
当该内存块组对应的第三数据域中该上游设备对应的第三数据的值由第一预设值切换为对应的初始值时,该上游设备获取到该内存块组对应的第二数据结构;
当该内存块组对应的第一数据域被赋值为对应的初始值时,将该内存块组对应的第三数据域中该上游设备对应的第三数据赋值为对应的初始值,并重新尝试将该上游设备的标识写入该内存块组对应的第一数据域。
其中,初始值不同于第一预设值。
其中,由于上游设备获取该上游设备当前询问的内存块组对应的第二数据结构(自旋锁)时,会首先将该内存块组对应的第二数据域中该上游设备对应的第二数据赋值为第一预设值(即该上游设备进入尝试锁定域),后面在满足写入第三数据域(即进入锁定等待域)的条件时,才会将该内存块组对应的第三数据域中该上游设备对应的第三数据赋值为第一预设值。
当第三寄存器的数据中各第二数据均为对应的初始值时,说明当前只有该上游设备在竞争锁,此时,尝试将该上游设备的标识写入该内存块组对应的第一数据域,如果成功写入,则通过比较该内存块组对应的各个第二数据和各个第三数据中,是否只有该上游设备对应的第二数据和第三数据彼此不同来进一步确定是否只有该上游设备在竞争锁(由于该上游设备在占有锁的过程中,第一数据域至第三数据域中的数据可能会被其它上游设备置位),当一第二数据结构中,只有该上游设备对应的第二数据和第三数据彼此不同时,说明只有该上游设备对应的第二数据和第三数据分别为第一预设值和初始值,其它任一上游设备对应的第二数据和第三数据同时为初始值(说明未进入尝试锁定域,即未参与竞争锁)或同时为第一预设值(虽然参与竞争锁,但已进入锁定等待域),此时,该上游设备会优先获取到锁,然后才轮到其它上游设备。也即,当一个上游设备标识写入一内存块组对应的第一数据域中,且该内存块组对应的各个第二数据和各个第三数据中只有该上游设备对应的第二数据和第三数据彼此不同时,该上游设备会获取到锁。
在一些实施例中,由于第二数据结构位于信息缓存单元(内存中的一段共享内存空间)中,而硬件指令最小内存读写单元为字节,为了实现直接对第二数据结构中的第一数据域、第二数据或第三数据进行置位,第一数据域的长度、第二数据的大小、第三数据的大小均为1个字节的K倍,K为大于等于1的整数。
在一些实施例中,一第二数据结构中,一上游设备对应的第二数据在其所在的第二数据域中的比特位范围,与该上游设备对应的第三数据在其所在的第三数据域中的比特位范围相同;
上游设备,被配置为判断该内存块组对应的各个第二数据和各个第三数据中,是否只有该上游设备对应的第二数据和第三数据彼此不同,包括:
上游设备,被配置为读取该内存块组对应的第二数据域和第三数据域,将读取的第二数据域和第三数据域进行按位异或,并判断是否只有该上游设备对应的比特位范围的异或结果为1,若是,则该内存块组对应的各个第二数据和各个第三数据中只有该上游设备对应的第二数据和第三数据彼此不同。
其中,通过按位异或运算可以快速比较任一上游设备对应的第二数据和第三数据是否相同,当上游设备对应的比特位范围的异或结果为1时,说明其对应的第二数据和第三数据不同。
在一些实施例中,上游设备,被配置为尝试将该上游设备的标识写入该内存块组对应的第一数据域,并判断该第一数据域是否成功写入该上游设备的标识,包括:
上游设备,被配置为将该内存块组对应的第一数据域赋值为该上游设备的标识,并重新读取该内存块组对应的第一数据域,判断重新读取的第一数据域的值是否等于该上游设备的标识,若是,则该第一数据域成功写入该上游设备的标识,否则,该第一数据域未成功写入该上游设备的标识。
可以理解为,上游设备尝试将该上游设备的标识写入该内存块组对应的第一数据域时,可能有其它的上游设备也在尝试写入该内存块组对应的第一数据域中,所以通过重新读取该内存块组对应的第一数据域,判断重新读取的第一数据域的值是否等于该上游设备的标识来判断该第一数据域是否成功写入该上游设备的标识,当重新读取的第一数据域的值等于该上游设备的标识时,说明该内存块组对应的第一数据域中的信息未被其它上游设备修改。通过这种方式,可以进一步避免内存资源获取冲突场景的发生。
在一些实施例中,上游设备,被配置为在对一内存块组的询问结束时,释放该内存块组对应的第二数据结构,包括:
上游设备,被配置为在对一内存块组的询问结束时,判断该内存块组对应的第三数据域的各第三数据的值是否均为对应的初始值;
若是,则将该内存块组对应的第一数据域赋值为对应的初始值,将该内存块组对应的第二数据域中该上游设备对应的第二数据赋值为对应的初始值,以释放该内存块组对应的第二数据结构;
否则,将该内存块组对应的第二数据域中该上游设备对应的第二数据赋值为对应的初始值,以释放该内存块组对应的第二数据结构,以及从该内存块组对应的第三数据域中值为第一预设值的第三数据中,选择其一,将被选择的第三数据对应的上游设备的标识写入该内存块组对应的第一数据域,将被选择的第三数据赋值为对应的初始值。
其中,从该内存块组对应的第三数据域中值为第一预设值的第三数据中,选择其一的方式为低位优先,即优先选择位于低位的第三数据。例如,在第三数据的大小为1个字节时,上游设备优先选择当前询问的内存块组对应的第三数据域中最低等待字节(等待字节为值等于第一预设值的字节)对应的第三数据。
在一些实施例中,上游设备,被配置为在对一内存块组的询问结束时,判断该内存块组对应的第三数据域的各第三数据的值是否均为对应的初始值,包括:
上游设备,被配置为在对一内存块组的询问结束时,判断该内存块组对应的第一数据域的值是否为该上游设备的标识;
若是,则判断该内存块组对应的第三数据域的各第三数据的值是否均为对应的初始值;
否则,将该内存块组对应的第二数据域中该上游设备对应的第二数据赋值为对应的初始值,以释放该内存块组对应的第二数据结构。
可以理解为,当该上游设备在对一内存块组的询问结束时,若此时该内存块组对应的第一数据域的值不为该上游设备的标识,则说明当前有其它上游设备尝试将其标识写入该内存块组对应的第一数据域,此时该内存块组对应的第二数据结构接下来的归属权,可以根据该其它上游设备获取第二数据结构的流程来确定,无需当前的上游设备来指定。
在一些实施例中,上游设备,被配置为在对一内存块组的询问结束时,判断该内存块组对应的第三数据域的各第三数据的值是否均为对应的初始值,包括:
上游设备,被配置为在对一内存块组的询问结束时,判断该内存块组对应的第二数据域中该上游设备对应的第二数据的值是否为第一预设值,若是,则判断该内存块组对应的第三数据域的各第三数据的值是否均为对应的初始值。
当该内存块组对应的第二数据域中该上游设备对应的第二数据的值不为第一预设值时,说明释放锁的流程异常,此时会返回失败信息。
可以理解为,按照上述上游设备获取第二数据结构(获取锁)和释放第二数据结构(释放锁)的方案,上游设备在获取锁并释放锁之后,才会将第二数据域中该上游设备对应的第二数据的值置为对应的初始值,所以,上游设备在对一内存块组的询问结束时,先判断该内存块组对应的第二数据域中该上游设备对应的第二数据的值是否为第一预设值,可以保证整个方***性。在一些实施例中,在第一数据域的长度、第二数据的大小、第三数据的大小均为1个字节(8bits),上游设备的数量为8,包括1个主机和7个虚拟机(VM1~VM7),第二数据域和第三数据域均为8字节(64bits),第二数据域和第三数据域中的第0字节对应主机,第1字节至第7字节分别对应VM1至VM7,VM1至VM7的标识(VM ID)分别为1至7,主机的标识为大于等于8的任意数值,各个数据域对应的初始值均为0,第一预设值为1的场景下,上游设备(本实施例中指虚拟机)获取自旋锁(第二数据结构)的整个方案流程如图6所示,具体包括:
步骤S311、64bits读取tryLock域(即整个第二数据域)到寄存器val64(第三寄存器)中,执行步骤S312;
步骤S312、字节置位VMn对应的tryLock域第二数据(即tryLock域第n字节,trylock[n])为1,执行步骤S313;
步骤S313、判断寄存器val64(第三寄存器)中各第二数据是否均为0,也即寄存器val64(第三寄存器)整体是否为0,若是,则执行步骤S314,否则,执行步骤S318;
步骤S314、尝试占有锁,写入标识VM ID(即n)到rival域(第一数据域),执行步骤S315;
步骤S315、读取rival域,判断读取的rival域是否等于VM ID(即n),若是,则执行步骤S316,否则执行步骤S318;
步骤S316、64bits读取tryLock域(即整个第二数据域)和wait域(即整个第三数据域),执行步骤S317;
步骤S317、将读取的tryLock域和wait域进行按位异或,判断是否只有该上游设备对应的比特位范围的异或结果为1(也即是否只有第8n个比特位的异或结果为1),若是,则获取锁成功,否则,返回步骤S315;
步骤S318、字节置位VMn对应的wait域第三数据(即wait域第n字节,wait[n])为1,执行步骤S319;
步骤S319、字节读取VMn对应的wait域第三数据(即wait域第n字节,wait[n]),执行步骤S320;
步骤S320、判断读取的第三数据(即wait域第n字节,wait[n])是否为 0,若是,则获取锁成功,否则执行步骤S321;
步骤S321、判断rival域的值是否为0,若是,则执行步骤S322,否则执行步骤S319;
步骤S322、清除VMn对应的wait域第三数据(即wait域第n字节,wait[n]),返回步骤S314。
对应的,上游设备释放自旋锁(第二数据结构)的整个方案流程如图7所示,具体包括:
步骤S411、判断VMn对应的tryLock域第二数据(即tryLock域第n字节,trylock[n])是否为1,若是,执行步骤S412,否则,执行步骤S413;
步骤S412、读取rival域,判断读取的rival域是否等于VM ID(即n),若是,则执行步骤S414,否则执行步骤S418;
步骤S414、64bits读取wait域(wait域整体),执行步骤S415;
步骤S415、判断读取的wait域是否为0,若是,则执行步骤S416,否则执行步骤417;
步骤S416、清除rival(置为初始值0),执行步骤S418;
步骤S417、从读取的wait中获取最低等待字节上的ID号m,令rival=m,然后清除VMm等待位,即将wait[m] 置为 0,执行步骤S418;
步骤S418、清除当前VM tryLock位,即将VMn对应的tryLock域第二数据(即tryLock域第n字节,trylock[n])置为 0,执行步骤S419;
步骤S419、解锁成功返回。
需要说明的是,上述读取数据域或数据结构的过程是将数据域或数据结构读取到本地寄存器的过程,对读取的数据进行判断的过程,也是针对本地寄存器中的数据进行判断的过程。
结合图6和图7,下面给出多个虚拟机(VM)竞争同一自旋锁的场景。
第一种场景,如图8所示,虚拟机1(VM1)和虚拟机2(VM2)同时尝试获取同一第二数据结构(自旋锁):自旋锁的初始状态如图8的第一个图所示,VM1和VM2同时执行步骤S311,然后VM1先执行步骤S312~S314写入rival,VM2执行步骤S312~S314后写入rival;VM1执行步骤S315,发现rival被VM2占有VM1进入步骤S318到S321等待,VM2占有锁成功,VM2退出时,按照释放锁的流程,设置锁被VM1占有(令rival=1),VM2先清除VM1等待位wait[1],VM2再清除VM2 tryLock位trylock[2],VM1获取锁成功,VM1退出时,VM1先清除rival,再清除VM1tryLock位trylock[1],释放锁,锁空闲。
第二种场景,如图9所示,还是虚拟机1(VM1)和虚拟机2(VM2)同时尝试获取同一第二数据结构(自旋锁):自旋锁的初始状态如图9的第一个图所示,VM2所有获取锁的操作被总线阻塞,VM1直接获取锁成功,VM2继续操作后,VM2在步骤S315到S317间循环,VM1退出时,发现rival不等于其VM ID即1,直接清除VM1 tryLock位trylock[1]后退出,VM2获取锁成功,VM2退出时,VM2先清除rival,再清除VM2 tryLock位trylock[2],释放锁,锁空闲。
第三种场景,如图10所示,虚拟机1(VM1)和虚拟机2(VM2)同时尝试获取同一第二数据结构(自旋锁),之后虚拟机3(VM3)尝试获取同一第二数据结构(自旋锁):自旋锁的初始状态如图10的第一个图所示,VM1和VM2同时执行步骤S311,然后VM1先执行步骤S312~S314写入rival,VM2执行步骤S312~S314后写入rival;VM1执行步骤S315,发现rival被VM2占有VM1进入步骤S318到S321等待,VM2占有锁成功,VM2退出时,按照释放锁的流程,设置锁被VM1占有(令rival=1),VM2先清除VM1等待位wait[1],VM2再清除VM2 tryLock位trylock[2],VM1获取锁成功,VM1退出释放锁的过程中,在VM1的步骤S415到S416之间,VM3尝试获取该锁,VM3进入步骤S318到S321等待,VM1继续步骤S416清除rival域和VM1 tryLock位trylock[1],VM3执行步骤S322,然后返回步骤S314。
第四种场景,如图11所示,虚拟机1(VM1)、虚拟机2(VM2)和虚拟机3(VM3)同时尝试获取同一第二数据结构(自旋锁):自旋锁的初始状态如图11的第一个图所示,VM2、VM3所有获取锁的操作被总线阻塞,VM1直接获取锁成功,VM3、VM2先后恢复占有锁操作,VM3先写入rival,VM2后写入rival,最终VM2写入rival成功,VM3进入步骤S318到S321等待,VM2在步骤S315到步骤S317间循环,VM1退出时,发现rival不等于其VM ID即1,直接清除tryLock位trylock[1]后退出,VM2获取锁成功,VM2退出时,设置锁被VM3占有(令rival=3),VM2先清除VM3等待位wait[3],VM2再清除VM2 tryLock位trylock[2],VM3获取锁成功,VM3退出时,VM3先清除rival,再清除VM3 tryLock位trylock[3],释放锁,锁空闲。
第五种场景,如图12所示,虚拟机1(VM1)、虚拟机2(VM2)和虚拟机3(VM3)同时尝试获取同一第二数据结构(自旋锁):自旋锁的初始状态如图12的第一个图所示,VM1、VM2和VM3同时执行步骤S311,然后VM1先执行步骤S312至S314写入tryLock和rival,VM2执行步骤S312写入tryLock,VM3执行步骤S312至S314写入tryLock和rival,VM2最后执行步骤S314写入rival,VM1、VM3在步骤S315发现rival被VM2占有,即ID写入rival失败,VM1、VM3进入步骤S318到S321等待,VM2占有锁成功,VM2退出时,设置锁被VM1占有(令rival=1),VM2先清除VM1等待位wait[1],VM2再清除VM2 tryLock位trylock[2],VM1获取锁成功,VM1退出时,设置锁被VM3占有(令rival=3),VM1先清除VM3等待位wait[3],VM1再清除VM1 tryLock位trylock[1],VM3获取锁成功,VM3退出时,VM3先清除rival,再清除VM3 tryLock位trylock[1],释放锁,锁空闲。
在一些使用场景下,上述电子组件的产品形式体现为显卡。
基于相同的发明构思,本公开实施例还提供一种电子设备,该电子设备包括上述的电子组件。在一些使用场景下,该电子设备的产品形式是便携式电子设备,例如智能手机、平板电脑、VR设备等;在一些使用场景下,该电子设备的产品形式是个人电脑、游戏主机等。
基于相同的发明构思,本公开实施例还提供一种内存管理方法,应用于上游设备,内存包括第一预设数量个内存块,第一预设数量个内存块被划分为第二预设数量个内存块组,第二预设数量大于等于对应的上游设备的总数量,每个上游设备分别对应一个内存块组;方法包括:
上游设备在需要占用内存块时,从该上游设备对应的内存块组开始询问,根据当前询问的内存块组对应的第一数据结构,查找空闲状态的内存块进行占用;第一数据结构用于记录对应的内存块组内的各个内存块的状态信息。
在一些实施例中,上述内存管理方法中,上游设备在需要占用内存块时,从该上游设备对应的内存块组开始询问,根据当前询问的内存块组对应的第一数据结构,查找空闲状态的内存块进行占用,包括:
上游设备在需要占用内存块时,对该上游设备对应的内存块组进行询问,并根据当前询问的内存块组对应的第一数据结构,按照以下方式查找空闲状态的内存块进行占用:
读取当前询问的内存块组对应的第一数据结构,并判断当前询问的内存块组对应的第一数据结构中是否存在指示空闲状态的第一数据;
若是,则从当前询问的内存块组对应的第一数据结构中指示空闲状态的第一数据中选择至少一个第一数据,将至少一个第一数据切换为指示非空闲状态,以将当前询问的内存块组中至少一个第一数据对应的内存块进行占用;
否则,结束对当前询问的内存块组的询问,并对该内存块组的下一内存块组进行询问。
在一些实施例中,上述内存管理方法中,从当前询问的内存块组对应的第一数据结构中指示空闲状态的第一数据中选择至少一个第一数据,将至少一个第一数据切换为指示非空闲状态,以将当前询问的内存块组中至少一个第一数据对应的内存块进行占用,包括:
从当前询问的内存块组对应的第一数据结构中指示空闲状态的第一数据中选择至少一个第一数据,采用原子操作将至少一个第一数据切换为指示非空闲状态,以将当前询问的内存块组中至少一个第一数据对应的内存块进行占用。
在一些实施例中,上述内存管理方法中,上游设备在需要占用内存块时,从该上游设备对应的内存块组开始询问,根据当前询问的内存块组对应的第一数据结构,查找空闲状态的内存块进行占用;第一数据结构用于记录对应的内存块组内的各个内存块的状态信息,包括:
上游设备在需要占用内存块时,从该上游设备对应的内存块组开始询问,在获取到当前询问的内存块组对应的第二数据结构时,根据当前询问的内存块组对应的第一数据结构,查找空闲状态的内存块进行占用;第二数据结构为对应的第一数据结构的自旋锁;
在对一内存块组的询问结束时,释放该内存块组对应的第二数据结构。
在一些实施例中,上述内存管理方法中,第二数据结构包括第一数据域、第二数据域和第三数据域;第二数据域包括多个第二数据,多个第二数据分别对应不同的上游设备,第三数据域包括多个第三数据,多个第三数据分别对应不同的上游设备;一第二数据结构中,同一上游设备对应的第二数据和第三数据对应的初始值相同;
上游设备按照以下方式获取该上游设备当前询问的内存块组对应的第二数据结构:
将该内存块组对应的第二数据域读取到第三寄存器,将该内存块组对应的第二数据域中该上游设备对应的第二数据赋值为第一预设值,并判断第三寄存器的数据中各第二数据的值是否均为对应的初始值;
若是,则尝试将该上游设备的标识写入该内存块组对应的第一数据域,并判断该第一数据域是否成功写入该上游设备的标识;
若该第一数据域成功写入该上游设备的标识,则根据该内存块组对应的第二数据域和第三数据域,判断该内存块组对应的各个第二数据和各个第三数据中,是否只有该上游设备对应的第二数据和第三数据彼此不同,若是,则获取到该内存块组对应的第二数据结构,否则,重新判断该第一数据域是否成功写入该上游设备的标识;
若该第一数据域未成功写入该上游设备的标识,则将该内存块组对应的第三数据域中该上游设备对应的第三数据赋值为第一预设值;
否则,将该内存块组对应的第三数据域中该上游设备对应的第三数据赋值为第一预设值;
当该内存块组对应的第二数据结构被其它上游设备释放且该内存块组对应的第三数据域中至少一第三数据的值为第一预设值时,该内存块组对应的第三数据域中至少一第三数据中的一者被其它上游设备赋值为初始值,或,当该内存块组对应的第二数据结构被其它上游设备释放时,该内存块组对应的第一数据域被其它上游设备赋值为对应的初始值;
当该内存块组对应的第三数据域中该上游设备对应的第三数据的值由第一预设值切换为对应的初始值时,该上游设备获取到该内存块组对应的第二数据结构;
当该内存块组对应的第一数据域被赋值为对应的初始值时,将该内存块组对应的第三数据域中该上游设备对应的第三数据赋值为对应的初始值,并重新尝试将该上游设备的标识写入该内存块组对应的第一数据域。
上述各个步骤的具体实施过程可参见上述电子组件的任一实施例,此处不再赘述。
尽管已描述了本公开的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例作出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本公开范围的所有变更和修改。
显然,本领域的技术人员可以对本公开进行各种改动和变型而不脱离本公开的精神和范围。这样,倘若本公开的这些修改和变型属于本公开权利要求及其等同技术的范围之内,则本公开也意图包含这些改动和变型在内。
Claims (22)
1.一种电子组件,包括内存、信息缓存单元和至少一个上游设备;所述内存包括第一预设数量个内存块,所述第一预设数量个内存块被划分为第二预设数量个内存块组,所述第二预设数量大于等于所述至少一个上游设备的总数量,每个上游设备分别对应一个内存块组,所述至少一个上游设备包括虚拟机和/或主机;
所述信息缓存单元,被配置为缓存每个内存块组对应的第一数据结构,所述第一数据结构用于记录对应的所述内存块组内的各个内存块的占用状态;所述占用状态包括空闲状态和非空闲状态;
所述上游设备,被配置为在需要占用内存块时,从该上游设备对应的内存块组开始询问,根据信息缓存单元中当前询问的内存块组对应的所述第一数据结构,查找空闲状态的内存块进行占用。
2.根据权利要求1所述的电子组件,所述第一数据结构包括多个第一数据,一内存块组对应的所述第一数据结构中的每个第一数据用于分别指示该内存块组中每个内存块的占用状态;所述上游设备,具体被配置为:
在需要占用内存块时,对该上游设备对应的内存块组进行询问,并根据当前询问的内存块组对应的所述第一数据结构,按照以下方式查找空闲状态的内存块进行占用:
读取当前询问的内存块组对应的所述第一数据结构,并判断当前询问的内存块组对应的所述第一数据结构中是否存在指示空闲状态的第一数据;
若是,则从当前询问的内存块组对应的所述第一数据结构中指示空闲状态的第一数据中选择至少一个第一数据,将所述至少一个第一数据切换为指示非空闲状态,以将当前询问的内存块组中所述至少一个第一数据对应的内存块进行占用;
否则,结束对当前询问的内存块组的询问,并对该内存块组的下一内存块组进行询问。
3.根据权利要求2所述的电子组件,所述第一数据结构为位图,每个第一数据的大小为一个比特位。
4.根据权利要求2所述的电子组件,所述上游设备当前需要占用的内存块数量为第一数量;当前询问的内存块组对应的所述第一数据结构中指示空闲状态的第一数据的数量为第二数量;
所述上游设备,被配置为从当前询问的内存块组对应的所述第一数据结构中指示空闲状态的第一数据中选择至少一个第一数据,将所述至少一个第一数据切换为指示非空闲状态,以将当前询问的内存块组中所述至少一个第一数据对应的内存块进行占用,包括:
在当前询问的内存块组的所述第二数量大于等于该上游设备的所述第一数量时,从当前询问的内存块组对应的所述第一数据结构中指示空闲状态的第一数据中,选择所述第一数量个第一数据,将所述第一数量个第一数据切换为指示非空闲状态,以将当前询问的内存块组中所述第一数量个第一数据对应的内存块进行占用;
在当前询问的内存块组的所述第二数量小于该上游设备的所述第一数量时,将当前询问的内存块组对应的所述第一数据结构中所有指示空闲状态的第一数据切换为指示非空闲状态,以将当前询问的内存块组中所有空闲状态的内存块进行占用;结束对当前询问的内存块组的询问,将该上游设备当前需要占用的内存块数量更新为所述第一数量和所述第二数量的差值,并继续对该内存块组的下一内存块组进行询问。
5.根据权利要求2所述的电子组件,还包括第一寄存器;所述上游设备,被配置为读取当前询问的内存块组对应的所述第一数据结构,并判断当前询问的内存块组对应的所述第一数据结构中是否存在指示空闲状态的第一数据;若是,则从当前询问的内存块组对应的所述第一数据结构中指示空闲状态的第一数据中选择至少一个第一数据,将所述至少一个第一数据切换为指示非空闲状态,以将当前询问的内存块组中所述至少一个第一数据对应的内存块进行占用,包括:
所述上游设备,被配置为将当前询问的内存块组对应的所述第一数据结构读取到所述第一寄存器,判断所述第一寄存器的数据中是否存在指示空闲状态的第一数据;所述第一寄存器的位宽与所述第一数据结构的位宽相同;
若是,则从所述第一寄存器的数据中指示空闲状态的第一数据中选择至少一个第一数据,将所述第一寄存器中的所述至少一个第一数据切换为指示非空闲状态,并将所述第一寄存器的数据整体赋值给当前询问的内存块组的所述第一数据结构,以将当前询问的内存块组中所述至少一个第一数据对应的内存块进行占用。
6.根据权利要求2所述的电子组件,还包括第二寄存器;所述上游设备,被配置为读取当前询问的内存块组对应的所述第一数据结构,并判断当前询问的内存块组对应的所述第一数据结构中是否存在指示空闲状态的第一数据;若是,则从当前询问的内存块组对应的所述第一数据结构中指示空闲状态的第一数据中选择至少一个第一数据,将所述至少一个第一数据切换为指示非空闲状态,以将当前询问的内存块组中所述至少一个第一数据对应的内存块进行占用,包括:
所述上游设备,被配置为将当前询问的内存块组对应的所述第一数据结构读取到所述第二寄存器,判断所述第二寄存器的数据中是否存在指示空闲状态的第一数据,若是,则从当前询问的内存块组对应的所述第一数据结构中指示空闲状态的第一数据中选择至少一个第一数据;
重新读取当前询问的内存块组对应的所述第一数据结构,比较重新读取的所述第一数据结构是否等于所述第二寄存器的数据,若是,则将所述至少一个第一数据切换为指示非空闲状态,以将当前询问的内存块组中所述至少一个第一数据对应的内存块进行占用。
7.根据权利要求6所述的电子组件,所述上游设备,被配置为重新读取当前询问的内存块组对应的所述第一数据结构,比较重新读取的所述第一数据结构是否等于所述第二寄存器的数据,若是,则将所述至少一个第一数据切换为指示非空闲状态,以将当前询问的内存块组中所述至少一个第一数据对应的内存块进行占用,包括:
所述上游设备,被配置为采用原子操作重新读取当前询问的内存块组对应的所述第一数据结构,比较重新读取的所述第一数据结构是否等于所述第二寄存器的数据,若是,则采用原子操作将所述至少一个第一数据切换为指示非空闲状态,以将当前询问的内存块组中所述至少一个第一数据对应的内存块进行占用。
8.根据权利要求2所述的电子组件,所述上游设备,被配置为从当前询问的内存块组对应的所述第一数据结构中指示空闲状态的第一数据中选择至少一个第一数据,将所述至少一个第一数据切换为指示非空闲状态,以将当前询问的内存块组中所述至少一个第一数据对应的内存块进行占用,包括:
所述上游设备,被配置为从当前询问的内存块组对应的所述第一数据结构中指示空闲状态的第一数据中选择至少一个第一数据,采用原子操作将所述至少一个第一数据切换为指示非空闲状态,以将当前询问的内存块组中所述至少一个第一数据对应的内存块进行占用。
9.根据权利要求1所述的电子组件,所述信息缓存单元还被配置为缓存每个所述第一数据结构对应的第二数据结构,所述第二数据结构为对应的所述第一数据结构的自旋锁;
所述上游设备,具体被配置为:
在需要占用内存块时,从该上游设备对应的内存块组开始询问,在获取到当前询问的内存块组对应的所述第二数据结构时,根据当前询问的内存块组对应的所述第一数据结构,查找空闲状态的内存块进行占用;
在对一内存块组的询问结束时,释放该内存块组对应的所述第二数据结构。
10.根据权利要求9所述的电子组件,还包括第三寄存器;所述第二数据结构包括第一数据域、第二数据域和第三数据域;第二数据域包括多个第二数据,所述多个第二数据分别对应不同的上游设备,第三数据域包括多个第三数据,所述多个第三数据分别对应不同的上游设备;一第二数据结构中,同一上游设备对应的第二数据和第三数据对应的初始值相同;
所述上游设备,被配置为按照以下方式获取该上游设备当前询问的内存块组对应的所述第二数据结构:
将该内存块组对应的所述第二数据域读取到第三寄存器,将该内存块组对应的所述第二数据域中该上游设备对应的第二数据赋值为第一预设值,并判断所述第三寄存器的数据中各第二数据的值是否均为对应的初始值;
若是,则尝试将该上游设备的标识写入该内存块组对应的所述第一数据域,并判断该第一数据域是否成功写入该上游设备的标识;
若该第一数据域成功写入该上游设备的标识,则根据该内存块组对应的所述第二数据域和所述第三数据域,判断该内存块组对应的各个第二数据和各个第三数据中,是否只有该上游设备对应的第二数据和第三数据彼此不同,若是,则获取到该内存块组对应的所述第二数据结构,否则,重新判断该第一数据域是否成功写入该上游设备的标识;
若该第一数据域未成功写入该上游设备的标识,则将该内存块组对应的所述第三数据域中该上游设备对应的第三数据赋值为所述第一预设值;
否则,将该内存块组对应的所述第三数据域中该上游设备对应的第三数据赋值为所述第一预设值;
当该内存块组对应的第二数据结构被其它上游设备释放且该内存块组对应的所述第三数据域中至少一第三数据的值为所述第一预设值时,该内存块组对应的所述第三数据域中所述至少一第三数据中的一者被所述其它上游设备赋值为初始值,或,当该内存块组对应的第二数据结构被其它上游设备释放时,该内存块组对应的所述第一数据域被所述其它上游设备赋值为对应的初始值;
当该内存块组对应的所述第三数据域中该上游设备对应的第三数据的值由所述第一预设值切换为对应的初始值时,该上游设备获取到该内存块组对应的所述第二数据结构;
当该内存块组对应的所述第一数据域被赋值为对应的初始值时,将该内存块组对应的所述第三数据域中该上游设备对应的第三数据赋值为对应的初始值,并重新尝试将该上游设备的标识写入该内存块组对应的所述第一数据域。
11.根据权利要求10所述的电子组件,一第二数据结构中,一上游设备对应的第二数据在其所在的所述第二数据域中的比特位范围,与该上游设备对应的第三数据在其所在的第三数据域中的比特位范围相同;
所述上游设备,被配置为判断该内存块组对应的各个第二数据和各个第三数据中,是否只有该上游设备对应的第二数据和第三数据彼此不同,包括:
所述上游设备,被配置为读取该内存块组对应的所述第二数据域和所述第三数据域,将读取的所述第二数据域和所述第三数据域进行按位异或,并判断是否只有该上游设备对应的比特位范围的异或结果为1,若是,则该内存块组对应的各个第二数据和各个第三数据中只有该上游设备对应的第二数据和第三数据彼此不同。
12.根据权利要求10所述的电子组件,所述上游设备,被配置为尝试将该上游设备的标识写入该内存块组对应的所述第一数据域,并判断该第一数据域是否成功写入该上游设备的标识,包括:
所述上游设备,被配置为将该内存块组对应的所述第一数据域赋值为该上游设备的标识,并重新读取该内存块组对应的所述第一数据域,判断重新读取的所述第一数据域的值是否等于该上游设备的标识,若是,则该第一数据域成功写入该上游设备的标识,否则,该第一数据域未成功写入该上游设备的标识。
13.根据权利要求10所述的电子组件,所述上游设备,被配置为在对一内存块组的询问结束时,释放该内存块组对应的所述第二数据结构,包括:
所述上游设备,被配置为在对一内存块组的询问结束时,判断该内存块组对应的所述第三数据域的各第三数据的值是否均为对应的初始值;
若是,则将该内存块组对应的所述第一数据域赋值为对应的初始值,将该内存块组对应的所述第二数据域中该上游设备对应的第二数据赋值为对应的初始值,以释放该内存块组对应的所述第二数据结构;
否则,将该内存块组对应的所述第二数据域中该上游设备对应的第二数据赋值为对应的初始值,以释放该内存块组对应的所述第二数据结构,以及从该内存块组对应的所述第三数据域中值为所述第一预设值的第三数据中,选择其一,将被选择的第三数据对应的上游设备的标识写入该内存块组对应的所述第一数据域,将被选择的第三数据赋值为对应的初始值。
14.根据权利要求13所述的电子组件,所述上游设备,被配置为在对一内存块组的询问结束时,判断该内存块组对应的所述第三数据域的各第三数据的值是否均为对应的初始值,包括:
所述上游设备,被配置为在对一内存块组的询问结束时,判断该内存块组对应的所述第一数据域的值是否为该上游设备的标识;
若是,则判断该内存块组对应的所述第三数据域的各第三数据的值是否均为对应的初始值;
否则,将该内存块组对应的所述第二数据域中该上游设备对应的第二数据赋值为对应的初始值,以释放该内存块组对应的所述第二数据结构。
15.根据权利要求13所述的电子组件,所述上游设备,被配置为在对一内存块组的询问结束时,判断该内存块组对应的所述第三数据域的各第三数据的值是否均为对应的初始值,包括:
所述上游设备,被配置为在对一内存块组的询问结束时,判断该内存块组对应的所述第二数据域中该上游设备对应的第二数据的值是否为所述第一预设值,若是,则判断该内存块组对应的所述第三数据域的各第三数据的值是否均为对应的初始值。
16.根据权利要求10所述的电子组件,所述第一数据域的长度、所述第二数据的大小、所述第三数据的大小均为1个字节的整数倍。
17.一种电子设备,包括权利要求1至16中任一项所述的电子组件。
18.一种内存管理方法,应用于上游设备,所述内存包括第一预设数量个内存块,所述第一预设数量个内存块被划分为第二预设数量个内存块组,所述第二预设数量大于等于对应的上游设备的总数量,每个上游设备分别对应一个内存块组;所述方法包括:
所述上游设备在需要占用内存块时,从该上游设备对应的内存块组开始询问,根据当前询问的内存块组对应的第一数据结构,查找空闲状态的内存块进行占用;所述第一数据结构用于记录对应的所述内存块组内的各个内存块的状态信息。
19.根据权利要求18所述的方法,所述上游设备在需要占用内存块时,从该上游设备对应的内存块组开始询问,根据当前询问的内存块组对应的第一数据结构,查找空闲状态的内存块进行占用,包括:
所述上游设备在需要占用内存块时,对该上游设备对应的内存块组进行询问,并根据当前询问的内存块组对应的所述第一数据结构,按照以下方式查找空闲状态的内存块进行占用:
读取当前询问的内存块组对应的所述第一数据结构,并判断当前询问的内存块组对应的所述第一数据结构中是否存在指示空闲状态的第一数据;
若是,则从当前询问的内存块组对应的所述第一数据结构中指示空闲状态的第一数据中选择至少一个第一数据,将所述至少一个第一数据切换为指示非空闲状态,以将当前询问的内存块组中所述至少一个第一数据对应的内存块进行占用;
否则,结束对当前询问的内存块组的询问,并对该内存块组的下一内存块组进行询问。
20.根据权利要求19所述的方法,从当前询问的内存块组对应的所述第一数据结构中指示空闲状态的第一数据中选择至少一个第一数据,将所述至少一个第一数据切换为指示非空闲状态,以将当前询问的内存块组中所述至少一个第一数据对应的内存块进行占用,包括:
从当前询问的内存块组对应的所述第一数据结构中指示空闲状态的第一数据中选择至少一个第一数据,采用原子操作将所述至少一个第一数据切换为指示非空闲状态,以将当前询问的内存块组中所述至少一个第一数据对应的内存块进行占用。
21.根据权利要求18所述的方法, 所述上游设备在需要占用内存块时,从该上游设备对应的内存块组开始询问,根据当前询问的内存块组对应的第一数据结构,查找空闲状态的内存块进行占用,包括:
所述上游设备在需要占用内存块时,从该上游设备对应的内存块组开始询问,在获取到当前询问的内存块组对应的第二数据结构时,根据当前询问的内存块组对应的所述第一数据结构,查找空闲状态的内存块进行占用;所述第二数据结构为对应的所述第一数据结构的自旋锁;
在对一内存块组的询问结束时,释放该内存块组对应的所述第二数据结构。
22.根据权利要求21所述的方法,所述第二数据结构包括第一数据域、第二数据域和第三数据域;第二数据域包括多个第二数据,所述多个第二数据分别对应不同的上游设备,第三数据域包括多个第三数据,所述多个第三数据分别对应不同的上游设备;一第二数据结构中,同一上游设备对应的第二数据和第三数据对应的初始值相同;
所述上游设备按照以下方式获取该上游设备当前询问的内存块组对应的所述第二数据结构:
将该内存块组对应的所述第二数据域读取到第三寄存器,将该内存块组对应的所述第二数据域中该上游设备对应的第二数据赋值为第一预设值,并判断所述第三寄存器的数据中各第二数据的值是否均为对应的初始值;
若是,则尝试将该上游设备的标识写入该内存块组对应的所述第一数据域,并判断该第一数据域是否成功写入该上游设备的标识;
若该第一数据域成功写入该上游设备的标识,则根据该内存块组对应的所述第二数据域和所述第三数据域,判断该内存块组对应的各个第二数据和各个第三数据中,是否只有该上游设备对应的第二数据和第三数据彼此不同,若是,则获取到该内存块组对应的所述第二数据结构,否则,重新判断该第一数据域是否成功写入该上游设备的标识;
若该第一数据域未成功写入该上游设备的标识,则将该内存块组对应的所述第三数据域中该上游设备对应的第三数据赋值为所述第一预设值;
否则,将该内存块组对应的所述第三数据域中该上游设备对应的第三数据赋值为所述第一预设值;
当该内存块组对应的第二数据结构被其它上游设备释放且该内存块组对应的所述第三数据域中至少一第三数据的值为所述第一预设值时,该内存块组对应的所述第三数据域中所述至少一第三数据中的一者被所述其它上游设备赋值为初始值,或,当该内存块组对应的第二数据结构被其它上游设备释放时,该内存块组对应的所述第一数据域被所述其它上游设备赋值为对应的初始值;
当该内存块组对应的所述第三数据域中该上游设备对应的第三数据的值由所述第一预设值切换为对应的初始值时,该上游设备获取到该内存块组对应的所述第二数据结构;
当该内存块组对应的所述第一数据域被赋值为对应的初始值时,将该内存块组对应的所述第三数据域中该上游设备对应的第三数据赋值为对应的初始值,并重新尝试将该上游设备的标识写入该内存块组对应的所述第一数据域。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202410446200.3A CN118069373A (zh) | 2024-04-12 | 2024-04-12 | 电子组件、电子设备及内存管理方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202410446200.3A CN118069373A (zh) | 2024-04-12 | 2024-04-12 | 电子组件、电子设备及内存管理方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN118069373A true CN118069373A (zh) | 2024-05-24 |
Family
ID=91111186
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202410446200.3A Pending CN118069373A (zh) | 2024-04-12 | 2024-04-12 | 电子组件、电子设备及内存管理方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN118069373A (zh) |
Citations (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1963788A (zh) * | 2005-11-08 | 2007-05-16 | 中兴通讯股份有限公司 | 一种内存管理方法 |
CN102253897A (zh) * | 2011-07-26 | 2011-11-23 | 大唐移动通信设备有限公司 | 一种内存池管理方法及装置 |
CN106681829A (zh) * | 2016-12-09 | 2017-05-17 | 上海斐讯数据通信技术有限公司 | 一种内存管理方法及*** |
EP3504628A1 (en) * | 2016-09-28 | 2019-07-03 | Huawei Technologies Co., Ltd. | Memory management method and device |
CN113900829A (zh) * | 2021-12-10 | 2022-01-07 | 深圳比特微电子科技有限公司 | 用于设备的内存管理方法、内存管理设备和计算*** |
CN117033002A (zh) * | 2023-10-09 | 2023-11-10 | 苏州元脑智能科技有限公司 | 一种内存管理方法、装置、设备及存储介质 |
CN117667763A (zh) * | 2023-12-01 | 2024-03-08 | 北斗智谷(北京)安全技术有限公司 | 数据处理方法、装置、电子设备和可读存储介质 |
CN117707994A (zh) * | 2024-02-02 | 2024-03-15 | 北京象帝先计算技术有限公司 | 请求缓冲器、***、组件、设备及传输方法 |
-
2024
- 2024-04-12 CN CN202410446200.3A patent/CN118069373A/zh active Pending
Patent Citations (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1963788A (zh) * | 2005-11-08 | 2007-05-16 | 中兴通讯股份有限公司 | 一种内存管理方法 |
CN102253897A (zh) * | 2011-07-26 | 2011-11-23 | 大唐移动通信设备有限公司 | 一种内存池管理方法及装置 |
EP3504628A1 (en) * | 2016-09-28 | 2019-07-03 | Huawei Technologies Co., Ltd. | Memory management method and device |
CN106681829A (zh) * | 2016-12-09 | 2017-05-17 | 上海斐讯数据通信技术有限公司 | 一种内存管理方法及*** |
CN113900829A (zh) * | 2021-12-10 | 2022-01-07 | 深圳比特微电子科技有限公司 | 用于设备的内存管理方法、内存管理设备和计算*** |
CN117033002A (zh) * | 2023-10-09 | 2023-11-10 | 苏州元脑智能科技有限公司 | 一种内存管理方法、装置、设备及存储介质 |
CN117667763A (zh) * | 2023-12-01 | 2024-03-08 | 北斗智谷(北京)安全技术有限公司 | 数据处理方法、装置、电子设备和可读存储介质 |
CN117707994A (zh) * | 2024-02-02 | 2024-03-15 | 北京象帝先计算技术有限公司 | 请求缓冲器、***、组件、设备及传输方法 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US5295251A (en) | Method of accessing multiple virtual address spaces and computer system | |
US7073044B2 (en) | Method and apparatus for sharing TLB entries | |
US8788543B2 (en) | Scalable, concurrent resizing of hash tables | |
US8453015B2 (en) | Memory allocation for crash dump | |
US6003112A (en) | Memory controller and method for clearing or copying memory utilizing register files to store address information | |
US9852054B2 (en) | Elastic caching for Java virtual machines | |
US7398376B2 (en) | Instructions for ordering execution in pipelined processes | |
US7363434B2 (en) | Method, system, and computer-readable medium for updating memory devices in a multi-processor computer system | |
US20030005073A1 (en) | Signal processing device accessible as memory | |
JPS60221851A (ja) | メモリ・アクセス・コントローラを具えるデータ処理装置 | |
CN112231007B (zh) | 基于用户态与内核态驱动协同处理框架的设备驱动方法 | |
US10430327B2 (en) | Virtual machine based huge page balloon support | |
US6763328B1 (en) | Method and data processing system for emulating virtual memory utilizing threads | |
US6745292B1 (en) | Apparatus and method for selectively allocating cache lines in a partitioned cache shared by multiprocessors | |
WO2008144960A1 (en) | Method and apparatus for mpi program optimization | |
US11307784B2 (en) | Method and apparatus for storing memory attributes | |
US20240220164A1 (en) | Process isolation for a processor-in-memory ("pim") device | |
US7562204B1 (en) | Identifying and relocating relocatable kernel memory allocations in kernel non-relocatable memory | |
CN117311817B (zh) | 一种协处理器控制方法、装置、设备及存储介质 | |
US20050097258A1 (en) | Systems and methods for accessing thread private data | |
CN118069373A (zh) | 电子组件、电子设备及内存管理方法 | |
US8689230B2 (en) | Determination of running status of logical processor | |
US11907115B2 (en) | Indirect interface for virtual machine free page hinting | |
JPS61160160A (ja) | 仮想計算機システムにおけるアドレツシング制御装置 | |
US7627869B2 (en) | Hardware register access via task tag ID |
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 |