记得我的笔记本上曾经安装了一款名为内存整理大师的软件,当时觉得挺好用而且挺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. python 解析web接口的json数据

    实例1-使用urllib2 #utf-8 import urllib2 import json url="http://xxx.com" #获取json格式的字符串 page=ur ...

  2. 在ubuntu上搭建reviewboard

    review board 2.0.5 ubuntu ubuntu-12.04.1-desktop-amd64 基本上基于这个教程:http://alephnullplex.appspot.com/bl ...

  3. 02.Apache FtpServer使用数据库管理用户

    1.创建数据库及表 使用\apache-ftpserver-1.0.6\res\ftp-db.sql建表,内容如下: CREATE TABLE FTP_USER ( userid VARCHAR(64 ...

  4. BZOJ1565 植物大战僵尸

    AC通道:http://www.lydsy.com/JudgeOnline/problem.php?id=1565 这题看上去并不会做,结果又是最大权闭合子图的裸题. 于是就去看了一发论文,明白建图的 ...

  5. 图片放大镜插件 Cloud Zoom v3.1

    Cloud Zoom是一个图像放大jQuery插件,效果堪比Magic Zoom.相对于流行jQZoom插件,Cloud Zoom体积小,有更多的功能和更强大的跨浏览器兼容性. 猛击这里查看演示DEM ...

  6. 贴代码—CF230 DIV1 B

    题目在此: http://codeforces.com/contest/392/problem/B 一直理解错了一句话,以为是用最小的move求最小的花费, 读错题目的有木有!!! 不懂汉诺塔的原理有 ...

  7. Oracle自带的用户

    Oracle安装完毕创建数据库实例的时候,会自动生成三个用户sys,system,scott. sys用户是超级管理员,具有最高权限,充当sysdba角色,可以执行create database,默认 ...

  8. 斌哥的 Docker 进阶指南—监控方案的实现

    过去的一年中,关于 Docker 的话题从未断过,而如今,从尝试 Docker 到最终决定使用 Docker 的转化率依然在逐步升高,关于 Docker 的讨论更是有增无减.另一方面,大家的注意力也渐 ...

  9. javascript 注意事项

    1.submit input 标签的 type里的submit是提交表单的按钮 提交时应注意 为 标签加上 “name=""”字段和form标签,才能达到想要的效果  2.正则表达 ...

  10. HDU 2159 FATE (二维完全背包

    FATE http://acm.hdu.edu.cn/showproblem.php?pid=2159 Problem Description 最近xhd正在玩一款叫做FATE的游戏,为了得到极品装备 ...