軟體也忽悠人 揭穿號稱記憶體占用極低的軟體的詭計

2022-03-25 05:47:13 字數 2918 閱讀 8145

軟體也忽悠人--揭穿號稱記憶體占用極低的軟體的詭計

我這篇文章無非是歸納了幾篇文章的內容,並深入的闡明惡意使用該技術帶來的壞處.

請一味追求低記憶體軟體的使用者們注意了:什麼才應該是選擇軟體的主要因素.

物理記憶體和虛擬記憶體

物理記憶體,在應用中,自然是顧名思義,物理上,真實的插在板子上的記憶體是多大就是多大了.看機器配置的時候,看的就是這個物理記憶體.

如果執行的程式很大或很多,就會導致物理記憶體消耗殆盡.為了解決這個問題,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 大量資料;硬碟的磁針將拼命旋轉...(當然硬碟磁針不可能不旋轉^_^,只是選擇得更厲害而已).

是不是有種心寒的感覺?一類軟體寧願犧牲記憶體,也要減少保護硬碟;而另外一類軟體,卻為了欺騙使用者,讓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 去處理.

(本人技術有限,對於文中的錯誤懇請高手給予指正) 

神經網路從被人忽悠到忽悠人 三

在上一章,講過bp神經網路雖然取得了很大的進步,但它本身存在著一些無法避免的問題,其中乙個比較困惑的應該是區域性最優解問題。只接觸那些你已經喜歡的東西是有風險的,即你可能會捲入乙個以自我為中心的漩渦,從而對任何與你的標準存在細微差異的事情都視而不見,即使你原本會喜歡它。這種現象被稱為 過濾器泡沫 f...

內外忽悠,軟體業能怎樣發展?

近幾年,中國軟體很大的發展都將外包作為重點扶植物件,外包似乎很火熱。外包火熱,說明了自己不做產品,自己為什麼不做產品,是因為做不出來,或者說做出來沒有市場。外包越是發展,說明自己的核心技術都沒有,那還有什麼可以慶幸的呢?中國軟體沒有多少能經得起國際市場的篩選,從pdm plm來說,都是以ug,ora...

也談軟體測試地位

如果從理論,也就是講道理的角度去說服他人要重視測試 提高測試的地位,這純屬於扯淡的行徑,不要對這種做法抱希望。理由 1 測試本身不創造直接利潤。當然除了銷售直接創造利潤外,其它崗位都是消費崗。2 個人理解測試本身屬於支撐 服務角色 測試階段起主導作用 相對於開發人員直接 創造 了軟體來講,測試是默默...