当在堆上请求大块内存时,如果RAM上连续space不可用,是否在磁盘上分配(交换)?
When a large block of memory is requested on the heap, if contiguous space is not available on the RAM, is it allocated on the disk(swap)?
在Linux中,当请求内存时(使用calloc / malloc
),如果请求大小的连续块不可用,内核是否将多个独立的内存块映射到一个虚拟块中并将其交给应用程序还是分配在磁盘上?
如果它是在磁盘上分配的,当有足够大的块可用时,它是自动移动到 RAM 还是在磁盘上终生存在?
在所有支持 OS 的虚拟内存中,现在所有内核都使用不同策略的池来管理内存。
处理器向程序保证内存的存在达到处理器的标称寻址能力,或者更少,具体取决于规格。所以你可以为OS分配最大合法内存量的内存。
使用的资源是安装在系统中的物理内存和磁盘存储。
根据程序请求,MM(内存管理器)分配虚拟space:OS创建描述请求内存的数据结构(一般称为创建分页目录),但是没有分配 real 内存。下一阶段称为 commitment,您在尝试 access 之前分配的内存时进入此阶段。如果有可用的物理内存,则 MM 通过尝试访问内存时产生的异常调用,提交 实际内存页面,将它们的地址插入页面目录,然后控制流回用户代码。现在记忆存在了!
如果我们尝试访问内存未分配?这是生成异常的无效内存访问的情况,在 Linux 段错误中。
回到物理内存承诺,如果没有更多的物理内存可用怎么办? MM使用不同的算法寻找长时间未访问、不再请求或可丢弃的物理内存。甚至还涉及其他事情,例如任务优先级、任务状态(挂起的任务是内存回收的良好候选者)等。所有这些物理内存都可以回收,其内容保存在磁盘上的交换文件(页面文件)和物理存储中然后可以映射到新进程中。
当程序试图访问其当前缓存在磁盘上的内存时,将执行相反的过程。 MM 从其他进程重新收集物理内存(使用上述相同的技术),在进程 space 中提交它,从磁盘缓存复制数据,然后将控制权交还给用户代码。
所有这些过程对用户来说是完全透明的,您不必担心。
如果您想阅读更多内容,请搜索内存管理、分页文件、GDT(全局描述符表)和LDT(局部描述符表)表)here对于X86架构,其他处理器使用不同的结构和寄存器,但原理是一样的。
在Linux中,当请求内存时(使用calloc / malloc
),如果请求大小的连续块不可用,内核是否将多个独立的内存块映射到一个虚拟块中并将其交给应用程序还是分配在磁盘上?
如果它是在磁盘上分配的,当有足够大的块可用时,它是自动移动到 RAM 还是在磁盘上终生存在?
在所有支持 OS 的虚拟内存中,现在所有内核都使用不同策略的池来管理内存。
处理器向程序保证内存的存在达到处理器的标称寻址能力,或者更少,具体取决于规格。所以你可以为OS分配最大合法内存量的内存。
使用的资源是安装在系统中的物理内存和磁盘存储。
根据程序请求,MM(内存管理器)分配虚拟space:OS创建描述请求内存的数据结构(一般称为创建分页目录),但是没有分配 real 内存。下一阶段称为 commitment,您在尝试 access 之前分配的内存时进入此阶段。如果有可用的物理内存,则 MM 通过尝试访问内存时产生的异常调用,提交 实际内存页面,将它们的地址插入页面目录,然后控制流回用户代码。现在记忆存在了!
如果我们尝试访问内存未分配?这是生成异常的无效内存访问的情况,在 Linux 段错误中。
回到物理内存承诺,如果没有更多的物理内存可用怎么办? MM使用不同的算法寻找长时间未访问、不再请求或可丢弃的物理内存。甚至还涉及其他事情,例如任务优先级、任务状态(挂起的任务是内存回收的良好候选者)等。所有这些物理内存都可以回收,其内容保存在磁盘上的交换文件(页面文件)和物理存储中然后可以映射到新进程中。
当程序试图访问其当前缓存在磁盘上的内存时,将执行相反的过程。 MM 从其他进程重新收集物理内存(使用上述相同的技术),在进程 space 中提交它,从磁盘缓存复制数据,然后将控制权交还给用户代码。
所有这些过程对用户来说是完全透明的,您不必担心。
如果您想阅读更多内容,请搜索内存管理、分页文件、GDT(全局描述符表)和LDT(局部描述符表)表)here对于X86架构,其他处理器使用不同的结构和寄存器,但原理是一样的。