内存管理1 - Win32汇编语言054

内存管理1

 

让编程改变世界

Change the world by program


 

内存管理基础

  Win32 中的内存管理是分层次的,系统提供了几组层次不同的函数来管理内存,它们是标准内存管理函数、堆管理函数、虚拟内存管理函数和内存映射文件函数。 所有的这些函数都是为了让用户能在比较高的层次上方便地管理内存,以便将程序和底层的内存分页机制隔离开来。   图说内存: [caption id="attachment_521" align="aligncenter" width="300"] Windows的内存分层管理[/caption]  

虚拟内存管理函数

  Windows 使用一个以页为基础的虚拟内存系统,与分页有关的概念已经在该系列教程刚开始几个讲中有所介绍,虽然那时候大家还懵懵懂懂。 Windows 充分利用了 80x86 处理器保护模式下的线性寻址机制和分页机制,这些机制是 Win32 内存管理的基础。 Win32 提供了一组虚拟内存管理函数来管理虚拟内存,主要用于保留/提交/释放虚拟内存,在虚拟内存页上改变保护方式,锁定虚拟内存页以及查询一个进程的虚拟内存等操作,这是一组位于底层的函数。  

堆管理函数

  堆管理函数相对比较高级一点,堆的主要功能就是有效地管理内存和进程的地址空间。 DOS 操作系统下的 C 语言中就已经有了”堆”的概念,这时的”堆”是程序初始化时向操作系统申请并预留的大块内存,程序通过 C 函数在这块空间中申请和释放内存。 在Win32中,进程可以使用的整个地址空间就是一个堆。  

标准内存管理函数

  并且”堆”的概念又被引伸了一步:Win32中分两种堆 一种是进程的”默认堆”,默认堆只有一个,指的就是可以使用的整个地址空间; 另一种是”动态堆”,也称为”私有堆”,私有堆类似于 DOS 下 C 语言中使用的那种堆,一个进程可以随意建立多个私有堆,也可以随意将它们释放。   私有堆全部位于默认堆中,从概念上看,它和默认堆并没有什么不同,使用堆管理函数可以对所有的私有堆和默认堆进行操作。 标准内存管理函数总是在默认堆中分配和释放内存,这组函数就是常规意义上的内存管理函数。  

内存映射文件函数

  内存映射文件函数相对比较独立,它是为了文件操作的方便性而设立的。 当对文件进行操作的时候,一般先打开文件,申请一块内存用做缓冲区,再将文件数据循环读入并处理,当文件长度大于缓冲区长度则需要多次 读入,每次读入后处理缓冲区边界位置的数据往往是个麻烦问题。 还记得我们曾经介绍过 Windows 可以使用磁盘文件当做虚拟内存,内存映射文件函数使用同样的办法将一个文件直接映射到进程的地址空间中,这样可以通过内存指针用读写内存的办法直接存取文件内容。    

不同内存管理函数的操作对象

  对比这些函数,可以发现它们涉及的系统资源是各不相同的: [caption id="attachment_522" align="aligncenter" width="300"] 不同内存管理函数的操作对象[/caption]  

获取内存的当前状态

  为什么需要此操作?! 因为我们之前介绍过,一个进程可以寻址的地址空间是 4GB,但用户可以直接管理的地址空间是多大呢?   实际上,高端的 2GB 是供操作系统内核使用的,其中安排了操作系统的代码和数据,可供应用程序使用的地址空间是低端的 2GB。 这 2GB 除去应用程序与用户 DLL 等的代码和静态数据段以后,余下来的才是内存管理函数可以使用的地址空间。 应用程序和用户 DLL 的大小一般只有几兆字节到上百兆字节,所以可以认为能自由使用的地址空间基本上是 2GB。   既然用户可以使用的地址空间大概为 2GB,鱼油们千万不要天真的认为就可以申请 2GB 的内存了。 因为这 2GB 仅是可以使用的”地址”空间,而不是可以使用的”内存”空间(请务必谨慎区分),可分配内存的大小还受制于物理内存和磁盘交换文件的大小。 因为物理内存和磁盘交换文件是供整个系统和所有用户程序使用的,所有系统内核、当前执行的所有用户程序的代码、数据以及分配的内存总量并不能超过物理内存和磁盘交换文件的总和。   当设计一个可能需要申请大量内存的程序时,如何预先得知系统的配置情况呢?   对此可以使用 GlobalMemoryStatus 函数:

invoke GlobalMemoryStatus, lpBuffer

  lpBuffer 指向一个 MEMORYSTATUS 结构,结构的定义如下: [codesyntax lang="asm"]
MEMORYSTATUS STRUCT
    dwLength      DWORD    ; 本结构的长度
    dwMemoryLoad  DWORD    ; 已用内存的百分比
    dwTotalPhys   DWORD    ; 物理内存总量
    dwAvailPhys   DWORD    ; 可用物理内存
    dwTotalPageFile DWORD  ; 交换文件总的大小
    dwAvailPageFile DWORD  ; 交换文件中空闲部分大小
    dwTotalVirtual  DWORD  ; 用户可用的地址空间
    dwAvailVirtual  DWORD  ; 当前空闲的地址空间
MEMORYSTATUS ENDS
[/codesyntax]   在调用之前需要首先将 dwLength 字段设置为 MEMORYSTATUS 结构的长度。 当调用 GlobalMemoryStatus 函数后,函数会在结构中填充对应的数值。 注意:dwTotalPageFile 字段返回的是交换文件的最大值,并不是当前实际建立的交换文件的大小,一般当前的交换文件大小会小于这个数值。 但这个数值的大小也不是确定的,如果需要的话,系统会增加它的大小直到不再有空余的磁盘空间放置交换文件为止。   我们来分析一个不完美的栗子:MemInfo( 课件及源代码下载)   关于 GlobalMemoryStatus, MSDN 上有这样一段话:
On computers with more than 4 GB of memory, the MEMORYSTATUS structure can return incorrect information. Windows?2000 reports a value of -1 to indicate an overflow. Earlier versions of Windows NT report a value that is the real amount of memory, modulo 4 GB. If your application is at risk for this behavior, use the GlobalMemoryStatusEx function instead of the GlobalMemoryStatus function.
  先把视频暂停片刻。。。 自己试着改一下。。。。   小甲鱼接着会讲解支持 4GB 以上的解决方案,但希望大家先自己根据提示进行探索! 支持 4GB 以上资源获取解析:MemInfo2(课件及源代码下载 [buy]  获得所有教学视频、课件、源代码等资源打包 [/buy] [Downlink href='http://kuai.xunlei.com/d/BdsUAwrPHwBnT7JSe4c']视频下载[/Downlink]

转载于:https://www.cnblogs.com/LoveFishC/archive/2012/07/14/3846216.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
hao123网址站ASP开源源码正式发布 本程序源码由hao123.com网址站独立开发,更新hao123最新样式和分类,asp版带后台,可全站生成静态页。 关于网站LOGO修改: 首页网站标志LOGO目录位置:/images/logo_140.gif 次页网站标志LOGO目录位置:/logo.gif 希望大家创建有自己特色的LOGO,以区别于hao123。 默认后台地址:/admin/login.asp 默认用户:admin 默认密码: admin 关于网站安装: 1, 上传源码,进入后台->全局->站点信息,把信息修改成你站信息 2, 生成首页和所有分类HTML 建议上传后修改默认管理后台地址/admin/的名称。 演式地址:http://www.86daijia.net 2012-5-16 增加站长统计程序及图标。 2012-5-16 美化界面。 2012-5-16 增加最新新闻资讯。 2012-5-16 修正后台管理全局设置不能保存BUG。 2012-4-9 增加IP购买页面。 2012-4-9 增加分享工具条。 2012-4-9 增加下角话费充值条 2012-4-9 支持二级目录,为站长节省空间 2012-2-27 再次与123同步 2011-11-7 新增折扣分类。 2011-10-24 同步hao123.com首页时间、天气的显示方式。 2011-10-14 新增实用工具、彩票、音乐、小游戏聚合分类。 2011-9-30 重新整理了分类。 2011-5-8 增加电影分类,自动调用wz123.net电影数据。修复军事、旅游、酷站链接名。 2011-4-2 增加连续剧分类,自动调用hao123.com连续剧数据。 2011-4-1 改进天气自动调用weather.com.cn数据。 2011-1-10 增加设计、微博分类,同步分类排序。 2011-1-10 同步天气预报数据,自动获取IP显示城市天气。 2010-11-8 增加笑话分类,同步分类排序。 2010-11-7 修改163与126邮箱登录自动跳转官网,修复子目录返回首页链接。 2010-10-20 最新同步团购分类。 2010-7-28 最新同步hao123.com清新绿风格。 2010-3-5 应广大站长需要,再次提供HTML版本下载, 2010-1-15 同步hao123分类顺序,最新更新wz123.net职业与爱好分类。 2010-1-11 最新修复网站放在子目录上栏目页样式问题,有此问题的用户请下载最新版覆盖修复。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值