




已阅读5页,还剩1页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
从内存释放软件的原理到虚拟内存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 #include #include /by : 乱雪/email: lx#/功能:SetProcessWorkingSetSize函数演示/int main()/定义一个PROCESSENTRY3结构体,并填充结构的大小 PROCESSENTRY32 pentry = sizeof(pentry); /用CreateToolhelp32Snapshot建立一个进程快照 HANDLE hPSnap =CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); /得到首个进程 BOOL bMore = Process32First(hPSnap,&pentry); /循环搜索所有进程,找到WINWORD.exe这个进程 while(bMore) if(strcmp(WINWORD.EXE,pentry.szExeFile) = 0) /如果找到,就用OpenProcess获得它的句柄 /根据MSDN对SetProcessWorkingSetSize的描述,进程必须有PROCESS_SET_QUOTA权限 HANDLE hProcess = OpenProcess(PROCESS_SET_QUOTA, FALSE, pentry.th32ProcessID); /hProcess不为空就表明获得了句柄值 if(hProcess != NULL) /调用SetProcessWorkingSetSize函数 SetProcessWorkingSetSize(hProcess, -1, -1);CloseHandle(hProcess); else break; bMore = Process32Next(hPSnap,&pentry); /获得下一个进程 CloseHandle(hPSnap); /关闭句柄 return 0;以上代码在VC6.0编译通过。还是以写本稿的WORD进程WINWORD.EXE为例子,编译程序后,我们先看该进程在任务管理器中所显示的内存占用大小,如图3:图3然后运行刚才编译好的程序,内存占用大小瞬间减下去了,如图4:图4这个程序的思路是,首先使用CreateToolhelp32Snapshot函数建立一个进程快照,然后Process32First函数获得第一个进程,接着再用一个循环进行搜索,只要还有进程存在,就一直搜索直到最后一个,每循环一次,就判断当前进程是不是我们需要搜索的那个,如果是,就调用SetProcessWorkingSetSize函数;否则就继续循环到下一个进程。在这里大概讲述了一下虚拟内存的概念,相信大家应该对内存释放软件有了一个大概的了解了,将部分不需要的页面换出去是可以腾出一些内存空间给其他新进程使用,但频繁交换页面,会影响系统速度,因为前面说了,CPU和硬盘之间交互操作是很慢的。并且Windows本身就有了这个功能,当你将应用程序缩小时,已经把部分不重要的代码交换出去,留下关键代码在内存中执行。其实内存管理、进程这些的内容远远不止本文所述,涉及到操作系统原理,较为复
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 线上课程平台建设委托合同
- 零售供应协议
- 基因调控机制分析-洞察及研究
- 九年级物理力的合成与分解教学设计
- 企业互联网营销活动策划与执行方案
- 光催化还原重金属-洞察及研究
- 中考数学模拟试题及专家解析
- 育婴师岗位职责与工作流程表
- 幼儿园家长工作坊组织方案与案例
- 五年级上册科学知识要点重点归纳
- 离子反应课件
- 半导体产业链中的供应链管理与优化
- 联合国经济、社会与文化权利的国际公约
- 混凝土强度评定表(自动计算)
- 北师大版(2019)高中英语选择性必修第二册必背单词表汇编
- 《标书制作流程培训》课件
- 哺乳期乳房内化脓培训演示课件
- 六国化工实习报告
- 医院工作制度 与人员岗位职责
- 新课标高中物理模型与方法专题19 电磁感应中的单导体棒模型(解析版)
- 工程质量检测投标方案(技术标)
评论
0/150
提交评论