当前位置:首页>正文

内存分配方式有哪些 内存分配是什么意思windows中的内存分配方式有哪些

2023-04-16 10:54:01 互联网 未知

内存分配方式有哪些

[1]从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。
[2]在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。
[3]从堆上分配,亦称动态内存分配。动态内存的生存期由程序员决定,使用非常灵活,但如果在堆上分配了空间,就有责任回收它,否则运行的程序会出现内存泄漏,频繁地分配和释放不同大小的堆空间将会产生堆内碎块。

内存分配是什么意思?windows中的内存分配方式有哪些?

1.Win32的堆分配函数
每一个进程都可以使用堆分配函数创建一个私有的堆──调用进程地址空间的一个或者多个页面。DLL创建的私有堆必定在调用DLL的进程的地址空间内,只能被调用进程访问。
HeapCreate用来创建堆;HeapAlloc用来从堆中分配一定数量的空间,HeapAlloc分配的内存是不能移动的;HeapSize可以确定从堆中分配的空间的大小;HeapFree用来释放从堆中分配的空间;HeapDestroy销毁创建的堆。

2.Windows传统的全局或者局部内存分配函数
由于Win32采用平面内存结构模式,Win32下的全局和局部内存函数除了名字不同外,其他完全相同。任一函数都可以用来分配任意大小的内存(仅仅受可用物理内存的限制)。用法可以和Win16下基本一样。
Win32下保留这类函数保证了和Win16的兼容,所以不建议再使用了。

3.C语言的标准内存分配函数
C语言的标准内存分配函数包括以下函数:。
malloc,calloc,realloc,free,等。
这些函数最后都映射成堆API函数,所以,malloc分配的内存是不能移动的。这些函数的调式版本为malloc_dbg,calloc_dbg,realloc_dbg,free_dbg,等。

4.Win32的虚拟内存分配函数
虚拟内存API是其他API的基础。new->malloc->HeapAlloc->VirtualAlloc->驱动程序的_PageAlloc。
虚拟内存API以页为最小分配单位,X86上页长度为4KB,可以用GetSystemInfo函数提取页长度。
虚拟内存分配函数包括以下函数:
LPVOID VirtualAlloc(
LPVOID lpvAddress,
DWORD cbSize,
DWORD fdwAllocationType,
DWORD fdwProtect)
该函数用来分配一定范围的虚拟页。
参数1指定起始地址;
参数2指定分配内存的长度;
参数3指定分配方式,取值MEM_COMMINT或者MEM_RESERVE;
参数4指定控制访问本次分配的内存的标识,取值为PAGE_READONLY、PAGE_READWRITE或者PAGE_NOACCESS。

LPVOID VirtualAllocEx(
HANDLE process,
LPVOID lpvAddress,
DWORD cbSize,
DWORD fdwAllocationType,
DWORD fdwProtect)
该函数功能类似于VirtualAlloc,但是允许指定进程process。VirtaulFree、VirtualProtect、VirtualQuery都有对应的扩展函数。

BOOL VirtualFree(
LPVOID lpvAddress,
DWORD dwSize,
DWORD dwFreeType)
该函数用来回收或者释放分配的虚拟内存。
参数1指定希望回收或者释放内存的基地址;
如果是回收,参数2可以指向虚 拟地址范围内的任何地方,如果是释放,参数2必须是VirtualAlloc返回的地址;
参数3指定是否释放或者回收内存,取值为MEM_DECOMMINT或者MEM_RELEASE。

BOOL VirtualProtect(
LPVOID lpvAddress,
DWORD cbSize,
DWORD fdwNewProtect,
PDWORD pfdwOldProtect)
该函数用来把已经分配的页改变成保护页。
参数1指定分配页的基地址;
参数2指定保护页的长度;
参数3指定页的保护属性,取值PAGE_READ、PAGE_WRITE、PAGE_READWRITE等等;
参数4用来返回原来的保护属性。

DWORD VirtualQuery(
LPCVOID lpAddress,
PMEMORY_BASIC_INFORMATION lpBuffer,
DWORD dwLength
)
该函数用来查询内存中指定页的特性。
参数1指向希望查询的虚拟地址;
参数2是指向内存基本信息结构的指针;
参数3指定查询的长度。

BOOL VirtualLock(
LPVOID lpAddress,
DWORD dwSize)
该函数用来锁定内存,锁定的内存页不能交换到页文件。
参数1指定要锁定内存的起始地址;
参数2指定锁定的长度。

BOOL VirtualUnLock(
LPVOID lpAddress,
DWORD dwSize)
参数1指定要解锁的内存的起始地址;
参数2指定要解锁的内存的长度。

摘自 落日小屋

c 内存分配函数有哪些

C 本身并没有真正意义上的内存分配函数,只有new运算符。直接申请内存的C标准库函数有malloc calloc realloc posix_memalign aligned_alloc。另外还有一个在栈里申请内存的alloca

程序的内存分配

一个由c/C 编译的程序占用的内存分为以下几个部分
1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。
3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放
4、文字常量区 —常量字符串就是放在这里的。 程序结束后由系统释放
5、程序代码区—存放函数体的二进制代码。

电脑内存怎样分配喃?

一般情况C盘属于系统盘,里面的空间都是留着更新、升级系统和各类驱动程序的,C盘中一般不存放各类应用软件、视频、音乐、游戏等。之后的D,E,F你可以根据自己的喜好存放各种文件。通常把一类的东西存放在同一个盘中,这样方便自己存储和管理

SQL服务器内存怎么动态分配

SQL服务器内存有两种基本管理方法:动态分配和静态分配

控制程序可使用的内存数量。动态分配允许管理员声明一块内存的大小;考虑到它的实际使用,SQL服务器可以分配给其需要占用的内存的最大值,并且(理论上)在没有使用内存的情况下将其释放。静态分配则是创建一块固定的内存空间,提供给SQL Server使用——不再进行分配。

在默认情况下,SQL Server被设置成动态分配,分配给其正在运行的计算机内所有可用的物理内存。许多管理员注意到SQL Server内存随时间的流逝被逐渐消耗殆尽时,其原因很可能是故障或是内存漏洞,但这个程序正是被设计成这样的。SQL Server就是要在任何可能的情况下在电脑中运行,并因此为达到其最佳性能而使用所有可用的内存。如果SQL Server在独立的机器中运行,那么就让它分配和释放其需要的内存吧。

在一个小型商业服务器机器中,SQL可能与其他程序,如IIS,同时运行,管理员或许尝试着进行设置,使SQL Server运行在一块固定大小的内存,目的是控制其不会占用用于共享的内存。但这并不一定能如愿以偿。一方面,将内存的最高限度设置得太低,并且没有分配给SQL服务器足够的可用内存来用作类似事务日志或查询执行的缓存,所有这些都很难办到。使SQL服务器得到执行操作所需内存的惟一方法就是换出其他的页面,这是个缓慢的过程。

有许多方法可以计算出最好的内存分配。如果你有可预知的用户负载,依照用户所需的最大数目分配给他们。微软推荐至少用4 MB用作动态的最大空间,这已经成为一个可能的规则。如果你的用户负载变化范围很大——如以下情况,当你通过IIS 的前端连接到公共的因特网来支持你的数据库服务的时候——实时的统计数据将会比仅凭猜测所作的工作帮助更大。在高峰期,把SQL Server的高速缓存命中率和每秒缺页率等性能数字搜集起来。如果这些数据表明SQL Server正在做大量的交换,那么增加最大内存空间直到交换逐渐减少。每秒一次或更多次的交换是有坏处的。

另一种选择是使“为SQL Server预留物理内存”的选项可用,这可以防止SQL Server把已经分配给它的内存换出,即使当其他应用程序能够使用它时。这可以叫做是一把双刃剑:它既可以相当大程度的提高性能,也可能带来更大的性能损害。在有许多RAM 可以共享的(1 GB 或更多)的系统中,这是值得一试的,但是当有其他关键的进程可能突然需要大量的内存时,这种办法是不应该使用的。(并且如果需要的话,SQL Server可能会被迫放弃一些它自己的内存)。如果SQL Server是在独立的机器上运行,用这种办法最佳化性能则是值得的。