记得我的笔记本上曾经安装了一款名为内存整理大师的软件,当时觉得挺好用而且挺NB的,就是导致开机启动有点慢。

当时我就在想,内存整理是怎么实现的?不过那是水平实在是不怎么样,估计连windows程序的消息概念都不清楚吧。所以虽然不明白原因,但是觉得,很NB。

今天看到网上有关于EmptyWorkingSet函数的介绍,然后就看了下。看那几个函数的调用,不是很明白,所以直接去MSDN查看函数原型以及介绍。

看明白了那两个函数,就突然觉得,实现内存整理太简单了……

首先摆出来几个API函数,分别是:

EnumProcess http://msdn.microsoft.com/en-us/library/windows/desktop/ms682629(v=vs.85).aspx

OpenProcess http://msdn.microsoft.com/en-us/library/windows/desktop/ms684320(v=vs.85).aspx

SetProcessWorkingSetSize http://msdn.microsoft.com/en-us/library/windows/desktop/ms686234(v=vs.85).aspx

EmptyWorkingSet http://msdn.microsoft.com/en-us/library/windows/desktop/ms682606(v=vs.85).aspx

看原型,点连接……

其中第一个函数的作用,就是枚举全部的运行中进程,将其所有的进程ID放入到一个数组中。

第二个函数的作用,是根据进城ID获取到进程句柄。这里需要提一点的就是,在其flag标志位中需要特别设置

第三个函数的作用,设置此进程的工作集大小。

第四个函数的作用,清理指定进程工作集中未使用的页。

这里涉及一个概念,就是工作集。什么是工作集呢?其实最简单的理解,就是进程一映射到物理内存的部分。

这个概念的出现,是因为如果把一个进程的全部代码和资源都映射到内存中,必然存在很大的浪费,毕竟一个程序的执行代码使用率不是均等的。把使用率高的代码和资源映射到内存,把使用率低的代码调到虚拟从内存中显然是很明智的选择。我就理解到这啦,如果理解有误,欢迎更正。

所以步骤如下:

1调用 EnumProcess 函数获取进程ID列表

2做一个循环,对其进行如下访问:

2.1调用OpenProcess函数以PROCESS_SET_QUOTA权限打开进程句柄。

2.2调用SetProcessWorkingSetSize函数来对指定进程的工作集进行紧缩,后两个参数只均为-1,尽可能空余出来未使用的页(page)。

2.3调用EmptyWorkingSet函数来清除进程中未使用的页

2.4关闭句柄

3 完成

简单的很是吧?没错,就是这么简单。

所以现在对于当时的那个什么内存管理大师特别不屑一顾,还好意思说大师……那可真是遍地都是大师了。

运行效果如下:

整理前:

整理后:

简单整理一下代码,贴下来如下:

 #include <windows.h>
#include <iostream>
#include <cstdlib>
#include <Psapi.h>
#include <TlHelp32.h>
#include <assert.h>
#pragma comment(lib, "Iphlpapi")
#pragma comment(lib, "Psapi") int _tmain(int argc, _TCHAR* argv[])
{
DWORD pdwPIDArray[];
TCHAR StrBuf[];
DWORD dwPIDArraySize;
EnumProcesses(pdwPIDArray, , &dwPIDArraySize);
for(int i = ; i < dwPIDArraySize; ++ i)
{
HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_READ|PROCESS_SET_QUOTA, , pdwPIDArray[i]);
SetProcessWorkingSetSize(hProcess, -, -);
EmptyWorkingSet(hProcess);
CloseHandle(hProcess);
}
system("pause");
return ;
}

Win API 内存整理的更多相关文章

  1. 文件操作(CRT、C++、WIN API、MFC)

    一.使用CRT函数文件操作 二.使用标准C++库 std::fstream std::string 1)std::string对象内部存储了一个C的字符串,以'\0'结尾的. 2)std::strin ...

  2. 如何使用google地图的api(整理)

    如何使用google地图的api(整理) 一.总结 一句话总结:直接用script标签引google地图api即可. 1.如何使用google地图的api? 页面引用javascript文件<s ...

  3. 【百度地图API】多家地图API内存消耗对比测验(带源码)

    原文:[百度地图API]多家地图API内存消耗对比测验(带源码) 任务描述: 啊,美妙的春节结束了.酸奶小妹和妈妈的山西平遥之旅也宣告成功!距离平遥古城7km,有一个同样身为“世界文化遗产”的寺庙,叫 ...

  4. C#用WebBrowser与WIN API辅助模拟获取网站完整Cookie

    网上找到的可以完整获取Cookie的方法,转载一下希望能帮助更多人. 亲测可用 在Winform中使用WebBrowser控件获取网站的Cookie有时候是不完整的,默认调用Document.Cook ...

  5. 各类无次数限制的免费API接口整理

    各类无次数限制的免费API接口整理,主要是聚合数据上和API Store上的一些,还有一些其他的. 聚合数据提供30大类,160种以上基础数据API服务,国内最大的基础数据API服务,下面就罗列一些免 ...

  6. 黑客编程教程(二)Win API编程简介

    第二节 Win API编程简介 下面介绍一下WIN API. 我们需要自己编写一个工具时,必然会用到很多操作windows和控制windows的函数,这些函数就是windows API. API是Ap ...

  7. C# 调用win api获取chrome浏览器中地址

    //FindWindow 查找窗口 //FindWindowEx查找子窗口 //EnumWindows列举屏幕上的所有顶层窗口,如果回调函数成功则返回非零,失败则返回零 //GetWindowText ...

  8. Win API:之GetCurrentThread、GetCurrentThreadId、GetCurrentProcess、GetCurrentProcessId

    Win API:之GetCurrentThread.GetCurrentThreadId.GetCurrentProcess.GetCurrentProcessId {返回当前线程的虚拟句柄} Get ...

  9. 网络免费API接口整理

    转载自: https://www.cnblogs.com/doit8791/p/9351629.html 从网上看到一些免费API接口,在个人开发小程序等应用练手时可试用. 各类无次数限制的免费API ...

随机推荐

  1. 修改placeholder文字颜色

    .area_ipt ::-webkit-input-placeholder { /* WebKit browsers */ color:#258aca; } .area_ipt :-moz-place ...

  2. submit和button的区别

    两者主要区别在于:submit可以提交表单(form),而button如果不指定onclick等事件处理函数,它是不做任何事情的.注意哦,在页面上<input type="submit ...

  3. Oracle创建表时涉及的参数解析

    1.oracle pctfree和pctused详解   http://www.cnblogs.com/linjiqin/archive/2012/01/16/2323320.html http:// ...

  4. Javascript使用function创建类的两种方法

    1.使用function类 //myFunction.js var CMyFunc=function() { //类的公共方法,供外部调用 this.Func1=function() { var i= ...

  5. 【BZOJ】【1037】【ZJOI2008】生日聚会party

    DP orz iwtwiioi 这种题居然是DP……原来统计方案数是可以用动态规划来做的啊= =用一些变量来维护一些信息,保证方案可行性/合法性 人太弱实在是有些忧伤…… /************* ...

  6. Leetcode#59 Spiral Matrix II

    原题地址 相比于Spiral Matrix(参见这篇文章)要简单一些,因为是方阵,所以代码简洁一些. 注意当n是奇数的时候,中心小块要单独赋值(代码21行) 代码: vector<vector& ...

  7. PHP操作数据库类

    <?php /** * 功能: 数据库操作类 . * 作者: 赵铭哲 * 日期: 2016-05-23 * 时间: 9:43 */ namespace ZH\DataBase; use \Exc ...

  8. Codeforces Round #266 (Div. 2) D

    D. Increase Sequence time limit per test 1 second memory limit per test 256 megabytes input standard ...

  9. geotools解析SLD中的elsefilter为什么里面的filter无效

    原因是在org.geotools.renderer.lite.StreamingRenderer中的process函数: /** * @param rf * @param feature * @par ...

  10. vi/vim使用指北 ---- Learning the vi and Vim Editors 读书 笔记

    vi/vim作为liux系统下最强大,最流行的文本编辑器之一.边看<Learning the vi and vim Editor>边学习vim,顺便做写简单的笔记,供以后查询. 没看这本书 ...