windows核心编程-虚拟内存

《Windows核心编程》读书笔记十五 在应用程序中使用虚拟内存 第十五章 在应用程序中使用虚拟内存 本章内容 15.1 预定地址空间区域 15.2 给区域调拨物理存储器 15.3 同时预定和调拨物理存储器 15.4 何时调拨物理存储器 15.5 撤销调拨物理存储以及释放区域 15.6 改变保护属性 15.7 重置物理存储器的内容 15.8 地址窗口扩展 阅读详情
Microsoft Windows 提供了三种机制来对内存进行操作。
1、堆-----------最适合用来管理大量的小型对象。
2、虚拟内存-----最适合用来管理大型对象数组或大型结构数组。

3、内存映射文件-最适合用来管理大型数据流(通常是文件),以及在同一机器上运行的多个进程之间共享数据。


接下来我来介绍一下虚拟内存中用到的几个函数。
LPVOID VirtualAlloc(
LPVOID lpAddress, // 要分配的内存区域的地址
DWORD dwSize, // 分配的大小
DWORD flAllocationType, // 分配的类型
DWORD flProtect // 该内存的初始保护属性
);
功能:在调用进程的虚地址空间中,预定或者提交一部分页。
LPVOID lpAddress, 分配内存区域的地址。当你使用VirtualAlloc来提交一块以前保留的内存块的时候,lpAddress参数可以用来识别以前保留的内存块。如果这个参数是NULL,系统将会决定分配内存区域的位置,并且按64-KB向上取整(roundup)。
SIZE_T dwSize, 要分配或者保留的区域的大小。这个参数以字节为单位,而不是页,系统会根据这个大小一直分配到下页的边界DWORD
flAllocationType, 分配类型。MEM_RESERVE预定地址空间区域;MEM_COMMIT调拨物理存储器,即真正的分配内存。也可预定与分配同时进行。
DWORD flProtect 指定了被分配区域的访问保护方式


SIZE_T WINAPI VirtualQuery(
  _In_opt_  LPCVOID lpAddress, //address of the region of pages to be queried.
  _Out_     PMEMORY_BASIC_INFORMATION lpBuffer, //address of information buffer 
  _In_      SIZE_T dwLength //size of buffer
);
功能:查看进程内存地址空间的页面分配情况。


BOOL VirtualFree(
LPVOID lpAddress, // 区域地址
SIZE_T dwSize, // 区域大小,字节
DWORD dwFreeType // 类型
);

功能:取消或者释放调用进程的虚地址空间页的一个区域。


下面是一个简单的事例程序

#include <Windows.h>
#include <tchar.h>
#include <iostream>
//转载请注明文章来自:http://blog.youkuaiyun.com/windows_nt
typedef TCHAR *PTSTR;

void main()
{
	
	TCHAR szAppName[]  = _T("MEM_RESET tester");
	TCHAR szTestData[] = _T("Some text data");
	
	// Commit a page of storage and modify its contents.
	PTSTR pszData = (PTSTR) VirtualAlloc(NULL, 1024, 
		MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
	lstrcpy(pszData, szTestData);
	
	{
		printf(_T("Modified data page.\n"));
		// We want this page of storage to remain in our process but the 
		// contents aren't important to us anymore. 
		// Tell the system that the data is not modified.
		
		// Note: Because MEM_RESET destroys data, VirtualAlloc rounds
		// the base address and size parameters to their safest range.
		// Here is an example: 
		//    VirtualAlloc(pvData, 5000, MEM_RESET, PAGE_READWRITE)
		// resets 0 pages on CPUs where the page size is greater than 4 KB 
		// and resets 1 page on CPUs with a 4 KB page. So that our call to 
		// VirtualAlloc to reset memory below always succeeds, VirtualQuery 
		// is called first to get the exact region size.
		MEMORY_BASIC_INFORMATION mbi;
		VirtualQuery(pszData, &mbi, sizeof(mbi));
		VirtualAlloc(pszData, mbi.RegionSize, MEM_RESET, PAGE_READWRITE);
	}
	
	{
		printf(_T("clear data page.\n"));
		// Commit as much storage as there is physical RAM.
		MEMORYSTATUS mst;
		GlobalMemoryStatus(&mst);
		PVOID pvDummy = VirtualAlloc(NULL, mst.dwTotalPhys, 
			MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
		
		// Touch all the pages in the dummy region so that any
		// modified pages in RAM are written to the paging file.
		ZeroMemory(pvDummy, mst.dwTotalPhys);
	}
}
从Chimera到ChimeraX:科研绘图升级指南,让你的论文配图更专业 本文详细介绍了从UCSF Chimera升级到ChimeraX的科研绘图指南,帮助研究者提升论文配图质量。ChimeraX在渲染引擎、大分子处理能力和动画功能上具有显著优势,特别适合生命科学和结构生物学领域。文章涵盖材质设置、专业配色、工作流程和期刊适配等核心技巧,助力产出出版级分子可视化图像。 阅读详情

相关推荐

eDP/DP接口简介

目前,在视频传输协议以及接口领域,外部接口主要是DP与HDMI两分天下,当然之前出现过很多接口-VGA, DVI等等,最新平台基本以这两个为主;笔记本内部接口就基本上使用eDP((Embedded Display Port))作为标准接口来驱动液晶屏了。那么问题来了,eDP和DP,是完全兼容的么?eDP,DP,HDMI,这三种接口的显示器,可以插在同一个接口上使用么?这篇文章,就会从硬件和一部分协议的角度分析一下这三大协议。

weixin_50518899的博客 2万+

《Windows核心编程》笔记-虚拟内存、内存

windows内存管理学习随笔

jinghuashuiyue06的博客 644

欧姆龙PLC的FinsTCP协议

三个流行的PLC: PLC 通讯协议 默认IP和端口 区别 西门子S7-1200 S7 192.168.1.201 :102 2次验证(正常连接后,第一次发不断开,第二次发断开) 三菱Q系列 MC 192.168.1.250 :4096 不验证(正常连接后,怎么发都不断开) 欧姆龙CJ-2M系列 FinsTCP 192.168.1.14 :9600 1次验证(正常连接后,第一次发断开) ...

周林的博客 1万+

windows核心编程--虚拟内存

 Wi n d o w s提供了3种进行内存管理的方法,它们是: • 虚拟内存,最适合用来管理大型对象或结构数组。 • 内存映射文件,最适合用来管理大型数据流(通常来自文件)以及在单个计算机上运行的多个进程之间共享数据。 • 内存堆栈,最适合用来管理大量的小对象。虚拟内存的状态 Wi n d o w s函数G l o b a l M e m o r y S t a t u s可用于

Mobidogs Blog 1773

ADI官方例程HDL和No-OS生成Vivado工程

这一步是选择下载源,一般都是选择国内镜像,因为国外的源太慢了,这里选择阿里的镜像,如果没有这个选项可以在下面的User URL里添加就行,选择好源后然后点击下一步。下一步会从你选择的源上下载软件包目录,如果提示Unable to get setup from https://xxxxxx/,返回上一步,选择别的源,例如第二个163网易的源。然后就是你想要安装在哪了,下面的选项好像会决定环境变量存放在哪,不过一般都是个人电脑选择第一个默认的就行,然后点下一步。下好之后双击打开,就是这个界面了,直接点下一步。

代码匠的博客 3832

HTTPS接口测试翻车实录:为什么浏览器能访问而curl报证书错误?

本文深入分析了HTTPS接口测试中浏览器访问正常而curl报证书错误的典型问题。通过对比浏览器、Postman和curl的工具行为差异,结合Nginx日志与Wireshark抓包,揭示了问题根源在于网络架构中HTTPS请求被意外“降级”为HTTP传输,导致SSL握手失败。文章重点探讨了curl工具严格验证机制暴露的`Peer's Certificate issuer is not recognized`错误,并提供了网络配置修正方案与标准化测试流程。

u9v0w的博客 278

windows 64位程序获取虚拟内存总结

1.32位进程获取的虚拟内存的最大数是4G。64位获取虚拟内存的最大数是140737488224256,换算成16进制是0x7FFFFFFE0000 2.双内存条机器调用api函数最好使用GlobalMemoryStatusEx 3.64位的exe调用api函数最好使用GlobalMemoryStatusEx 4.在cmd里面输入systeminfo可以查看虚拟内存、物理内存、处理器以及其他信息 5.MEMORYSTATUSEX结构体的ullTotalPageFile成员变量对应虚拟内存的最大值

sz76211822的专栏 1179

【脑电分析系列】第15篇:脑电功能连接性与脑网络分析(二):Granger因果性、图论指标与复杂网络构建

摘要: 本文深入探讨了脑电(EEG)分析中的高阶连接性方法——有效连接(Effective Connectivity),重点介绍了Granger因果性(Granger Causality, GC)的原理与应用。GC通过统计预测揭示脑区间信息流动方向,超越了传统功能连接的同步性分析。文章还结合图论指标(如度、路径长度、聚类系数和模块化)量化脑网络的拓扑结构,并通过Python代码(MNE和NetworkX库)演示了从EEG数据构建、分析复杂脑网络的完整流程。该研究为理解大脑动态互动、认知任务信息流及神经系统疾

qq_32516809的博客 1561

Windows核心编程:探索虚拟内存

作者:shenzi链接:http://blog.youkuaiyun.com/shenziWindows核心编程:探索虚拟内存1.系统信息     操作系统中有许多值是由系统所运行的主机决定的,如页面大小和分配粒度等。我们应该在进程初始化时取得这些值,然后在代码中使用它们。GetSystemInfo函数用来取得与主机相关的值:

shenzi的天空 5130

论文精读——A Comprehensive Survey of Continual Learning: Theory, Method and Application

为了应对现实世界的动态性,智能系统需要在其整个生命周期中逐步获取、更新、积累并利用知识。这种能力被称为Continue Learning(持续学习)。从广义上讲,持续学习明显受到catastrophic forgetting(灾难性遗忘)的限制,即学习新任务通常会导致旧任务的性能急剧下降。Continue Learning的核心目的有二,其一为(稳定性与可塑性间的权衡),其二为(足够的任务内/任务间泛化能力)。

xsddys的博客 1241

YOLOV26详解 从原理到部署

计算机视觉领域最具影响力的目标检测框架迎来重大里程碑。2026年1月,Ultralytics 正式发布 YOLOv26——这不是一次简单的版本迭代,而是一场面向边缘计算时代的架构重构。本专栏基于 Ultralytics 官方技术白皮书、YOLO Vision 2025 大会首发内容及国际前沿研究成果,系统拆解 YOLOv26 从算法原理到工程落地的全栈技术体系。与常规教程不同,我们聚焦与,帮助你在端侧 AI 部署的实战中掌握核心竞争力。

u012133341的博客 2019

Windows核心编程 - 在应用程序中使用虚拟内存(2)

接着上一篇Windows核心编程 - 在应用程序中使用虚拟内存(1) 4. 何时调拔物理存储器 假设正在实现一个电子表格的应用程序,需要一个CELLDATA结构来描述单元格的内容。一种最简单的方式使用二维数组这种数据结构来实现,数组的优点是访问速度快,但缺点是意味着程序一开始运行就需要从页交换文件中分配大量的物理存储器,但实际上用户通常只会使用少数的单元格,造成内存的浪费。 ...

yjianlu的专栏 221

「企业级智能体」LangChain4j Multi-Agent:角色分离 + 协同编排实战

在大部分 Java 项目里,“接入大模型Controller 收到一个 question调用大模型接口拿到 answer把结果原样丢回前端这种玩法可以叫「高配搜索框模式一个 Agent 要写 Prompt、要查数据库、还要改写文案,太忙了不同角色(创作者、编辑、审稿人)的职责混在一起,难以维护想复用其中一段能力(比如只要润色)也不方便把大任务拆成多个 “角色清晰的 Agent”,再编排它们像流水线一样协同完成任务。CreativeWriter:负责创作故事。

OFFTime_we的博客 1547

Windows核心编程:在应用程序中使用虚拟内存

Windows核心编程:在应用程序中使用虚拟内存    Microsoft Windows提供以下三种机制来对内存进行操控:虚拟内存:最适合用来管理大型对象数组或大型结构数组。内存映射文件:最适合用来管理大型数据流(通常是文件),以及在同一机器上运行的多个进程之间共享数据。堆:最适合用来管理大量的小型对象。      

shenzi的天空 3519

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

基于visual c++之windows核心编程代码分析(6)分配和释放可读可写的虚拟内存页面

我们在进行Windows核心编程,经常要用到读取虚拟内存。我们来亲自实践一个分配与释放可读可写的虚拟内存页面,请见代码实现与注释讲解。#include #include /************************************* * int main(void) * 功能 演示虚拟内存的使用 * * 参数 未使用 ******************************

尹成的技术博客 3481

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

WINDOWS核心编程--虚拟内存

WINDOWS核心编程--虚拟内存windows内存管理每个进程都被赋予它自己的虚拟地址空间。对于32位进程来说,这个地址空间是4GB,因为32位指针可以拥有从0x00000000至0xFFFFFFFF之间的任何一个值。这是虚拟地址空间,不是物理地址空间。该地址空间只是内存地址的一个范围。在你能够成功地访问数据而不会出现违规访问之前,必须赋予物理存储器,或者将物理存储器映射到各个部分的地址

xuwei2007的专栏 2248

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

[笔记]Windows核心编程《十五》在应用程序中使用虚拟内存

文章目录前言一、预定地址空间区域1.1 VirtualAlloc函数二、给区域调拨物理存储器三、同时预定和调拨物理存储器四、何时调拨物理存储器五、撤销调拨物理存储器及释放区域六、改变保护属性七、重置物理存储器的内容 前言 Microsoft Windows 提供三种机制来对内存进行操控: 虚拟内存 最适合用来管理大型对象数组或大型结构数组 内存映射文件 最适合用来管理大型数据六(通常是文件) 堆 最用来适合管理大量的小型对象 一、预定地址空间区域 1.1 VirtualAlloc函数 LPVOID W

二次元怪兽的博客 1121

[笔记]Windows核心编程《十四》探索虚拟内存

[笔记]Windows核心编程《十四》探索虚拟内存

二次元怪兽的博客 1173

Windows 核心编程之14 探索虚拟内存

探索虚拟内存

软件开发 1778

Windows核心编程 - 探索虚拟内存

1. 系统信息 操作系统中有很多参数是由系统所运行的主机所决定的,如页面大小和分配粒度等,可使用GetSystemInfo函数来获取与主机相关的参数。为了让32位应用程序能够在64位版本Windows上运行,Microsoft提供了一个称为Windows 32-bit On Windows 64-bit的模拟层,称为WOW64。当32位应用程序在WOW64上运行时,调用GetSystem...

yjianlu的专栏 292

在进程空间使用虚拟内存(Windows 核心编程)

虚拟内存空间 如今的 Windows 操作系统不仅可以运行多个应用程序,还可以让每一个应用程序享受到约 4 GB 的虚拟内存空间(...

墨鱼菜鸡 237

《Windows核心编程》读书笔记十四 探索虚拟内存

第十四章  探索虚拟内存 本章内容 14.1 系统信息 14.2 虚拟内存状态 14.3 NUMA机器中的内存管理 14.4 确定地址空间的状态 本章通过分析一些windows函数来了解与系统内存管理和进程中虚拟地址空间相关的信息。 14.1 系统信息 操作系统有许多值是由运行主机决定的。如页面大小和分配粒度。不应该将这些参数写死(硬编码到代码中)而是应该在

sesiria的博客 806

虚拟内存——Windows核心编程学习手札之十四

虚拟内存——Windows核心编程学习手札之十四系统信息有些操作系统的值是根据主机而定的,如页面大小、分配粒度大小等,这些值不用硬编码形式,进程初始化时应检索这些值以使用。函数GetSystemInfo函数用于检索与主机相关的值:VOID GetSystemInfo(LPSYSTEM_INFO psinf);传递SYSTEM_INFO结构的地址,该函数将初始化结构成员并返回。

医疗影像检索 2852

windows 核心编程之在应用程序中使用虚拟内存

Microsoft Windows 提供了以下三种机制来对内存进行操控: 虚拟内存 最适合用来管理大型对象数组或大型结构数组 内存映射文件 最适合用来管理大型数据流(通常是文件),以及在同一台机器上运行多个进程之间共享数据 堆 最适合管理大量小型对象 本篇只讨论第一种方式 虚拟内存。 15.1 预订地址空间区域 可以使用VirtualAlloc函数来预订进程中的地址空间区

zhuimengfuyun的专栏 1770
上一篇: Windows核心编程-新旧API速查表
下一篇: Windows核心编程-多个应用程序实例间共享数据
codinglf
博客等级 码龄16年 237粉丝 127原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值