从内存释放软件的原理到虚拟内存.doc

从内存释放软件的原理到虚拟内存.doc

  1. 1、本文档共6页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
从内存释放软件的原理到虚拟内存

从内存释放软件的原理到虚拟内存 By:乱雪 某日,群里某人提问如何实现内存释放功能,便引起了我的兴趣。从网上下载了一款内存释放软件进行逆向分析。由于逆向细节不符合本文主题,所以省略之。 逆向后发现,该程序核心部分——即内存释放功能,是调用了SetProcessWorkingSetSize()函数。此函数在MSDN描述如下: “Sets the minimum and maximum working set sizes for the specified process”,中文意思是:设置进程的最大最小工作空间。此话什么意思?这里涉及到虚拟内存的概念,只要掌握到这个概念后,就能明白这句话的意思了。 虚拟内存,是现代操作系统中一个比较重要的概念。现在的物理内存大小(即内存条本身容量)已经不能满足应用软件的需求了。为了解决物理内存空间紧张的问题,便引入了虚拟内存的概念,将外部存储设备用来当作内存的一部分,通常用的是硬盘。 一个程序运行时,其实并不是所有代码都在内存中,有一部分暂时不执行的代码将会存入硬盘中,并以“页”为单位存储,留下重要部分在内存中执行。操作系统已经将内存分割成一块一块的装入或者换出内存了,这个叫“分页”,换出和装入是以“页”为单位进行的。可以这样理解“页”,一个练习小子的小字本每页有若干个方格子,但是每页的格子数是一样的。在Windows系统中,每页的大小默认是4KB,有若干“页”。但是页面的装入和换出是CPU和硬盘之间的操作,大家都知道CPU直接读取硬盘的操作是非常慢的,所以装入页面时也会较慢,为了不频繁装入和换出,操作系统需要一系列的算法进行调度,关于此细节比较复杂,不作叙述。 大家应该有过这样的经验,当在一台配置不是很高的机器上打游戏时,将游戏从全屏缩小后继续恢复全屏,会有一小段时间的卡死状态,而且某些游戏缩小后就没有了背景音乐。这两点很好解释,其实游戏缩小时,已经将不需要执行的代码换出到硬盘空间中了,所以有些游戏缩小后听不见背景音乐;而重新恢复到游戏状态时,需要将那些换出的代码再次装入内存,前面说了,CPU和硬盘交互是很慢的,便出现了暂时性的缓慢状态。我们可以做个实验来观察一下Windows的这个机制。我以写本稿的WORD为例,在缩小前,它的内存占用约47M,如图1: 图1 我将WORD缩小后,再观察它的内存大小,如图2,一下就变来只有1M多了: 图2 其余的哪里去了?便正是交换到硬盘空间里了。这便是程序的后台运行。 所以,我们可以得出这样的结论,减少程序内存占用的大小,可以让它把不必要的代码交换到硬盘空间里,只将运行该程序的关键代码留在内存中,但是一旦程序激活,它们又将会换入内存。而SetProcessWorkingSetSize()函数正是这样的功能,应该明白了“设置进程的最大最小工作空间”这句话了吧?就是设置进程占用内存的空间大小。 这个函数的原型如下,以下涉及到写代码部分,倘若看不懂,可以略过代码,我会写下思路。 BOOL SetProcessWorkingSetSize( HANDLE hProcess, SIZE_T dwMinimumWorkingSetSize, SIZE_T dwMaximumWorkingSetSize ); 一个个来解释参数,第一个参数hProcess,它的类型是HANDLE,即指定一个进程的句柄;第二个参数dwMinimumWorkingSetSize和第三个参数dwMaximumWorkingSetSize分别是设置程序运行空间的最小和最大空间。我们再仔细看MSDN,有这样一句话“If both dwMinimumWorkingSetSize and dwMaximumWorkingSetSize have the value (SIZE_T)–1, the function removes as many pages as possible from the working set of the specified process.”,大概中文意思是如果将dwMinimumWorkingSetSize和dwMaximumWorkingSetSize设置成-1,就保留必要的一部分代码,其余的交换出去。这正是我们需要的。 了解了这个函数后,我们来编写一个程序,程序的功能就是将指定进程的内存释放出去。代码如下: #include stdio.h #include windows.h #include tlhelp32.h ////////////////////////////////////////////////////////////////////// /////by : 乱雪 /////email: lx#shellcodes.org /

文档评论(0)

xcs88858 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档