017 虚拟内存2

用户地址空间

  ● 内存的分配

    ○ 当进程被创建并赋予它的地址空间时,该可用地址空间的主体是空闲的,即未被分配的。

      若要使用该地址空间的各个部分,必须通过调用 VirtualAlloc函数来分配它里边的各个区域。

      每当你保留地址空间的一个区域时,系统要确保该区域从一个分配颗度的边界开始。

      当你保留地址空间的一个区域时,系统还要确保该区域的大小是系统的页面大小倍数。

  ● 分配颗粒

    ○ 所有CPU平台都会使用相同的分配颗粒即 64KB.

  ● 页面大小

    ○ 4KB

  ● VirtualAlloc 函数

    函数原型

    

1 LPVOID WINAPI VirtualAlloc(
2   _In_opt_ LPVOID lpAddress,
3   _In_     SIZE_T dwSize,
4   _In_     DWORD  flAllocationType,
5   _In_     DWORD  flProtect
6 );

  ○ 参数1:lpAddress
    要分配的内存区域的地址
  ○ 参数2:dwSize
    分配的大小
  ○ 参数3:flAllocationType
    分配的类型
  ○ 参数4:flProtect
    该内存的初始保护属性


可能的数值

含义

MEM_COMMIT 0x1000

为指定地址空间提交物理内存。这个函数初始化内在为零

试图提交已提交的内存页不会导致函数失败。这意味着您可以在不确定当前页的当前提交状态的情况下提交一系列页面。

如果尚未保留内存页,则设置此值会导致函数同时保留并提交内存页。


MEM_RESERVE 0x2000

保留指定地址空间,不分配物理内存。

这样可以阻止其他内存分配函数malloc和LocalAlloc等再使用已保留的内存范围,直到它被被释放。

当使用上面的VirtualAlloc函数保留了一段地止空间后,接下还你还可以继续多次调用同样的函数提交这段地址空间中的不同页面。


MEM_RESET0x80000

表示,在所指定的内存范围内的数据lpAddress的dwSize不再是利益。页面不应该被读出或写入到分页文件。然而,将再次使用的内存块后,所以它不应该decommitted的 。这个值不能使用任何其他的价值 。

使用这个值并不保证范围与经营MEM_RESET将包含零。如果你想的范围包含零,decommit内存,然后将它重新作出 。

当您指定MEM_RESET,VirtualAlloc函数忽略值flProtect。但是,您仍然必须设置flProtect有效的值,比如,PAGE_NOACCESS。

如果你使用MEM_RESET的内存范围映射到一个文件,VirtualAlloc返回一个错误。如果它被映射到分页文件共享视图是唯一可以接受的的 。

分配类型 也可以是下列值


可能的数值

含义

MEM_LARGE_PAGES0x20000000的

分配内存使用大页面支持。

大小和对齐必须是一个大页面的最低多个 。要获得这个值,使用GetLargePageMinimum。


MEM_PHYSICAL0x400000

储备的地址范围,可用于内存地址窗口扩展(AWE)的页面。

此值必须使用MEM_RESERVE,并没有其他值。


MEM_TOP_DOWN0x100000

在尽可能高的地址分配内存。这可以比普通的分配速度较慢,尤其是当需要许多分配。

MEM_WRITE_WATCH0x200000

导致系统来跟踪分配的地区,都写在页面 。如果指定此值,则还必须指定MEM_RESERVE。

要检索的页面是否写入,因为该地区被分配或写跟踪状态被重置地址,调用GetWriteWatch功能。要重置写跟踪状态,调用GetWriteWatch或ResetWriteWatch。写跟踪功能仍然启用,直到该地区被释放。

访问类型


PAGE_READONLY 0x02

该区域为只读。如果应用程序试图访问区域中的页的时候,将会被拒绝访问。

PAGE_EXECUTE 0x10

区域包含可被执行的代码。试图读写该区域的操作将被拒绝。

PAGE_EXECUTE_READ 0x20

区域包含可执行代码,应用程序只能读该区域。

PAGE_READWRITE 0x04

区域不可执行代码,应用程序可以读写该区域。

PAGE_EXECUTE_READWRITE 0x40

区域可以执行代码,应用程序可以读写该区域。

PAGE_GUARD 0x100

区域第一次被访问时进入一个STATUS_GUARD_PAGE异常,这个标志要和其他保护标志合并使用,表明区域被第一次访问的权限

PAGE_NOACCESS 0x01

任何访问该区域的操作将被拒绝

PAGE_NOCACHE 0x200

RAM中的页映射到该区域时将不会被微处理器缓存(cached)

时间: 2024-10-10 04:08:59

017 虚拟内存2的相关文章

017 虚拟内存页面区块 4

● VirtualQueryEx 函数 功能:检索在指定进程的虚拟地址空间内的一系列页面的信息. 函数参数 参数1:hProcess [in] 进程句柄 参数2:lpAddress [in, optional] 查询虚拟内存地址 参数3:lpBuffer [out] MEMORY_BASIC_INFORMATION 结构体指针 参数4:dwLength [in] 结构体指针的大小 返回值: 函数写入lpBuffer的字节数,如果不等于sizeof(MEMORY_BASIC_INFORMATION

017 虚拟内存

# 内存 ● 物理内存 ○ 电脑上面的内存条 ○ 4G 8G 16G 32G 物理内存是死的,不会增长的 ○ 物理内存可以跟CPU进行通信,所以电脑上面必须有物理内存 ○ 应用程序开发的时候,我们根本无法接触到物理内存. ● 虚拟内存 ○ 多个进程 每个都分配虚拟地址空间 ○ 模拟所有物理内存的功能 ○ 当我们要执行这个程序的时候,只需要把虚拟内存空间,加载到内存即可 ○ 应用程序开发的时候,我们根本无法接触到物理内存. 不管是加载卸载虚拟内存,都是我们操作系统完成的 ○ 虚拟内存有什么用 每个

虚拟内存运行原理!

                                   虚拟内存运行原理! 在系统中运行的每个进程都需要使用到内存,但不是每个进程都需要每时每刻使用系统分配的内存空间.当系统运行所需内存超过实际的物理内存,内核会释放某些进程所占用但未使用的部分或所有物理内存,将这部分资料存储在磁盘上直到进程下一次调用,并将释放出的内存提供给有需要的进程使用. 在Linux内存管理中,主要是通过"调页Paging"和"交换Swapping"来完成上述的内存调度.调页算法

linux内存管理-虚拟内存总结

面试被问到虚拟内存,回答的感觉不够.于是重新总结一下. 程序猿对内存的要求都是:私有的.速度快.容量无限大. 对应现在的现况:使用一块物理内存.容量有限.并且速度有限,需要cpu多级缓存. 物理内存暴露给进程存在问题:1.如果可以寻址内存的每个字节,容易破坏操作系统以及其他进程 解决方法1 通过基址寄存器与界限寄存器 前置保存起始物理地址,后者保存地址长度:解决了地址私有化的问题. 交换技术  仍然使用两个寄存器,会产生内存空洞:就算使用内存紧缩技术(移动进程空间),也会大量占用cpu时间: 虚

最好的方式是用VirtualAlloc分配虚拟内存,它既不是在堆也不是在栈,而是直接在进程的地址空间中保留一块内存

申请效率的比较 栈:由系统自动分配,速度较快.但程序员是无法控制的. 堆:是由new分配的内存,最好的方式是用VirtualAlloc分配虚拟内存,它既不是在堆也不是在栈,而是直接在进程的地址空间中保留一块内存,虽然用起来最不方便,但是速度快也最灵活. http://blog.csdn.net/houqd2012/article/details/25070987

[Java]虚拟内存大小设置

部分内容来自:http://www.cnblogs.com/jinzhenshui/p/3345895.html 当初始化一个 byte[] 变量时,如果写成了这样 byte[] b = new byte[1024 * 1024 * 1024]; 你可以看到报错: Exception in thread "main" java.lang.OutOfMemoryError: Java heap space 这个错误表示需要设置参数增加虚拟内存大小 对项目右键 -> Debug -&

linux系统添加swap虚拟内存与删除配置方法

兄弟连Linux培训教程 linux系统添加swap虚拟内存与删除配置(www.lampbrother.net) 1.swap概述 Swap分区,即交换区,Swap空间的作用可简单描述为:当系统的物理内存不够用的时候,就需要将物理内存中的一部分空间释放出来,以供当前运行的程序使用.那些被释放的空间可能来自一些很长时间没有什么操作的程序,这些被释放的空间被临时保存到Swap空间中,等到那些程序要运行时,再从Swap中恢复保存的数据到内存中.这样,系统总是在物理内存不够时,才进行Swap交换. 其实

操作系统思考 第三章 虚拟内存

第三章 虚拟内存 作者:Allen B. Downey 原文:Chapter 3 Virtual memory 译者:飞龙 协议:CC BY-NC-SA 4.0 3.1 简明信息理论 比特是二进制的数字,也是信息的单位.一个比特有两种可能的情况,写为0或者1.如果是两个比特,那就有四种可能的组合,00.01.10和11.通常,如果你有b个比特,你就可以表示2 ** b个值之一.一个字节是8个比特,所以它可以储存256个值之一. 从其它方面来讲,假设你想要储存字母表中的字母.字母共有26个,所以你

Redis教程(十一):虚拟内存介绍:

转载于:http://www.itxuexiwang.com/a/shujukujishu/redis/2016/0216/138.html 一.简介: 和大多NoSQL数据库一样,Redis同样遵循了Key/Value数据存储模型.在有些情况下,Redis会将Keys/Values保存在内存中以提高数据查询和数据修改的效率,然而这样的做法并非总是很好的选择.鉴于此,我们可以将之进一步优化,即尽量在内存中只保留Keys的数据,这样可以保证数据检索的效率,而Values数据在很少使用的时候则可以被