| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1597 人关注过本帖
标题:[求助]内存整理软件开发[求助]
只看楼主 加入收藏
达雅
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2006-10-6
收藏
 问题点数:0 回复次数:12 
[求助]内存整理软件开发[求助]
我想做个内存整理软件但有不知从何下手
请各位帮我想想如何制作才能作出一个好的内存整理软件来
给出个思路来,最好给段代码让我试试
大家都帮帮忙拉~~~~
搜索更多相关主题的帖子: 内存 软件开发 
2006-10-06 01:02
ChenMo
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:3
帖 子:481
专家分:10
注 册:2004-4-8
收藏
得分:0 
在 DOS 平台下,使用Turbo C 2.0 普通的堆内存分配函数是不可能的,如 malloc,因为这些函数最大只能分配 64KB 减一个字节(65535 字节)的动态内存。

你不妨尝试一下用远堆分配函数 farcalloc()/farmalloc() 申请一块跟你物理内存大小差不多的空间,
然后立即使用 farfree() 函数释放它,DOS(或控制台)下没试过,估计是不行的,因为DOS下没有虚拟内存这概念。

其实Windows 的内存整理的原理倒是很简单,
写一个程序,向操作系统申请一块大得比较夸张的内存空间,如 248MB,
系统觉得大得无法接受的地步,纯粹是糊弄它(你要那么大干什么),
但是Windows自己放出话来,说每个程序可以使用 4GB 内存,更夸张,
除掉其中 2GB 自己留着用,
还有2GB,这对于 248MB 来说是小巫见大巫,
但是堆内存肯定有被使用过,如当前的程序,
剩下的并没有那么多,左拼右拼也拼不出那么大块给你,
但是分配那么大块可能急着用,
它就硬着头皮将其他程序占用的堆内存全部搬到虚拟内存,
硬生生地、勉强地给你一块大大块的;
这时候你将得手的内存马上释放掉,那么这 248MB 就干净得很。

不过这方法可能不是最好的,因为 Windows 将数据转移到虚拟内存中去,可能把你写的程序也拉过去了。

[此贴子已经被作者于2006-10-7 7:35:16编辑过]


欢迎加入 MVC 技术讨论群(新群:90093426)
2006-10-06 06:06
woodhead
Rank: 3Rank: 3
等 级:新手上路
威 望:9
帖 子:1124
专家分:0
注 册:2005-7-18
收藏
得分:0 
化而为鸟,其名为鹏。呵呵,题外话。

分页式的存储,内存整理似乎没太大的必要。而在程序装载时进行静态地址绑定的段式存储,又不好移动。我这么理解的

2006-10-06 10:51
达雅
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2006-10-6
收藏
得分:0 
谁有内存整理软件原代码发个来给我
谁有呀

http://minic. 神秘花园 - 力争做到世界顶尖灵异网站
2006-10-06 15:21
mp3aaa
Rank: 5Rank: 5
等 级:贵宾
威 望:17
帖 子:2013
专家分:8
注 册:2006-2-15
收藏
得分:0 
着玩意 弄不好回出事的 。第一次调试程序最好在别人的机器上

羊肉串 葡萄干 哈密瓜!!
2006-10-06 20:07
ChenMo
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:3
帖 子:481
专家分:10
注 册:2004-4-8
收藏
得分:0 
以下是引用woodhead在2006-10-6 10:51:58的发言:
化而为鸟,其名为鹏。呵呵,题外话。

分页式的存储,内存整理似乎没太大的必要。而在程序装载时进行静态地址绑定的段式存储,又不好移动。我这么理解的

作用确实不见得有多大,而且说不好会影响系统性能。
因为这样被迫系统对内存数据进行“大迁徙”也不见得是件好事。


欢迎加入 MVC 技术讨论群(新群:90093426)
2006-10-07 06:48
ChenMo
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:3
帖 子:481
专家分:10
注 册:2004-4-8
收藏
得分:0 
以下是引用mp3aaa在2006-10-6 20:07:48的发言:
着玩意 弄不好回出事的 。第一次调试程序最好在别人的机器上

A:假如你长了一个肿瘤,你希望它长在那里?
B:别人身上


欢迎加入 MVC 技术讨论群(新群:90093426)
2006-10-07 06:50
ChenMo
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:3
帖 子:481
专家分:10
注 册:2004-4-8
收藏
得分:0 
以下是引用达雅在2006-10-6 15:21:15的发言:
谁有内存整理软件原代码发个来给我
谁有呀

或许你跟一些制作过此类软件的作者索取,可能会得到。
你的内存若有 512MB 或以上的话,基本上用不着内存整理程序。

在 Windows 下实现内存整理的话,首先你至少会一种 Windows 编程工具,Visual C++、Visual Basic、Delphi、Borland C++ Builder 等等,支持使用 Win32 APIs 即可,因为要用到 Win32 APIs。

我用 Visual C++ 写一个给你看看,新建一个 Win32 Application 工程和一份 C 源程序,名字自定。
加入以下代码:

#include "windows.h"

#define pHEAP_BUF_MAX 253952 // 堆指针数组的大小

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd )
{
HANDLE hHeap;
PVOID TBuf[pHEAP_BUF_MAX]; // 要多少个倒是由你自己来定,似乎你的内存有多大
int T;

MessageBox(NULL,TEXT("按[确定]按钮后开始分配堆。"),TEXT("分配堆"),MB_OK);
hHeap = HeapCreate(0, 4096,0); // 创建堆

for(T=0; T<pHEAP_BUF_MAX; T++) // 分配堆,分配出的空间总计大约是 1000MB
TBuf[T] = HeapAlloc(hHeap, 0, 4096);

MessageBox(NULL, TEXT("分配完成,按[确定]开始释放堆。"), TEXT("释放堆"),MB_OK);
for(T=0; T<pHEAP_BUF_MAX; T++)
if(TBuf[T] != NULL)
HeapFree(hHeap, 0, TBuf[T]);

HeapDestroy(hHeap);
MessageBox(NULL, TEXT("释放完成!"),TEXT("完成"), MB_OK);

return 0;
}

若你将 pHEAP_BUF_MAX 设置一个很大的数,那可能会导致系统发出虚拟内存错误报告,
然而这也刚好证明了它将数据迁移到虚拟内存中去。

在调试这个程序时,你不妨打开[任务管理器] -> [性能]页 来查看一下当前程序执行后对系统的影响。


欢迎加入 MVC 技术讨论群(新群:90093426)
2006-10-07 07:09
ChenMo
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:3
帖 子:481
专家分:10
注 册:2004-4-8
收藏
得分:0 
整理后效果如何要似乎使用前有多少程序在使用,整理内存中的碎片可能非常少,也可能非常多。
在调试前先记下当前内存使用的值,使用后以方便对比一下,
无论如何应该会比使用前的内存占用值少,因为内存中的碎片或多或少总是存在的。

分配好内存后记住必须释放,否则会造成内存泄露,所谓内存泄露简单点说就是分配的内存在使用后没有被释放,此时若向该堆读取/写入数据,则系统会给出一个你可能见过的警告:0xXXXXXXXX 地址不能为 read/write。

内存整理程序一般不这样写,虽然内存整理的原理大致认为是先将物理内存中的数据迁移到虚拟内存,以腾出物理内存空间,然后释放它那么内存中的碎片中会因此而被清除。
但是这样做不好的地方是会对系统性能有影响,你试一下便知道了。

可能更好的做法(如果你看见系统的内存占用非常高而不高兴的话)是使用 SetProcessWorkingSetSize 函数来指定除了系统进程外(因为权限不允许)的其他进程所使用的物理内存的大小,以此来减少物理内存的使用,对比前一个方法,这个方法起码循环的次数会少得多,也就是说比前一个方法快得多,或许也好用得多。

[此贴子已经被作者于2006-10-7 7:30:11编辑过]


欢迎加入 MVC 技术讨论群(新群:90093426)
2006-10-07 07:22
SteVeb
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2006-10-6
收藏
得分:0 
长见识了。
2006-10-07 08:27
快速回复:[求助]内存整理软件开发[求助]
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.024785 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved