`
leavingme
  • 浏览: 25754 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

软件也忽悠人--揭穿号称内存占用极低的软件的诡计

阅读更多

软件也忽悠人--揭穿号称内存占用极低的软件的诡计

我实在不愿意提起这个话题.后来在网上看到几篇文章,深深感觉到,已经有程序员站出来,揭穿这个忽悠了千百万用户的诡计了...
附2篇文章的地址:
http://blog.csdn.net/biku/archive/2006/07/06/886038.aspx
http://blog.csdn.net/zlt982001/archive/2005/08/28/466879.aspx
我这篇文章无非是归纳了几篇文章的内容,并深入的阐明恶意使用该技术带来的坏处.
请一味追求低内存软件的用户们注意了:什么才应该是选择软件的主要因素.

物理内存和虚拟内存

物理内存,在应用中,自然是顾名思义,物理上,真实的插在板子上的内存是多大就是多大了.看机器配置的时候,看的就是这个物理内存.

如果执行的程序很大或很多,就会导致物理内存消耗殆尽.为了解决这个问题,Windows中运用了虚拟内存技术,即拿出一部分硬盘空间来充当内存使用,当内存占用完时,电脑就会自动调用硬盘来充当内存,以缓解内存的紧张.

一个程序,不可避免地要用到虚拟内存,因为不频繁执行或者已经很久没有执行的代码,没有必要留在物理内存中,只会造成浪费;放在虚拟内存中,等执行这部分代码的时候,再调出来.
Windows 的任务管理器可以帮助我们看到进程的虚拟内存.调出任务管理器,点击菜单“查看”-“选择列”,在出现的窗口中,钩上“虚拟内存大小”,如图1:

 


点“确定”,这个时候,进程列表中已经显示各进程的虚拟内存大小,如图2:

 


一个程序到底应该使用多少虚拟内存呢?不一定,但是应该以恰到好处的符合虚拟内存原本作用为最好.
下面将揭穿表面看起来调用了大量图片、大量运行库的程序,为什么才“占用”不到 1 MB 的内存的诡计.

原来是 SetProcessWorkingSetSize 函数

MSDN 对该函数的表述(翻译):使用这个函数来设置应用程序最小和最大的运行空间,只会保留需要的内存.当应用程序被闲置或系统内存太低时,操作系统会自动调用这个机制来设置应用程序的内存.应用程序也可以使用 VirtualLock 来锁住一定范围的内存不被系统释放;当你加大运行空间给应用程序,你能够得到的物理内存取决于系统,这会造成其他应用程序降低性能或系统总体降低性能,这也可能导致请求物理内存的操作失败,例如:建立 进程,线程,内核池,就必须小心的使用该函数.

也就是说,该函数不是节省内存,而是强制把进程的物理内存搬到虚拟内存中.

另外有一些资料上说,该函数“将有可能导致缺页中断,严重影响性能”.
函数原型:
BOOL SetProcessWorkingSetSize(
HANDLE hProcess,
SIZE_T dwMinimumWorkingSetSize,
SIZE_T dwMaximumWorkingSetSize
);
我们用 VB 来做这么一个简单的例子,是程序占用 300 KB 内存吧.

建立一个标准的 VB 工程,在 Form1 中放置一个 Timer1 ,把 Interval 属性设置为 1000 (即 1 秒).然后在代码编辑框中输入以下代码:

Private Declare Function SetProcessWorkingSetSize Lib "kernel32" (ByVal hProcess As Long, ByVal dwMinimumWorkingSetSize As Long, ByVal dwMaximumWorkingSetSize As Long) As Long
Private Declare Function GetCurrentProcess Lib "kernel32" () As Long
Private Sub Timer1_Timer()
SetProcessWorkingSetSize GetCurrentProcess(), 50000, 100000
End Sub
然后生成 工程1.exe,执行,调出任务管理器查看,发现内存占用才 320 KB.如果把定时器关闭,这进程的内存一般 4 MB左右.
必须定时执行该函数,否则虚拟内存会慢慢被调出来,恢复原来的内存大小.
如果要使一个本来需要占用大量内存的程序减低到几百 KB ,使用同样的方法即可.

诡计带来的危害

如果 SetProcessWorkingSetSize 函数被正常使用,是非常有用处的.但是为了蒙骗用户的眼睛,每秒,甚至几十毫秒就把大量内存往虚拟内存里面压,就会带来无可预计的危害.看看这篇文章怎么说:“因为他只是暂时的将应用程序占用的内存移至虚拟内存,一旦,应用程序被激活或者有操作请求时,这些内存又会被重新占用.如果你强制使用该方法来设置程序占用的内存,那么可能在一定程度上反而会降低系统性能,因为系统需要频繁的进行内存和硬盘间的页面交换.”.

没错,如果你使用了这类软件,意味着你的硬盘将每秒将 I/O 大量数据;硬盘的磁针将拼命旋转...(当然硬盘磁针不可能不旋转^_^,只是选择得更厉害而已).

不是说 BT 很伤内存吗?不然,因为现在大多 BT 软件都有缓存技术.且看 Bitcomet 官方对缓存技术的说明:“传统BT高速下载时硬盘会响得很厉害,这是大量的随机读取造成的.... BitComet可以由用户设置缓存大小.... 可以明显地看出牺牲一小部分内存作缓存对硬盘的保护作用.”

是不是有种心寒的感觉?一类软件宁愿牺牲内存,也要减少保护硬盘;而另外一类软件,却为了欺骗用户,让CPU、硬盘更加奔波......

抓一个凶手

这类软件不少,我以其中一个桌面工具为例,揭穿它的假面具(不点名字了).运行该软件后,随意操作一下,然后打开进程管理器,把虚拟内存列调出来,找到该进程,如图3:

OK,20 MB 虚拟内存,而只有 632 KB 物理内存.细心的你会发现,大概每 1 秒,该行都有闪烁的感觉,没错,这正是每秒调用 SetProcessWorkingSetSize 的结果.另外,我们打开 Norton Process Viewer ,查看该进程的 CPU 占用情况,如图4:


可以看到,就算没有操作该软件,但是每秒,都有 3% 的CPU占用起伏(虽然这并不能说明什么).另外,内存框中可以看到物理内存和虚拟内存的占用,两者相去甚远.此外,可以用 Hook API 技术来证明每秒调用 SetProcessWorkingSetSize 的行为.

应该怎么做

这篇文章只想让用户了解软件占用资源的实际.而程序员应该把下功夫,真正从代码中减少内存的消耗,而不是一味忽悠用户.调用 SetProcessWorkingSetSize 会带来某些好处,但是何时调用、如何调用应该符合两个要求:
1,在程序暂时不被使用的时候(例如最小化);
2,物理内存和虚拟内存应处于一个合适的比例(而不是 600 KB 比 20 MB 这么荒唐);
3,或者不调用,让 Windows 去处理.
(本人技术有限,对于文中的错误恳请高手给予指正) 
 



陈源 2006-11-09 17:42 发表评论
分享到:
评论

相关推荐

    认清内存治理机制,揭穿内存优化工具的骗局.pdf

    "认清内存治理机制,揭穿内存优化工具的骗局"这一主题旨在揭示一些所谓的内存优化工具可能带来的误导和潜在危害。 首先,内存优化工具通常会展示一个用户界面,显示当前的可用内存、阈值和优化效果。它们承诺通过...

    立井“疏-堵-固”快速揭穿突出煤层综合施工技术

    结合首山一矿立井揭煤实际情况,提出了"疏-堵-固"快速揭煤综合施工技术,即:在井筒布置6圈钻孔和1个中心孔,孔底间距3m,控制井筒掘进断面轮廓线外12m区域范围内戊9-10煤层。采用煤岩体钻孔封孔剂把第1圈钻孔和中心孔封...

    揭穿5个忽悠人的Wi-Fi安全谣言

    Wi-Fi网络早已十分普及,所以也出现了很多貌似可以保障无线网络安全的各种所谓绝招或方法。在网上搜索一下就能发现好多早已过时,而且根本不安全的所谓谣传或者谣言。这些谬种流传的所谓的Wi-Fi安全技术早已过时而且...

    Math---Flat-Earth-Debunked---Accelerating-at-9.8-m-sec:数学-揭穿地球平面图-以9.8 m,sec的速度加速

    重力加速度9.8 m/s²是我们熟知的自由落体加速度,也称为标准重力。这个值是在地球表面附近测量的,根据万有引力定律,它是由地球的质量和距离地心的距离决定的。如果地球是平坦的,那么这个重力加速度将不会在所有...

    揭穿GPT-5谣言,OpenAI将重点转移到改进现有模型上

    那些期待GPT-5发布的人可能要等待很长时间。OpenAI首席执行官Sam Altman表示,目前开发比GPT-4等更大人工智能模型的趋势可能很快就会结束。 本月早些时候,他在麻省理工学院的一次电话会议上表示:“我认为我们正...

    立井揭穿突出厚煤层若干问题的探讨

    以东大煤矿回风立井揭穿突出厚煤层为工程实例,对揭煤期间的若干关键问题进行了探讨。通过东大矿的成功实施,总结出一种简单有效的下向钻孔瓦斯压力测定方法,并形成了一套井筒揭穿突出厚煤层期间的区域措施及效检、...

    立井揭穿突出煤层安全岩柱最小厚度的确定

    针对目前立井揭穿突出煤层安全岩柱厚度仅靠经验确定的情况,从岩石力学角度出发,采用数值模拟计算的方法,对潘三矿深部进风井揭穿11-2突出煤层时预留厚度分别为5m,3m,2m,1.5m的岩柱进行研究,研究结果直观形象地展现了...

    小学数学数学故事阿凡提揭穿巴依老爷

    小学数学数学故事阿凡提揭穿巴依老爷 在这个故事中,我们可以看到阿凡提如何使用数学知识揭穿巴依老爷的骗局。故事中涉及到的数学概念包括: 1. 分数运算:阿凡提计算公鸡和母鸡的价格时,使用了分数运算,例如「...

    揭穿网络兼职骗局黑幕.doc

    揭穿网络兼职骗局黑幕.doc

    石门揭穿极软煤层超前板棚支护工艺的应用

    福泉煤矿3#煤层极其松软,在石门揭煤过程中频繁发生片帮、漏顶,甚至导致回风瓦斯超限和诱发煤与瓦斯突出,针对这一问题通过现场工程地质调查及理论分析,明确了其破坏机理和诱发突出的主要因素,提出超前板棚支护工艺。...

    小学数学数学神探揭穿女贼的谎言

    标题中的“小学数学数学神探揭穿女贼的谎言”暗示了一个涉及数学推理的问题,而实际内容则是一个逻辑推理的谜题。这个谜题利用了一些文化背景和日常知识来设置陷阱,挑战解决者的观察力和逻辑思维能力。 描述中提到...

    小学数学数学神探揭穿慌言

    《小学数学数学神探揭穿慌言》这篇文章虽然标题中提到了“数学神探”,但实际上,这个故事更多地涉及到逻辑推理和生活常识,而非纯数学知识。然而,我们可以从中提炼出一些与数学思维相关的知识点,并扩展到教育和...

    二妹三妹对比揭穿您

    二妹三妹对比,揭露您的性格。这是一个测试您具有什么性格的小软件。

    江苏省涟水县红日中学七年级语文上册 25 皇帝的新装学案2(无答案)(新版)苏教版.doc

    这篇课文是丹麦作家安徒生的经典童话,通过讲述一个皇帝被两个骗子欺骗,声称他们能织出只有聪明人才看得见的布料,最终在游行中被一个小孩揭穿骗局的故事,揭示了人性中的虚荣、欺骗和盲目跟风。 知识点详解: 1....

    hierarchical-free-monads-the-most-developed-approach-in-haskell:有关Hierarchical Free Monads的大型文章,这是在Haskell中构建真实软件的最先进方法

    分层免费Monads:Haskell... 本文不适用于有强烈见解的经验丰富的散客,也不适合那些认为软件工程本质上是不好的人。 他们可能会发现我夸张和夸张了太多,但这只是我感觉的最好例证。目录资源管理可测性表现结论告别词

    揭穿人工智能军备竞赛理论(英).pdf

    揭穿人工智能军备竞赛理论(英).pdf

    发耳隧道揭穿突出煤层施工技术

    【发耳隧道揭穿突出煤层施工技术】是针对贵州省水盘高速公路发耳隧道建设中遇到的煤与瓦斯突出问题而采取的一种安全施工方法。隧道全长约2公里,穿越了17层煤层,其中5号煤层具有显著的突出危险性。施工过程中,遵循...

    石门揭穿特厚强突软煤层综合防突技术

    淮北青东煤矿-565m东翼回风石门施工中需穿过8号突出...穿煤段采用全断面密集U型钢支架、双层超前花管金属骨架等支护,并利用骨架管壁孔注浆来直接固化煤层,形成复合式立体帷幕支护,安全快速地揭穿了该特厚强突软煤层。

    网络安全小知识(1).doc

    网络安全是当今数字化时代每个人都需要关注的重要议题,保护个人和组织的信息安全显得至关重要。以下是对文档中提到的网络安全小知识的详细解释和扩展: 1. **防病毒与木马**: - 安装并定期更新杀毒软件,这是...

Global site tag (gtag.js) - Google Analytics