CN103077076B - 在Linux上模拟实现Windows堆管理的方法 - Google Patents
在Linux上模拟实现Windows堆管理的方法 Download PDFInfo
- Publication number
- CN103077076B CN103077076B CN201310003729.XA CN201310003729A CN103077076B CN 103077076 B CN103077076 B CN 103077076B CN 201310003729 A CN201310003729 A CN 201310003729A CN 103077076 B CN103077076 B CN 103077076B
- Authority
- CN
- China
- Prior art keywords
- heap
- linux
- space
- memory block
- virtual
- 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.)
- Expired - Fee Related
Links
Landscapes
- Stored Programmes (AREA)
- Memory System Of A Hierarchy Structure (AREA)
Abstract
本发明为一种在Linux上模拟实现Windows堆管理的方法,应用程序初始化时,使用brk命令从Linux虚拟地址中开辟出一块连续空间用作类Windows虚存管理,然后构建数据结构,将应用程序的Windows操作行为转化为Linux操作的表达形式,在Linux上,不可增长堆和可增长堆通过将内存块以链表连接方式来模拟实现,不可增长堆要保留最大大小的空间。本发明方法在Linux上实现了堆的固定地址再分配功能,在不修改Linux内核的情况下,在Linux上重新构建Windows的内存管理机制,实现虚存管理和堆管理,以便使得Windows应用程序可以无缝迁移至Linux操作***上运行。
Description
技术领域
本发明属于应用软件跨平台迁移领域,具体是一种在Linux上模拟实现Windows堆管理的方法。
背景技术
应用程序的运行不能直接访问底层的***资源,它们对***资源的访问都必须遵循操作***所规定的方式,由此可见操作***所扮演的重要角色。不同的操作***由于立足点的不同,因此在设计思想上有着本质的区别,从而导致其在设计架构以及最终实现上所呈现的差异性。这些差异性具体反映在其所规定的***资源访问方式上。因此基于某种特定操作***开发的应用程序往往只能在这种特定的操作***上运行。然而如果能让应用程序摆脱对操作***的依赖,不论从应用程序提供商还是用户来说,这都是非常有意义的。
目前已有的迁移技术大致分为两大类,一类是核内差异核内补,典型的例子是浙大网新提出的“龙井(Longene)”项目,其主要是通过将Linux内核扩充成一个既支持Linux应用也支持Windows应用的兼容内核,使得用户可以直接在Linux操作***上运行Windows应用程序。对内核的修改并不适合商业化的Linux操作***,理由是,Linux商业化过程中,为实现商业目的,或多或少对其中采用的Linux内核进行了修改,再次的改动很难避免与之前改动不发生冲突,亦或使得改动更为复杂,增加改动引入错误的风险,因此限制了它的适用范围;另一类是核内差异核外补,典型的例子是WINE项目,WINE通过WINE服务进程来虚拟Win32进程,而应用程序作为客户端进程,两者之间通过socket和pipe通道,连接相应的动态链接库Winelib,以协作运行。WINE项目实质上是通过操作指令的翻译/转换来弥补Windows和Linux之间的差异,然而两个操作***在***资源访问方式的实现上粒度是不一样的,因此操作指令的翻译/转换在很大范围内难以保持一致。这两种方式都有其一定局限性,需要尝试通过对机制的重新构建来解决应用程序跨平台迁移问题。
内存管理是应用程序跨平台迁移中极为重要的一部分,因为几乎每一个应用程序都要涉及到内存操作。在Windows中,内存管理强调了虚存管理和堆管理的两层结构,而在Linux中却并没有突出这一点。并且Linux中不能通过其堆管理的***调用实现Windows的“堆的固定地址再分配”的功能。因此用Linux的现有机制不能完全实现Windows的内存管理机制。
发明内容
本发明要解决的技术问题是:如何在不修改Linux内核的情况下,在Linux上重新构建Windows的内存管理机制,实现虚存管理和堆管理。针对该问题,本发明提供了一种在Linux上模拟实现Windows堆管理的方法。
本发明提供的一种在Linux上模拟实现Windows堆管理的方法,具体步骤如下:
步骤一:应用程序初始化时,使用brk命令从Linux虚拟地址中开辟出一块大小为dwSize的连续空间,用作类Windows虚存管理,并记录该空间的起始地址,设置从起始地址开始每页的状态、每页的访问权限以及锁定状态;
步骤二:构建数据结构,用于将用户需求的Windows操作行为转化为Linux操作的表达形式;
步骤三:对于堆操作,判断堆的类型,若为不可增长堆,转入步骤四;若为可增长堆,转入步骤五;在Linux上,不可增长堆和可增长堆通过将内存块以链表连接方式来模拟实现;
步骤四:堆保留最大大小的空间,提交初始大小的空间进行分配。当初始大小的空间消耗完时,转入步骤六;
步骤五:堆提交初始大小的空间进行分配,当初始大小的空间消耗完时,转入步骤七;
步骤六:堆从保留的空间中继续提交一段页面来满足分配需求,直到所保留的空间不能满足分配需求为止;
步骤七:***通过VirtualAlloc()另辟新的空间来满足分配需求,直到***内存不能满足分配需求为止。
步骤四和步骤五中进行空间按分配时,在Linux上实现了堆的固定地址再分配,步骤是:
步骤11:获取指定的内存块的起始地址,标记该内存块为b1;
步骤12:判断内存块b1是否满足再分配所需空间的大小,若不满足,转入步骤13;否则,转入步骤15;
步骤13:在堆中寻找空闲块,当寻找到一个空闲块时,进行步骤14;
步骤14:判断寻找到的所有空闲块与内存块b1的大小之和是否满足再分配所需空间的大小,若不满足,转入步骤13,继续寻找下一个空闲块;若满足,转入步骤15;
步骤15:合并内存块b1与所有寻找到的空闲块;
步骤16:分割出用于再分配的内存块,所分割的内存块的起始地址为内存块b1的起始地址。
本发明的优点与积极效果在于:
(1)在应用程序初始化时从虚拟地址中开辟出一块连续的空间作为“类Windows虚存管理空间”,限定了应用程序的内存访问范围,与虚拟地址中其它空间之间不相互影响;
(2)构建关键数据结构,用于Windows的操作行为转化为Linux的表达形式,以便使得Windows应用程序可以无缝迁移至Linux操作***上运行;
(3)在Linux上分别实现了Windows的可增长堆管理和不可增长堆管理,实现了相应的堆创建、堆分配、堆销毁以及堆再分配等功能,以便使得Windows应用程序可以无缝迁移至Linux操作***上运行;
(4)解决了Linux中不能通过堆管理的***调用实现Windows的“堆的固定地址再分配”功能的问题;
(5)本发明方法在Linux平台上模拟实现Windows的虚存管理和堆管理,在功能一致的基础上保证了原理一致,有效地满足了Windows应用程序至Linux上源代码级的无缝迁移的要求。
附图说明
图1是本发明提供的在Linux上模拟实现Windows堆管理的方法的步骤流程图;
图2是类Windows虚存管理实现的示意图;
图3是为类Windows不可增长堆和可增长堆的管理实现示意图;
图4是在Linux上实现堆的固定地址再分配的流程图。
具体实施方式
下面将结合附图和实施例对本发明作进一步的详细说明。
本发明提出了一种在Linux上模拟实现Windows堆管理的方法,用以在不修改Linux内核的前提下,实现对Windows虚存管理和堆管理的模拟,使得Windows应用程序可以无缝迁移至Linux操作***上运行,扩大应用程序的适用范围。本发明方法包括两部分,第一部分是Windows虚存管理在Linux上的模拟实现。思路是在Linux虚拟地址中开辟出一块连续的空间作为“类Windows虚存管理”的范围。本发明方法在程序初始化时使用brk命令留出一大块新的空间,然后所有的虚存管理函数只在这片新空间上进行操作。第二部分是Windows堆管理在Linux上的模拟实现,堆管理的实现是建立在虚存管理之上的。思路是将内存块通过链表链接,对于Windows的不可增长堆,所有分配和未分配的页面都位于堆初始地址之后同一段连续的页面之中。堆提交初始大小空间,保留最大大小空间。随着堆空间的分配,当初始大小的提交页面用完后,堆继续提交一段页面来满足分配需求,直到保留页面不能满足分配需求。对于Windows的可增长堆,保留并提交初始大小的页面。当这些页面不能满足分配需求时,则通过虚存管理(使用VirtualAlloc)另寻一块空间来满足分配需求,直到***内存不能满足分配需求。
如图1所示,本发明提供的在Linux上模拟实现Windows堆管理的方法,具体实现步骤如下。
步骤一:应用程序初始化时,使用“brk”命令从Linux虚拟地址中专门开辟出一块大小为dwSize的连续空间,用作“类Windows虚存管理”。dwSize的值可根据需求灵活指定。
在Windows中,进程的虚拟内存按照页大小来划分,每一页有空闲(free)、保留(reserved)和提交(committed)三种状态。空闲的页面可以再分配作为它用(例如作为堆的空间),不能被访问;保留的页面不能再分配作为它用,也不能访问;提交的页面是由保留的页面分配得来,用户可以按预定方式访问。空闲状态可以转变为保留状态,保留状态可以转变为提交状态,其他转变均不允许。Windows的虚存管理可以对虚拟内存进行分配,释放,保护,锁定等操作。
在Linux上,为实现类Windows虚存管理,首先使用brk从起始地址指向处开辟一片指定大小连续的空间,然后,将空间按照指定页面大小分成页面,从起始地址开始设置每页的状态,如图2所示,页面状态为提交、保留或空闲,设置每个页面的访问权限以及锁定状态,图2中R表示访问权限是读,W表示访问权限是写。空闲的和保留的页面在Linux中会被设置为PROT_NONE(N/A),以拒绝任何访问。提交的页面会将用户需求的访问权限转化为Linux的表达形式,再通过命令mprotect进行设置。
步骤二:构建数据结构,用于将用户需求的应用程序的Windows操作行为转化为Linux操作的表达形式。所构建的数据结构中实现应用进程在Linux上的***资源调用的关键数据结构包括如下内容:总虚拟页面数TOTAL_VIRTUAL_PAGES;用作类Windows虚存管理的页面数MAXIMUM_VIRTUAL_PAGES;***页大小PageSize;类Windows虚存管理的起始地址Base;从起始地址Base开始每页的状态MemoryState[TOTAL_VIRTUAL_PAGES];从起始地址开始每页保留操作的信息AllocSize[TOTAL_VIRTUAL_PAGES];从起始地址开始每页的访问权限Protection[TOTAL_VIRTUAL_PAGES];从起始位置开始每页的锁定状态Locked[TOTAL_VIRTUAL_PAGES]。
具体构建的应用程序在Linux上实现***资源调用的关键数据结构如下:
#define TOTAL_VIRTUAL_PAGES1048576//进程总虚拟页面数
#define MAXIMUM_VIRTUAL_PAGES131072//用作类Windows虚存管理的页面数
DWORD PageSize;//***页大小,例如设定每页为4KB
LPVOID Base;//“类Windows虚存管理”的起始地址
char MemoryState[TOTAL_VIRTUAL_PAGES]//从起始地址开始每页的状态
SIZE_T AllocSize[TOTAL_VIRTUAL_PAGES]//从起始地址开始每页保留操作的信息
DWORD Protection[TOTAL_VIRTUAL_PAGES]//从起始地址开始每页的访问权限
char Locked[TOTAL_VIRTUAL_PAGES]//从起始地址开始每页的锁定状态。
DWORD、LPVOID、char和SIZE_T都为一种数据类型,分别表示双字节、无类型的指针、字符以及用来记录大小的整数。
步骤三:对于堆操作,判断堆的类型,若为不可增长堆,转入步骤四;若为可增长堆,转入步骤五。
步骤四:堆提交初始大小的空间,保留最大大小的空间。堆首先分配初始大小的空间,当初始大小空间消耗完后,转入步骤六。
Windows中,堆管理是建立在虚存管理之上的,因为堆是一段保留或提交的页面。然而堆管理又不同于虚存管理,因为它需要有控制模块和内存块链表等数据结构,分配的内存块之间通过链表连接,这是虚存管理所没有的。在Windows中,堆分为可增长堆和不可增长堆。可增长堆有初始大小,没有最大大小的限制。而不可增长堆有初始大小和最大大小,并且试图使堆超过最大大小的分配将失败。堆上的操作包括创建、分配、释放、销毁和再分配。其中堆的再分配可以要求内存块的起始地址不变(默认可变),但这是Linux堆管理无法实现的。
在Linux上,通过将内存块以链表连接来模拟实现堆管理机制。如图3所示,对于不可增长堆的模拟,所有分配和未分配的页面都位于堆初始地址之后同一段连续的页面之中。堆提交初始大小的空间,保留最大大小的空间。随着堆空间的不断分配,初始提交的页面将用完,这时,堆继续从保留空间中提交一部分页面来满足分配需求,直到保留空间不能满足分配需求。对于可增长堆的模拟,只保留并提交初始大小的空间。当初始空间不能满足分配需求时,Linux***通过虚存管理命令VirtualAlloc()另辟空间来满足分配需求,因此堆空间可能不是连续的,直到***内存不能满足分配需求为止。
图3中,标记为H1的部分表示堆的头部;标记为H2的部分表示内存块的头部;标记为B的部分表示内存块。
堆内各内存块的头部的数据结构如下:
struct_HEAP_BLOCK_HEAD表示为内存块头部的数据结构;*PreBlock表示指向前一个内存块的指针;*NextBlock表示指向下一个内存块的指针;Size1表示内存块可用大小;Free表示是否是空闲块。
堆的头部的数据结构如下:
堆头部的数据结构中包含堆的第一个内存块的指针,为堆保留的内存大小Size2,堆的最大大小MaximumSize,用于表明是可增长堆还是不可增长堆的标记Growable,以及表明是否能在堆内运行代码的标记Executable。
此外,本发明实现堆管理时,还定义了如下堆的数据:
#define MAXIMUM_HEAPS R//最大堆数目,具体数目R可自定义,例如为32
int HeapNum;//当前堆数量
HANDLE HeapHandle[MAXIMUM_HEAPS];//每个堆的句柄
其中,R表示整数;HANDLE表示句柄数据类型;MAXIMUM_HEAPS表示最大堆数目;HeapNum表示当前堆数量;HeapHandle[MAXIMUM_HEAPS]中记录每个堆的句柄。
定义的数据结构中,不仅每个堆,而且堆中的每个内存块都有头部,通过头部来记录相关信息。所有内存块通过链表链接。堆的内存块信息中,Free是极为重要的字段,表示是否是空闲块。初始化时,堆中所有提交的页面都是在一个空闲块中。当堆分配时,就需要分割空闲块,以满足空间的分配需求。堆释放和再分配时需要合并空闲块。因此,该块是否是空闲块是释放进行分配、释放和再分配等操作的依据。
本发明提供了堆的固定地址再分配的方法,如图4所示,具体通过如下步骤实现:
步骤11:获取指定的内存块的起始地址,标记该内存块为b1;
步骤12:判断内存块b1是否满足再分配所需空间的大小,若不满足,转入步骤13;否则,转入步骤15;
步骤13:在堆中寻找空闲块,当寻找到一个空闲块时,进行步骤14;
步骤14:判断寻找到的所有空闲块与内存块b1的大小之和是否满足再分配所需空间的大小,若不满足,转入步骤13,继续寻找下一个空闲块;若满足,转入步骤15;
步骤15:合并内存块b1与所有寻找到的空闲块;
步骤16:分割出用于再分配的内存块,所分割的内存块的起始地址为内存块b1的起始地址。
步骤五:堆仅提交初始大小的空间,若初始大小空间消耗完,转入步骤七。
步骤六:堆从保留的空间中继续提交一段页面来满足分配需求,直到所保留的空间不能满足分配需求为止。
步骤七:***通过VirtualAlloc()另辟新的空间来满足分配需求,直到***内存不能满足分配需求为止。
实施例:
本发明所提供的堆管理方法在具体实现中起到适配层的作用,将本发明的堆管理方法用C++或C语言实现,然后windows应用程序在Linux上运行时,调用该方法,实现在Linux上的资源调用,然后进行如下步骤。
Step1:创建初始大小为10000字节的可增长堆h1,以及初始大小为10000字节,最大大小为100000字节不可增长堆h2。
Step2:尝试在堆h2中分配一段1000000字节的空间,输出是否分配成功(第一次输出)。
Step3:在堆h1中分配一段100字节的空间,首地址为a1,并将地址a1起100字节的空间填充字符’a’,遍历地址a1起的空间,对于每一个字节,输出其内容(第二次输出)。
Step4:在堆h1中分配一段1000000字节的空间,首地址为a2,输出地址a1,a2(第三次输出)。
Step5:在堆h2中分配一段100字节的空间,首地址为a1;再分配一段100字节的空间,首地址为a2;再分配一段100字节的空间,首地址为a3;再分配一段100字节的空间,首地址为a4;再分配一段30000字节的空间,首地址为a5;输出地址a1,a2,a3,a4,a5(第四次输出)。
Step6:输出首地址为a1的内存块的大小(第五次输出)。
Step7:将地址a4起的100字节的空间填充字符a。
Step8:释放堆h2中的首地址为a2的内存块;释放堆h2中的首地址为a3的内存块。
Step9:尝试将堆h2中首地址为a1的内存块的大小改为1000字节,并且首地址不变。输出再分配是否成功(第六次输出)。
Step10:尝试将堆h2中首地址为a1的内存块的大小改为250字节,并且首地址不变。输出再分配后的内存块首地址(第七次输出)。
Step11:再次输出堆h2中首地址为a1的内存块的大小(第八次输出)。
Step12:尝试将堆h2中首地址为a4的内存块的大小改为30000字节,输出再分配后的内存块首地址(第九次输出)。
Step13:遍历地址a4起的空间,对于每一个字节,输出其内容(第十次输出)。
Step14:销毁堆h2,尝试再次读已经销毁的堆中的内存块(第十一次输出)。
结果分析:
(1)Windows应用程序在Linux下编译成功。
(2)第一次输出为“Large Allocation in Non-growable heap Test:0”,说明在不可增长堆中分配超过最大大小的内存块,分配操作失败。
(3)第二次输出“aaaaaaaaaaaaa….”,说明堆中的内存块的分配成功。
(4)第三次输出“a1=167219232a2=167452688”,其中地址a1和地址a2相差远大于100,说明了可增长堆中分配将使其超过初始大小的内存块确实会调用虚存管理来保留和提交另一段新的空间。
(5)第四次输出“a1=167350304a2=167350424a3=167350544a4=167350664a5=167362576”,其中地址a4和地址a5相差远大于100,说明不可增长堆中分配超过初始大小的内存块确实会调用虚存管理来提交新的保留的空间。
(6)第五次输出“Block a1Size:104”,内存块大小获取成功,104说明堆中的内存块大小是按8字节对齐的。
(7)第六次输出“Heap Reallocation Test1:0”,这是堆的固定地址再分配失败的一种典型情况。Step5中a1空间为100字节,Step8中释放a2、a3的空间同样为100字节,加起来是300字节,a4空间已经使用,释放前不能再分配,1000字节大于300字节,故会失败。
(8)第七次输出“Heap Reallocation Test2:167350304”,这是堆的固定地址再分配成功的一种典型情况。同时也说明堆的内存块(堆h2中首地址为a2,a3的内存块)的释放成功。
(9)第八次输出“Block a1Size:256”,说明首地址为a1的内存块的大小被改变。
(10)第九次输出“Heap Reallocation Test3:167395360”,其中a4的再分配地址和原本地址相差巨大。说明堆的可变地址再分配确实是通过分配另一个新的内存块来实现的。
(11)第十次输出“aaaaa…”,说明在可变地址再分配中,新分配的内存块复制了原块的数据。
(12)第十一次输出“段错误”,说明堆被销毁时其所持有的页面被释放。
通过实施例可知,通过使用本发明方法,不需要修改Windows应用程序以及Linux内核,就能够实现Windows应用程序在Linux上的资源调用,使得Windows应用程序可以无缝迁移至Linux操作***上运行。
Claims (3)
1.一种在Linux上模拟实现Windows堆管理的方法,其特征在于,包括如下步骤:
步骤一:应用程序初始化时,使用brk命令从Linux虚拟地址中开辟出一块大小为dwSize的连续空间,用作类Windows虚存管理,并记录该空间的起始地址,设置从起始地址开始每页的状态、每页的访问权限以及锁定状态;brk命令的功能是改变数据段空间分配;dwSize表示所要开辟的连续空间的大小;
步骤二:构建数据结构,将应用程序的Windows操作行为转化为Linux操作的表达形式;
步骤三:对于堆操作,判断堆的类型,若为不可增长堆,转入步骤四;若为可增长堆,转入步骤五;Linux上不可增长堆和可增长堆通过将内存块以链表连接方式来模拟实现;
步骤四:堆保留最大大小的空间,提交初始大小的空间进行分配,当初始大小的空间消耗完时,转入步骤六;
步骤五:堆提交初始大小的空间进行分配,当初始大小的空间消耗完时,转入步骤七;
步骤六:堆从保留的空间中继续提交一段页面来满足分配需求,直到所保留的空间不能满足分配需求为止;
步骤七:***通过VirtualAlloc()另辟新的空间来满足分配需求,直到***内存不能满足分配需求为止;VirtualAlloc()为Windows API函数,功能是在调用进程的虚地址空间,预定或者提交一部分页;
步骤四和步骤五中进行空间按分配时,在Linux上实现了堆的固定地址再分配,步骤是:
步骤11:获取指定的内存块的起始地址,标记该内存块为a1;
步骤12:判断内存块a1是否满足再分配所需空间的大小,若不满足,转入步骤13;否则,转入步骤15;
步骤13:在堆中寻找空闲块,当寻找到一个空闲块时,进行步骤14;
步骤14:判断寻找到的所有空闲块与内存块a1的大小之和是否满足再分配所需空间的大小,若不满足,转入步骤13,继续寻找下一个空闲块;若满足,转入步骤15;
步骤15:合并内存块a1与所有寻找到的空闲块;
步骤16:分割出用于再分配的内存块,所分割的内存块的起始地址为内存块a1的起始地址。
2.根据权利要求1所述的在Linux上模拟实现Windows堆管理的方法,其特征在于,所述的步骤二中构建的数据结构中,实现应用程序在Linux上的***资源调用的关键数据结构中定义了如下内容:进程总虚拟页面数TOTAL_VIRTUAL_PAGES;用作类Windows虚存管理的页面数MAXIMUM_VIRTUAL_PAGES;***页大小PageSize;类Windows虚存管理的起始地址Base;从起始地址Base开始每页的状态MemoryState[TOTAL_VIRTUAL_PAGES];从起始地址开始每页保留操作的信息AllocSize[TOTAL_VIRTUAL_PAGES];从起始地址开始每页的访问权限Protection[TOTAL_VIRTUAL_PAGES];从起始位置开始每页的锁定状态Locked[TOTAL_VIRTUAL_PAGES]。
3.根据权利要求1所述的在Linux上模拟实现Windows堆管理的方法,其特征在于,所述的步骤三中不可增长堆和可增长堆通过将内存块以链表连接方式来模拟实现,具体每个堆都具有一个堆头部,堆内每个内存块都具有一个内存块头部;
内存块头部的数据结构如下:
其中,struct_HEAP_BLOCK_HEAD表示为内存块头部的数据结构;DWORD表示双字节数据类型;char表示字符数据类型;*PreBlock表示指向前一个内存块的指针;*NextBlock表示指向下一个内存块的指针;Size1表示内存块可用大小;Free表示是否是空闲块;
堆头部的数据结构如下:
其中,struct_HEAP_HEAD表示堆头部的数据结构;*FirstBlock表示指向堆的第一个内存块的指针;Size2表示为堆保留的内存大小;MaximumSize表示堆的最大大小;Growable表示是可增长堆还是不可增长堆,Executable表示是否能在堆中运行代码;
此外,堆管理中还定义了堆的最大堆数目和当前堆数量:
#define MAXIMUM_HEAPS R
int HeapNum;
HANDLE HeapHandle[MAXIMUM_HEAPS];
其中,R表示整数;HANDLE表示句柄数据类型;MAXIMUM_HEAPS表示最大堆数目;HeapNum表示当前堆数量;HeapHandle[MAXIMUM_HEAPS]中记录每个堆的句柄。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201310003729.XA CN103077076B (zh) | 2013-01-06 | 2013-01-06 | 在Linux上模拟实现Windows堆管理的方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201310003729.XA CN103077076B (zh) | 2013-01-06 | 2013-01-06 | 在Linux上模拟实现Windows堆管理的方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN103077076A CN103077076A (zh) | 2013-05-01 |
CN103077076B true CN103077076B (zh) | 2015-10-28 |
Family
ID=48153613
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201310003729.XA Expired - Fee Related CN103077076B (zh) | 2013-01-06 | 2013-01-06 | 在Linux上模拟实现Windows堆管理的方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN103077076B (zh) |
Families Citing this family (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106371809B (zh) * | 2016-08-31 | 2019-03-01 | 北京奇虎科技有限公司 | 线程处理器及线程处理方法 |
CN113535287B (zh) * | 2020-04-17 | 2022-12-13 | 中标软件有限公司 | 一种Linux操作***桌面环境窗口自动排列的方法 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
EP2255281A1 (en) * | 2008-01-31 | 2010-12-01 | Adaptive Computing Enterprises, Inc. | System and method for managing a hybrid compute environment |
CN102455938A (zh) * | 2011-11-16 | 2012-05-16 | 中标软件有限公司 | 一种在mips版本的linux操作***上运行windows应用软件的方法 |
-
2013
- 2013-01-06 CN CN201310003729.XA patent/CN103077076B/zh not_active Expired - Fee Related
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
EP2255281A1 (en) * | 2008-01-31 | 2010-12-01 | Adaptive Computing Enterprises, Inc. | System and method for managing a hybrid compute environment |
CN102455938A (zh) * | 2011-11-16 | 2012-05-16 | 中标软件有限公司 | 一种在mips版本的linux操作***上运行windows应用软件的方法 |
Non-Patent Citations (2)
Title |
---|
Linux***下内存分配原理的研究;刘彦华 等;《连云港职业技术学院学报》;20101231;第23卷(第4期);20-21 * |
Windows下堆内存管理机制研究;胡兆阳 等;《计算机工程与应用》;20050915;第41卷(第17期);59-64 * |
Also Published As
Publication number | Publication date |
---|---|
CN103077076A (zh) | 2013-05-01 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN102541619B (zh) | 虚拟机管理装置和方法 | |
US9213623B2 (en) | Memory allocation with identification of requesting loadable kernel module | |
US8285967B1 (en) | Method for on-demand block map generation for direct mapped LUN | |
JP5435763B2 (ja) | 記憶装置システムの論理ブロックアドレス割り当て解除管理およびデータハードニング | |
US8176294B2 (en) | Reducing storage expansion of a virtual machine operating system | |
KR101591550B1 (ko) | 가상 디스크를 포함하는 컴퓨터의 복구 | |
Kadekodi et al. | WineFS: a hugepage-aware file system for persistent memory that ages gracefully | |
US6643753B2 (en) | Methods and systems for managing heap creation and allocation | |
US7882198B2 (en) | Shared JAVA JAR files | |
CN101645045B (zh) | 用于使用透明页变换来管理存储器的方法和*** | |
US20140143220A1 (en) | Striping files across nodes of a distributed file system | |
CN107479922A (zh) | 一种闪存数据管理方法、装置及计算机可读存储介质 | |
US11199972B2 (en) | Information processing system and volume allocation method | |
CN108932170A (zh) | 一种同驻虚拟机间高效共享内存文件***的机制 | |
CN105243025A (zh) | 一种映射表的形成及加载方法、电子设备 | |
US11016886B2 (en) | Multi-ring shared, traversable, and dynamic advanced database | |
WO2024099448A1 (zh) | 内存释放、内存恢复方法、装置、计算机设备及存储介质 | |
WO2021080774A1 (en) | Construction of a block device | |
US11409451B2 (en) | Systems, methods, and storage media for using the otherwise-unutilized storage space on a storage device | |
CN103077076B (zh) | 在Linux上模拟实现Windows堆管理的方法 | |
CN109358818B (zh) | 一种数据中心的块设备io请求处理方法 | |
WO2021080785A1 (en) | Construction of a block device | |
US20220276889A1 (en) | Non fragmenting memory ballooning | |
US11354233B2 (en) | Method and system for facilitating fast crash recovery in a storage device | |
Sun et al. | Breaking apart the {VFS} for managing file systems |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant | ||
CF01 | Termination of patent right due to non-payment of annual fee | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20151028 Termination date: 20200106 |