gpt4 book ai didi

windows - 内存分配与交换(在 Windows 下)

转载 作者:可可西里 更新时间:2023-11-01 09:56:23 26 4
gpt4 key购买 nike

对不起,我的问题比较笼统,但我找不到明确的答案:

假设我有剩余的空闲交换内存,并且我以合理的 block (~1MB) 分配内存 -> 内存分配仍然会因为任何原因而失败吗?

最佳答案

聪明人的回答是“是的,内存分配可能因任何原因而失败”。这可能不是您要找的。

一般来说,你的系统是否有空闲内存剩余与分配是否成功无关。相反,问题是您的进程地址空间是否有可用的 virtual address space .

分配器(malloc , operator new , ...)首先查看当前进程中是否有空闲地址空间已经被映射,也就是说,内核知​​道地址应该可用。如果有,该地址空间将保留在分配器中并返回。

否则,要求内核将新的地址空间映射到进程。这可能会失败,但通常不会,因为映射并不意味着使用物理内存——它只是一个 promise ,如果有人试图访问这个地址,内核将尝试找到物理内存内存并设置 MMU 表,以便虚拟->物理转换找到它。

当系统内存不足时,没有剩余的物理内存,进程被挂起,内核试图通过将其他进程的内存移动到磁盘来释放物理内存。应用程序没有注意到这一点,除了执行单个汇编程序指令显然花费了很长时间。

如果没有足够大的映射空闲区域并且内核拒绝建立映射,进程中的内存分配将失败。例如,并非所有虚拟地址都可用,因为大多数操作系统将内核映射到某个地址(通常是 0x80000000、0xc0000000、0xe0000000 或 32 位架构上的类似地址),因此每个进程的限制可能低于系统限制(例如,Windows 上的 32 位进程只能分配 2 GB,即使系统是 64 位)。文件映射(例如程序本身和 DLL)进一步减少了可用空间。

关于windows - 内存分配与交换(在 Windows 下),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8213240/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com